高斯消元学习笔记

概述 & 用法

高斯消元就是一种解方程的方法

现在有个n个方程,n个未知数组成的方程组:
\(a_{i,1}*x_1+a_{i,2}*x_1...+a_{i,n}*x_n=b_i\)
.
.
.
然后我们把系数都拿出来组成一个 \(n*(n+1)\) 的矩阵
接下来就是消消消

具体方法:
按列消除,目标是矩阵中只剩下 \(a_{i,i}\) ,其余元素皆为0

枚举每一列 i

找到这列中最大的元素,将该行与第i行整体调换一下
然后将第i行所有元素除以 \(a_{i,i}\),使得 \(a_{i,i}==1\)
再将其余行每一行都减掉第i行乘一个常数,使得第i列除 \(a_{i,i}\) 外都为0
最后剩下的第 n+1 列就是每个未知数的值

代码

#define db double
db a[1001][1001];
void solve()
{
    for(int i=1;i<=n;i++)
    {
        int maxx=i;
        for(int j=i+1;j<=n;j++) if(a[j][i]>a[maxx][i]) maxx=j;
        for(int j=i;j<=n+1;j++) swap(a[i][j],a[maxx][j]);
        if(!a[i][i]) {
            cout<<"YZHX"<<endl;
        }
        for(int j=i+1;j<=n+1;j++) a[i][j]/=a[i][i];
        a[i][i]=1;
        for(re int j=1;j<=n;j++)
        {
            if(i==j) continue;
            int k=a[j][i]/a[i][i];
            for(re int p=i;p<=n+1;p++)
                a[j][p]=a[j][p]-a[i][p]*k;
        }
    }
    return ;
}
posted @ 2020-06-19 11:44  yzhx  阅读(167)  评论(0编辑  收藏  举报