- 通过初等行变换把 增广矩阵 化为 阶梯型矩阵 并回代 得到方程的解
- 适用于求解 包含
个方程, 个未知数的多元线性方程组
消元法理论的核心
消元法理论的核心主要如下:
两方程互换,解不变;
一方程乘以非零数
,解不变; 一方程乘以数
加上另一方程,解不变。
对于方程组
增广矩阵为
初等行(列)变换
- 把某一行乘一个非0的数 (方程的两边同时乘上一个非0数不改变方程的解)
- 交换某两行 (交换两个方程的位置)
- 把某行的若干倍加到另一行上去 (把一个方程的若干倍加到另一个方程上去)
用初等行(列)变换将增广矩阵变为阶梯型矩阵:
最后再把阶梯型矩阵从下到上回代到第一层即可得到方程的解
解的个数
- 完美阶梯型: 唯一解
: 无解 : 无穷组解
算法步骤
枚举每一列
- 找到当前列绝对值最大的一行
- 用初等行变换
把这一行换到最上面(未确定阶梯型的行,并不是第一行) - 用初等行变换
将该行的第一个数变成 (其余所有的数字依次跟着变化) - 用初等行变换
将下面所有行的当且列的值变成
例子: 利用高斯消元法五步骤法求解线性方程组
增广矩阵行(初等)变换为行最简形
所谓增广矩阵,即为方程组系数矩阵
化为行阶梯形
化为最简形
还原线性方程组
解释
所谓的还原线性方程组,即是在行最简形的基础上,将之重新书写为线性方程组的形式,即将行最简形中各位置的系数重新赋予变量,中间的竖线还原为等号。
代码模板
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