Skip to content
  • 通过初等行变换把 增广矩阵 化为 阶梯型矩阵 并回代 得到方程的解
  • 适用于求解 包含n个方程,n 个未知数的多元线性方程组

消元法理论的核心

消元法理论的核心主要如下:

  • 两方程互换,解不变;

  • 一方程乘以非零数 k,解不变;

  • 一方程乘以数 k 加上另一方程,解不变。


对于方程组

{a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2an1x1+an2x2++annxn=bn

增广矩阵为

(a11a12a1nb1a21a22a2nb2an1an2annbn)

初等行(列)变换

  1. 把某一行乘一个非0的数 (方程的两边同时乘上一个非0数不改变方程的解)
  2. 交换某两行 (交换两个方程的位置)
  3. 把某行的若干倍加到另一行上去 (把一个方程的若干倍加到另一个方程上去)

用初等行(列)变换将增广矩阵变为阶梯型矩阵:

(a11a12a1nb1a2ia2(i+1)a2nb2annbn)

最后再把阶梯型矩阵从下到上回代到第一层即可得到方程的解


解的个数

  • 完美阶梯型: 唯一解
  • 0=a,a0: 无解
  • 0=0: 无穷组解

算法步骤

枚举每一列 c

  1. 找到当前列绝对值最大的一行
  2. 用初等行变换 (2) 把这一行换到最上面(未确定阶梯型的行,并不是第一行)
  3. 用初等行变换 (1) 将该行的第一个数变成 1(其余所有的数字依次跟着变化)
  4. 用初等行变换 (3) 将下面所有行的当且列的值变成 0

例子: 利用高斯消元法五步骤法求解线性方程组

{2x1+5x3+6x4=9x3+x4=42x3+2x4=8
增广矩阵行(初等)变换为行最简形

所谓增广矩阵,即为方程组系数矩阵 A 与常数列 b 的并生成的新矩阵,即 (A|b),增广矩阵行初等变换化为行最简形,即是利用了高斯消元法的思想理念,省略了变量而用变量的系数位置表示变量,增广矩阵中用竖线隔开了系数矩阵和常数列,代表了等于符号。

(205600110022|948)r32r2(205600110000|940)
化为行阶梯形
r12(102.5300110000|4.540)r1r2×2.5(1000.500110000|14.540)
化为最简形
还原线性方程组
{x1+0.5x4=14.5x3+x4=4

解释

所谓的还原线性方程组,即是在行最简形的基础上,将之重新书写为线性方程组的形式,即将行最简形中各位置的系数重新赋予变量,中间的竖线还原为等号。


代码模板

cpp
// 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;

        for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]);      // 将绝对值最大的行换到最顶端
        for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c];      // 将当前行的首位变成1
        for (int i = r + 1; i < n; i ++ )       // 用当前行将下面所有的列消成0
            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)
    {
        for (int i = r; i < n; i ++ )
            if (fabs(a[i][n]) > eps)
                return 2; // 无解
        return 1; // 有无穷多组解
    }

    for (int i = n - 1; i >= 0; i -- )
        for (int j = i + 1; j < n; j ++ )
            a[i][n] -= a[i][j] * a[j][n];

    return 0; // 有唯一解
}

参考

[1] 高斯消元 - OI Wiki