高斯消元法

高斯消元法-约当消元法

  • m个一次方程,n个变量,可以得到mn+1列的增广矩阵
  • 将增广矩阵通过行初等变换为行最简形
  • 我们观察增广矩阵,线性方程组的解有3种情况
  • 唯一解
  • 有无穷多组解
  • 无解
  • 高斯-约旦消元法,是高斯消元法的一种,消元的结果是一个简化阶梯矩阵、

消元过程

  1. 从第1列开始,选择一个非0的系数(优先选择最大的的系数,避免转换为其他系数时产生过大的树数值)所在的行,把这一行移动到第1行,此时x1是主元
  2. x1的系数转换为1
  3. 利用主元x1的系数,把其他行的这一列的主元消去
  4. 重复以上步骤,直到把每行都变成只有对角线上存在主元,且系数都为1,最后得到行最简行矩阵,答案就是最后一列的数字
int n;
double a[N][N]; // 增广矩阵
/*
1 2 -4 0
0 0 3 3
0 0 2 2
*/
int Gauss(int n, int m) // n行m列的增广矩阵
{
    int r = 0;                       // 增广矩阵的秩
    for (int j = 1; j <= m - 1; ++j) // 枚举系数矩阵的列
    {
        int mx = r + 1;               // 当前所在行号
        for (int i = mx; i <= n; ++i) // 枚举行来找到该列绝对值最大非0系数
        {
            if (fabs(a[i][j]) > fabs(a[mx][j]))
                mx = i;
        }

        if (fabs(a[mx][j]) < eps) // 对角线上主元素为0,没有唯一解,矩阵的秩不用加1
            continue;

        for (int i = 1; i <= m; ++i) // 将这最大系数这一行和对角线那一行进行交换
            swap(a[r + 1][i], a[mx][i]);

        for (int i = m; i >= j; --i) // 将这一行的主元素系数变为1
            a[r + 1][i] /= a[r + 1][j];

        for (int i = 1; i <= n; ++i) // 消去主元所在列的其他行的主元
        {
            if (i != r + 1)
            {
                double t = a[i][j] / a[r + 1][j];
                for (int k = 1; k <= m; ++k)
                    a[i][k] -= t * a[r + 1][k];
            }
        }
        r++;
    }

    if (r < m - 1) // 矩阵的秩小于未知量的个数(m - 1)
    {
        for (int i = r + 1; i <= n; ++i)
        {
            if (fabs(a[i][m]) > eps)
                return 0; // 无解
        }
        return 2; // 有无穷多组解
    }
    return 1;
}
posted @   Zeoy_kkk  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示