0%

【模板】高斯消元法

高斯消元

  • 用于解 $n$ 元 $n$ 次方程组。

算法流程(高斯 - 约旦消元法)

  1. 选择一个尚未被选择过的未知数作为主元,选择一个包含这个主元的方程。
  2. 将这个方程主元的系数化为 $1$ 。
  3. 通过加减消元,消掉其他方程中的这个未知数。
  4. 重复以上步骤,直到把每一行都变成只有一项有系数。

板子

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
const double eps = 1e-9;

double Ans[maxN][maxN];
int N;

inline bool isZero(double A) {
return fabs(A) < eps;
}

inline bool isGre(double A, double B) {
return fabs(A) > fabs(B);
}
inline void Gauss() {
for (int i = 1; i <= N; i++) {
if (Ans[i][i] == 0) { //如果某一项系数为 0 则表示 x 可取任意值
printf("No Solution");
return;
}
int nowLine = i;
for (int j = i + 1; j <= N; j++) {
if (isGre(Ans[j][i], Ans[nowLine][i])) swap(nowLine, j);
}
if (nowLine != i) {
for (int j = 1; j <= N + 1; j++) swap(Ans[i][j], Ans[nowLine][j]);
}
if (isZero(Ans[i][i])) continue;
for (int j = 1; j <= N; j++) {
if (i != j) {
double m = Ans[j][i] / Ans[i][i];
for (int k = i + 1; k <= N + 1; k++) {
Ans[j][k] -= Ans[i][k] * m;
}
}
}
}
for (int i = 1; i <= N; i++) {
Ans[i][N + 1] /= Ans[i][i];
}
}