[数学]高斯消元

介绍

用处:求解线性方程组

加减消元法和代入消元法

[数学]高斯消元_第1张图片

这里引用了高斯消元解线性方程组----C++实现_c++用高斯消元法解线性方程组-CSDN博客

改成了自己常用的形式:

int gauss()
{
    int c, r; // column, row
    for (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]变成1
       for (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不等于0
                return 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;
}

你可能感兴趣的:(算法,数据结构)