【模板】高斯消元法

高斯消元

  • 用于解 \(n\)\(n\) 次方程组。

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

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

板子

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];
    }
}
posted @ 2022-07-29 18:32  Burnling  阅读(224)  评论(0编辑  收藏  举报