高斯消元

发布时间 2023-09-24 15:53:34作者: imyhy

问题

求解线性方程组

算法思想

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

代码实现

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

#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>

#define il inline
#define ll long long
#define db double

using namespace std;

il 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;
db 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){
                db 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;
}