定义:
数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。
本质:
用来化简一个阶梯式行列式,求出方程的解
线性方程组的情况:无解、有穷多个解和无穷个解
高斯消元法一般步骤(四大步)
- 找主元:找到这一列绝对值最大的值
- 交换:将该列最大的值交换到第r行
- 归一:将第r行都除以a[r][c]进行归一
- 消:化成上三角的形式
高斯-约当消元法
化成对角三角形:可以直接求解
不化成对角三角形可以返回自由元个数
自由元的作用
参考这张图(只有网址)
https://oi-wiki.org/math/gauss/#_11
基本模板
int gauss() {
int c, r;
for (c = 1, r = 1;c <= m && r <= n;c ++ ) {
// 找主元
int t = r;
for (int i = r + 1;i <= n;i ++ )
if (fabs (a[i][c]) > fabs (a[t][c]))
t = i;
if (a[t][i] < eps) continue; // 如果这一行最大为0,则自由元+1 -- 也就是r没有+1
// 交换
for (int j = c;j <= m + 1;j ++ ) swap(a[r][j], a[t][j]);
// 归一
for (int j = m + 1;j >= c;j -- ) a[r][j] /= a[r][c];
// 消: 化成上三角
for (int i = r + 1;i <= n;i ++ )
for (int j = m + 1;j >= c;j -- )
a[i][j] -= a[i][c] * a[r][j];
r ++ ;
}
// r代表化成上三角后,当前行所处位置的下一行
if (r <= n) {
for (int i = r;i <= n;i ++ )
if (a[i][m + 1]) return -1; // 0 != 0
}
return m - r + 1; // 返回自由元个数
}
异或形式:
int gauss() {
int r, c;
for (r = 1, c = 1;c <= m && q <= n;c ++ ) {
// 找主元
int t = r;
for (int i = r + 1;i <= n;i ++ )
if (a[i][c] > a[t][c])
t = i;
if (!a[t][c]) continue;
// 交换
for (int j = c;j <= m + 1;j ++ ) swap(a[r][j], a[t][j]);
// 归一不需要,本身就是0或1
// 消
for (int i = r + 1;i <= n;i ++ )
for (int j = m + 1;j >= c;j -- )
a[i][j] ^= a[r][j] & a[i][c];
// 相当于:if (a[i][c)) a[i][j] ^= a[r][j];
r ++ ;
}
if (r <= n) {
for (int i = 1;i <= n;i ++ )
if (a[i][m + 1]) return -1;
}
return m - r + 1;
}
难点分析
如何将问题转换成高斯消元来求解,感觉还是得多练
参考:
1. 百度百科
2. https://blog.csdn.net/qq_46527915/article/details/117388486