高斯消元
学了几天,不会线代的我终于学会了高斯消元。
其实高斯消元只两步:
第一步:转化为上三角矩阵。通过加减消元实现( i 从 1 到 N 遍历,把第 j (j > i )行的 xi 消掉)
第二步:从底向上代入。
需要注意的是判断多解和无解的情况,还有减小误差的方法。
int gauss(){ int r; for(int i=1;i<=N;i++){ r=i; for(int j=i+1;j<=M;j++) if(fabs(a[j][i])>fabs(a[r][i]))//减小误差 r=j; if(r!=i) for(int j=1;j<=N+1;j++)//错了好多次 swap(a[r][j],a[i][j]); if(r==i&&fabs(a[i][i])<eps) return 2;//多解 for(int j=i+1;j<=M;j++){ for(int k=N+1;k>i;k--) a[j][k]-=(a[j][i]/a[i][i])*a[i][k]; a[j][i]=0; } } for(int i=N;i<=M;i++){ bool flag=0; for(int j=1;j<=N;j++) if(fabs(a[i][j])>eps){ flag=1; break; } if((!flag)&&fabs(a[i][N+1])>eps) return 0;//无解 } for(int i=N;i>=1;i--){ for(int j=i+1;j<=N;j++) a[i][N+1]-=a[i][j]*a[j][N+1]; a[i][N+1]/=a[i][i]; a[i][i]=1; } return 1; }
//N个未知数,M个等式
别的不说了,直接上板子,遇到题套进去就行了。
高斯消元还能用来解异或方程组,这个坑晚上填。