介绍
用处:求解线性方程组
加减消元法和代入消元法
这里引用了高斯消元解线性方程组----C++实现_c++用高斯消元法解线性方程组-CSDN博客
改成了自己常用的形式:
int gauss()
{int c, r; // column, rowfor (c = 1, r = 1; c <= n; c ++){int maxx = r; // 从对角线元素开始往下遍历这一列for (int i = maxx; i < n; i ++) // 找到该列绝对值最大的元素所在的行号if (fabs(a[i][c]) > fabs(a[maxx][c]))maxx = i;if (fabs(a[maxx][c]) < eps) continue; // 最大绝对值是0,那么这一列剩下的元素全是0,不用管这列。这个地方导致后面不能r ++,也意味着底部将会增加一个系数全0的方程for (int i = c; i <= n+1; i ++) swap(a[maxx][i], a[r][i]); // 把最大绝对值元素所在的行换到未处理行的最上面(即当前要处理的的第r行)for (int i = n+1; i >= c; i --) a[r][i] /= a[r][c]; // 把现在的第r行的数字全部除以一个系数,使得左上角a[r][c]变成1for (int i = r + 1; i <= n; i ++) // 把当前列下的所有数都消成0,要对应两行元素一起变化if (fabs(a[i][c]) > eps) //已经是0的就不用操作了,省点计算for (int j = n+1; j >= c; j --)a[i][j] -= a[r][j] * a[i][c];r ++;}// 上面步骤走完之后,矩阵a[][]扣掉增广的最后一列系数以外,剩下的已经是个上三角阵或者阶梯阵if (r <= n) // 说明有效的方程个数小于n,那要么无穷解,要么无解{for (int i = r; i <= n; i ++){if (fabs(a[i][n+1]) > eps) // a[i][n] = b_i不等于0return 2; // 无解return 1; // 都是0 = 0的方程,无穷解}}// 唯一解,从下往上回代,得到方程的解for (int i = n ; i >= 1; i --)for (int j = i + 1; j <= n; j ++)a[i][n+1] -= a[i][j] * a[j][n+1];return 0;
}