高斯消元

问题

求解线性方程组

算法思想

高斯消元法的实现主要分为两种,一种是普通的高斯消元,将系数矩阵消为上三角矩阵,再一步步回代求出所有未知数;第二种是高斯-约旦消元法,将系数矩阵消为对角矩阵,不需要回代即可直接解出未知数,这里展示第二种做法。

代码实现

例题:P3389 【模板】高斯消元法

#include <bits/stdc++.h>

#define ll long long

using namespace std;

int read() {
    int x = 0, f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
    return x * f;
}

const int N = 110;

int n;
double a[N][N];

int Guass() {
    for (int i = 1; i <= n; i++) {
        int mx = i;
        for (int j = i + 1;j <= n; j++) {
            if (fabs(a[mx][i]) < fabs(a[j][i])) mx = j;
        }
        for (int j = 1; j <= n + 1; j++) swap(a[mx][j], a[i][j]);
        if (!a[i][i]) return 0;
        for (int j = 1; j <= n; j++) {
            if (i != j) {
                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 1;
}

int main() {
    n = read();
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n + 1; j++) {
            a[i][j] = read();
        }
    }
    int f = Guass();
    if (!f) printf("No Solution");
    else {
        for (int i = 1; i <= n; i++) {
            printf("%.2lf\n", a[i][n + 1] / a[i][i]);
        }
    }
    return 0;
}
posted @ 2023-09-24 15:46  imyhy  阅读(56)  评论(0)    收藏  举报