0%

板子 高斯消元

我选择的是简单好写的高斯-约旦消法

1.选择一个尚未被选过的未知数作为主元,选择一个包含这个主元的方程。

2.将这个方程主元的系数化为1。

3.通过加减消元,消掉其它方程中的这个未知数。

4.重复以上步骤,直到把所有式子变成形如: a*1+b*0+c*0……=d

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
inline bool Gauss() {
for (int i = 1; i <= n; ++i) {
// 找到该列的最大值
int mx = i;
for (int j = i + 1; j <= n; ++j)
if (abs(a[j][i]) > abs(a[mx][i]))
mx = j;
if (a[mx][i] == 0)
return false;// 返回无解
// 交换行
for (int j = i; j <= n + 1; ++j)
swap(a[i][j], a[mx][j]);
// 加减消元
for (int j = 1; j <= n; ++j)// 注意是1~n
if (j != i) {
double d = a[j][i] / a[i][i];
for (int k = i + 1; k <= n + 1; ++k)
a[j][k] -= a[i][k] * d;
}
}
return true;
}

输出解

1
2
for (int i = 1; i <= n; ++i)
printf("%.2f\n", a[i][n+1] / a[i][i]);