高斯消元(解线性方程组)

高斯消元(南昌理工ACM)

简介

高斯消元法,是线性代数规划中的一种算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。
在这里插入图片描述

如图对于方程,除去各未知数,将各数排在一起,成为矩阵,可将他的增广矩阵列出;
在这里插入图片描述
之后从上往下经过初等行列变换进一步将该矩阵化为上三角矩阵(最简阶梯型矩阵):

初等行列变换
1、把某一行乘上一个非零的数;
2、交换某两行;
3、把某行的若干倍加到另一行上去;

注:初等行列变换不影响方程组解的情况
在这里插入图片描述
在这里插入图片描述
由此可列出方程组:
在这里插入图片描述

之后从下往上将矩阵竖线左边化为单位矩阵,竖线右边就是对应未知数的解;
在这里插入图片描述
X1=4 ,X2=3 ,X3=2 ,X2=1;

方程式的解共有三种情况:
1、无解(出现了竖线左边没有未知数,右边是非零的情况);
2、无穷组解(消元后不是完美的阶梯型,出现了很多全0行);
3、唯一解(经过消元后成一个完美阶梯型,如上例);

分析

高斯消元算法步骤:
枚举每一列
1、找到当前这一列系数绝对值最大的一行(控制精度,有除法运算);
2、将该行与第一行进行交换;
3、将改行第一个非零数变为1,后面的数同时做相应的改变;
4、将下面所有行的这一列全部消为0;

const int N = 110;
const double eps = 1e-6;
int n;
double a[N][N];//存增广矩阵

int gauss()
{
    int c, r;
    for (c = 0, r = 0; c < n; c ++ )//枚举列
    {
        int t = r;
        for (int i = r; i < n; i ++ )
            if (fabs(a[i][c]) > fabs(a[t][c]))//找当前这一列系数绝对值最大的一行
                t = i;

        if (fabs(a[t][c]) < eps) continue;//c++存浮点数有误差判断其是否小于一个很小的数,是则认为其为零

        for (int i = c; i < n + 1; i ++ ) swap(a[t][i], a[r][i]);//交换行
        for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c];//这一行所有的数同时除以第一个数,注意要从后往前除;

        for (int i = r + 1; i < n; i ++ )
            if (fabs(a[i][c]) > eps)
                for (int j = n; j >= c; j -- )
                    a[i][j] -= a[r][j] * a[i][c];//消零

        r ++ ;
    }

    if (r < n)//消完之后剩余方程的个数是小于n的(n个方程解n个未知数,说明不是唯一组解)
    {
        for (int i = r; i < n; i ++ )
            if (fabs(a[i][n]) > eps)//0==!0的情况
                return 2;//无解
        return 1;//有无穷组解
    }

    for (int i = n - 1; i >= 0; i -- )
        for (int j = i + 1; j < n; j ++ )
            a[i][n] -= a[j][n] * a[i][j];//从后往前消求解,此时方程的解存在a[i][n]中;
            
    return 0;唯一解
}

高斯消元模板(出自AcWing(yxc))

由上方的高斯消元模板很容易看出,高斯消元的时间复杂度为O(n^3);

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值