高斯消元
算法流程(高斯 - 约旦消元法)
- 选择一个尚未被选择过的未知数作为主元,选择一个包含这个主元的方程。
- 将这个方程主元的系数化为 \(1\) 。
- 通过加减消元,消掉其他方程中的这个未知数。
- 重复以上步骤,直到把每一行都变成只有一项有系数。
板子
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];
}
}