其他分享
首页 > 其他分享> > 高斯消元学习笔记

高斯消元学习笔记

作者:互联网

参考文章:高斯消元(Gauss消元)https://www.cnblogs.com/xcg123/p/10679600.html
矩阵相关定义性质全总结 https://blog.csdn.net/I_canjnu/article/details/105778485
用来解n元一次方程组。
操作很简单:先从定位点(i,i)往下找第一个当前列非零的一行,换到当前列。
再让这行除以(i,i)上的数,(i,i)即变成了1。
利用这个1,让所有行减去第i列数倍的第i行,第i列就消好了。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,pl;
double a[1001][1001];//注意数据类型
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
       for(int j=1;j<=n+1;j++)//高斯消元的矩阵是n*(n+1)的,别忘了最后一列
       cin>>a[i][j];
    for(int i=1;i<=n;i++)
    {
        pl=i;
        while(a[pl][i]==0&&pl<=n) 
        pl++;                                    
         // 判断第i列首元素非0的最上行,因为第i行第i列元素不能为0 
        if(pl==n+1) {cout<<"No Solution";return 0;}    
        //一直判到了n+1行,可是一共才只有n行,说明有一列全为0,无解 
        for(int j=i;j<=n+1;j++)             //将第i行第i列元素不为0的那一行与当前行交换 
        swap(a[i][j],a[pl][j]);
        double k=a[i][i];                          //让第i行每个元素都除以a[i][i]使得a[i][i]为1 
        for(int j=i;j<=n+1;j++)
        a[i][j]=a[i][j]/k;                         //将第i行第i列的元素消成1,注意同行进行同样的操作 
        for(int j=1;j<=n;j++)
        {
            if(i!=j)                        //将第i列除了第i行的元素全消成0 
            {                               //方法是第j行每个元素a[j][m]都减去a[j][1]*a[i][m] 
                double ki=a[j][i];
                for(int m=i;m<=n+1;m++)
                a[j][m]=a[j][m]-ki*a[i][m];
            }
        }
    }
    for(int i=1;i<=n;i++)
    printf("%.2lf\n",a[i][n+1]);
    return 0;
}

标签:int,笔记,学习,前列,高斯消,https,include,1001
来源: https://www.cnblogs.com/InductiveSorting-QYF/p/16183242.html