高斯-若尔当 消元法小结

突然发现经过了很久的文化课学(tao)习(ke),自己忘了高斯消元(我太弱了

所以今天就来学(gao一下这个东西

高斯-若尔当(约旦)消元法!

(以下内容转自某度)

数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。
但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有
过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用
于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及
未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组 [1] 。

好强!

不过,这个算法马起来感觉简单很多

于是我这个蒟蒻就偷个懒吧

大概思路就是这样的:

  1.找一个“主元”,(显然这个zhu元应该是没选择过的未知数)

扫描二维码关注公众号,回复: 6933138 查看本文章

  2.把此方程中的主元系数化一

  3.通过加减消元,把其他方程中这个未知数全消去

  4.重复上述步骤,直到得到一个对角矩阵(这里与高斯消元的三角矩阵不同)

然而其实在做的过程中,是将左边的矩阵化成了单位矩阵,此时右边的矩阵就是原矩阵的腻矩阵辣!

   这里纸位置不够了,我就不写了/doge(咕咕咕

 把代码留在这吧: (毒奶以后用远不考)

 题目来源:洛谷P3389【模板】睾♂斯消元法

#include<bits/stdc++.h>
using namespace std;
double a[110][110];
int main()
{
    int n;
    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 maxx=i;
        for(int j=i+1;j<=n;++j)
            if(fabs(a[i][j])-fabs(a[maxx][j])) maxx=j;
        for(int j=1;j<=n+1;++j)
            swap(a[maxx][j],a[i][j]);
        if(!a[i][i]) 
        {
            cout<<"No Solution"<<endl;
            return 0;
        }
        else
        {
            for(int j=1;j<=n;++j)
            {
                if(i==j) continue;
                double temp=a[j][i]/a[i][i];
                for(int k=i+1;k<=n+1;++k)
                {
                    a[j][k]-=a[i][k]*temp;
                }
            }
            a[i][n+1]/=a[i][i];
        }
    }
    for(int i=1;i<=n;++i)
    {
        printf("%.2lf\n",a[i][n+1]);
    }
}

猜你喜欢

转载自www.cnblogs.com/ZzTzZ/p/11290883.html