高斯消元

每个方程等号右侧的常数放在最右侧

375471415883988\left | \begin{matrix} 3&7&-5& & & &47 \\ 1 &4 & 1 & & & & 58 \\ 8 & -3 &9&&&&88 \\ \end{matrix} \right |

1005010110019\left | \begin{matrix} 1&0&0& & & &5 \\ 0 &1 & 0 & & & & 11 \\ 0 & 0 &1&&&&9 \\ \end{matrix} \right |

double a[105][105];
double eps = 1e-7;
//高斯消元
void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n + 1; ++j) {
            cin >> a[i][j];
        }
    }
    for (int i = 1; i <= n; ++i) {//枚举列
        int max = i;
        for (int j = i + 1; j <= n; ++j) {//选择该列最大系数,真实目的是选择一个非0系数
            if (fabs(a[j][i]) > fabs(a[max][i]))
                max = j;
        }
        for (int j = 1; j <= n + 1; ++j) {
            swap(a[i][j], a[max][j]);//移到前面
        }
        if (fabs(a[i][i]) < eps) {//对角线上的主元系数等于0,说明没有唯一解
            cout << "No Solution" << endl;
            return;
        }
        for (int j = n + 1; j >= 1; j--) {
            a[i][j] = a[i][j] / a[i][i];//把这一行的主元系数变为1
        }
        for (int j = 1; j <= n; ++j) {//消去主元所在列的其他行的主元
            if (j != i) {
                double temp = a[j][i] / a[i][i];
                for (int k = 1; k <= n + 1; ++k) {
                    a[j][k] -= a[i][k] * temp;
                }
            }
        }
    }
    for (int i = 1; i <= n; ++i) {//最后得到简化阶梯矩阵
        cout << fixed << setprecision(2) << a[i][n + 1] << endl;
    }
}

Last updated