高斯约旦消元法
作者:互联网
用来求解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