高斯消元
高斯消元
高斯消元适用于求解线性方程组。
一般的,对于线性方程组: \[ a_{1,1}x_1 + a_{1,2}x_2 + a_{1,3}x_3 + ……a_{1,n}x_n = b_1 \] \[ a_{2,1}x_1 + a_{2,2}x_2 + a_{2,3}x_3 + ……a_{2,n}x_n = b_2 \]
\[ …… \]
\[ a_{n,1}x_1 + a_{n,2}x_2 + a_{n,3}x_3 + ……a_{n,n}x_n = b_n \]
我们用下面这个矩阵来表示这个线性方程组: \[ \left \{ \begin{array}{ccccc|c} a_{1,1} & a_{1,2} & a_{1,3} & \cdots & a_{1,n} & b_1 \\ a_{2,1} & a_{2,2} & a_{2,3} & \cdots & a_{2,n} & b_2 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{n,1} & a_{n,2} & a_{n,3} & \cdots & a_{n,n} & b_n \\ \end{array} \right \} \]
我们循环一个变量\(i\)(从\(1\)到\(n\))
先在矩阵中找到一行(设这行是第\(x\)行),使得\(a_{x,1},a_{x,2},……,a_{x,i-1}\)都为\(0\),但\(a_{x,i} = 0\)。
然后用这一行矩阵,用简单行变换的方式将矩阵其他行的第\(i\)项的系数消为0。
最后我们就得到一个“阶梯矩阵”,然后就可以愉快地求解了。
Code
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
34
35
36
37
38
39
40
41
using namespace std;
const int maxn = 1e3 + 5;
double a[maxn][maxn],b[maxn];
int n;
int main() {
scanf("%d",&n);
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++)
scanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
for (int i=1; i<=n; i++) {
for (int j=i; j<=n; j++)
if (fabs(a[j][i]) > 1e-10) {
for (int k=1; k<=n; k++)
swap(a[i][k],a[j][k]);
swap(b[i],b[j]);
break;
}
for (int j=1; j<=n; j++) {
if (j == i)
continue;
double rate = a[j][i] / a[i][i];
for (int k=1; k<=n; k++)
a[j][k] -= rate * a[i][k];
b[j] -= rate * b[i];
}
}
for (int i=1; i<=n; i++)
printf("x%d = %.2lf\n",i,b[i] / a[i][i]);
return 0;
}