高斯消元(南昌理工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);