高斯消元模板(洛谷 3389)

传送门:点击打开链接

题意:给定一个线性方程组,对其求解 

分析:高斯消元模板题(加减消元),通过构造矩阵来求解多元一次方程。

主要步骤如下(构成上三角):
1.选定未被选择过的、xi项系数绝对值最大的一行(这样更加容易判断是否有解),将整个式子除以xi的系数(xi系数化为1)。同时将其交换至第i行(方便求解)
2.将未被选择过的行中的该项全部按照系数相应的减去选定的那行的系数(剩下的其他行xi系数化为0)当所有行都选定过时,已经构成了上三角

3.倒序求解,每次将常数减去已经求出的所有项的解,此时可以求出当前项的解(将已知解带入求未知解)

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
double m[110][110];
int n;

void gas() {
    for(int i=1;i<=n;i++) {
        int pos=i;
        for(int j=i+1;j<=n+1;j++) ///找出当前项系数的绝对值的最大值
            if( fabs(m[pos][i]) < fabs(m[j][i]) )
                pos=j;

        for(int j=i;j<=n+1;j++)  ///将其放在对应的行,方便计算
            swap(m[i][j],m[pos][j]);

        if( m[i][i] == 0 ) { ///如果此时绝对值最大系数已经为0 则证明此方程组无解
            cout<<"No Solution"<<endl;
            return ;
        }

        for(int j=i+1;j<=n+1;j++) ///将系数化为1
            m[i][j]/=m[i][i];
        m[i][i] = 1;

        for(int j=i+1;j<=n+1;j++) { ///在其他式子中将此项系数化为0
            for(int k=i+1;k<=n+1;k++)
                m[j][k]-=m[j][i]*m[i][k];
            ///m[j][i] = 0;
        }
    }
    ///做完之后,剩余的矩阵是上三角 倒着求解即可
    for(int i=n;i>=1;i--) {
        for(int j=i+1;j<=n;j++) { ///减去后面所有已经求出解的值
            m[i][n+1]-=m[i][j]*m[j][n+1];
            ///m[i][j]=0;
        }
    }

    for(int i=1;i<=n;i++)
        printf("%.2lf\n",m[i][n+1]);
}

int main() {
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n+1;j++)
            cin>>m[i][j];
    gas();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/tianwei0822/article/details/80356904
今日推荐