标签:方程 xi Mat int 矩阵 maxx 约旦 元法 高斯
用来求解n元一次线性方程组
核心思想:
把方程组塞到一个矩阵里得到一个\(n*n+1\)的矩阵,第\(i\)行表示第\(i\)个方程,\(Mat[i][j]\)表示第\(i\)个方程中\(xj\)的系数 \(Mat[i][n+1]\)为一个常数,即等号右面的常数
把\(xi\)的系数都集中于第\(i\)行(对角线上),\(xi\)为当前选择的主元,然后用方程\(i\)把其他方程中的\(xi\)都消掉,可得到每行都是\(ki*xi = y\)的矩阵,显然\(xi=y/ki\)
void work(){
n=read();
for(int i=1;i<=n;++i){
for(int j=1;j<=n+1;++j){
Mat[i][j]=read();
}
}
for(int i=1;i<=n;++i){//枚举项xi
double maxx=Mat[i][i];
int tmp=i;
//x1--xi-1 的系数都在方程i上,其他方程该项系数为0,如果用方程1--i-1来消元会引入x1--xi-1,所以从i开始找
for(int j=i+1;j<=n;++j){//选出该列最大系数可以保证误差最小
if(fabs(Mat[j][i])>fabs(maxx)){
maxx=Mat[j][i];tmp=j;
}
}
for(int j=1;j<=n+1;++j){
swap(Mat[i][j],Mat[tmp][j]);//把方程i和方程tmp整个交换,使得系数集中在对角线上
}
if(Mat[i][i]==0){//多解
puts("No Solution");return;
}
//把除了Mat[i][i] 其他方程xi的系数都消掉
for(int j=1;j<=n;++j){
if(j==i)continue;
double x=Mat[j][i]/Mat[i][i];
for(int k=i+1;k<=n+1;++k){
Mat[j][k]-=Mat[i][k]*x;
}
}
}
for(int i=1;i<=n;++i){
double ans=Mat[i][n+1]/Mat[i][i];
printf("%.2lf\n",ans);
}
}
标签:方程,xi,Mat,int,矩阵,maxx,约旦,元法,高斯 来源: https://www.cnblogs.com/Chano/p/16265414.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。