高斯消元法

高斯消元法

根据线性代数的知识,我们了解到,方程组的解一共有三种情况:

可以通过其增广矩阵来解方程组:

通过初等变换转换为上三角的形式:

对应增广矩阵为;

高斯消元思路

枚举每一列:

  • 找到绝对值最大的一行
  • 将这一行换到最上面去
  • 将该行的第c个数变成1
  • 用第一行将下面所有行的第c列消成0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int gauss(){
int c,r;
for(c=1,r=1;c<=n;c++){
int t=r;
//第一步找到最大的数
for(int i=r;i<=n;i++)
if(fabs(a[i][c])>fabs(a[t][c]))
t=i;

//第二步符合条件的就交换到第一行
if(fabs(a[t][c])<eps) continue;
for(int i=c;i<=n+1;i++) swap(a[r][i],a[t][i]);

//第三步,逐列单位化
for(int i=n+1;i>=c;i--) a[r][i]/=a[r][c];

//逐行减去
for(int i=r+1;i<=n;i++)
if(fabs(a[i][c])>eps)
for(int j=n+1;j>=c;j--)
a[i][j]-=a[i][c]*a[r][j];
r++;
}
if(r<=n){
for(int i=r;i<=n;i++) //遍历每一行
if(fabs(a[i][n+1])>eps) return 2;
return 1;
}
for(int i=n-1;i>=1;i--) //从最后一行开始
for(int j=i+1;j<=n;j++) //从下一行开始
a[i][n+1]-=a[j][n+1]*a[i][j];
return 0;
}