高斯消元part2

今天整一整高斯消元的模板,正经的

高斯消元主要用于解n元一次线性方程组与判断是否有解

主要思想? 就是高斯消元啊

主要思想是理想状态下消为每行除最后一项外只有一个1,并且每行位置互异,具体看下面。

这里代码的目的主要是求方程的解

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
double a[105][105];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]);
    }
    for(int i=1;i<=n;i++){
        int t=i;
        while(a[t][i]==0&&t<=n) t++;  //判断是否有解,如果每行对于某项系数全为0,则视为无解(无唯一解)
        if(t==n+1){
            cout<<"No Solution";
            return 0;
        }
        for(int j=1;j<=n+1;j++) swap(a[t][j],a[i][j]);   //(通行列式)如果首项为0,则挑一行不为零的换下
        double x=a[i][i];  //保存系数,以便下面用
        for(int j=1;j<=n+1;j++) a[i][j]/=x;
        for(int j=1;j<=n;j++){
            if(j==i) continue;   //这里主要思想放在下面注释point
            x=a[j][i];
            for(int k=1;k<=n+1;k++){
                a[j][k]-=x*a[i][k];
            }
        }
    }
    for(int i=1;i<=n;i++) printf("%0.2lf\n",a[i][n+1]); //因系数消为1,顾每行最后即为解
    return 0;
}

point:

对于计算每行“i”,i即表示行数,即对于每行进行消元,理想状态下需把第n行的第n项系数消为1,其余消掉(消为0),所以当j==i时,跳过不做消元处理,只在之前那一步把系数化为1,其他位置的系数留给下面的式子来消,故当j!=i时,用这一行把其他同位置的系数消为0,并且如果有解,则数据保证能消为理想状态(好像证明的一部分已经给出了。。。)

posted @ 2019-04-11 21:30  _Alex_Mercer  阅读(204)  评论(0编辑  收藏  举报