高斯消元
学了几天,不会线代的我终于学会了高斯消元。
其实高斯消元只两步:
第一步:转化为上三角矩阵。通过加减消元实现( 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个等式
别的不说了,直接上板子,遇到题套进去就行了。
高斯消元还能用来解异或方程组,这个坑晚上填。

浙公网安备 33010602011771号