「学习笔记」高斯消元

简单说:高斯消元就是我们初中学的解方程组时用的加减消元法和代入消元法,只是高斯这个人最后总结了一下

过程#

给定方程组

{3x+2y+z=10(1)5x+y+6z=25(2)2x+3y+4z=20(3)

我们用 (2) 式来消去 x

5x+y+6z=255x=25y6zx=515y65z

代入得

{3(515y65z)+2y+z=105x+y+6z=25()2(515y65z)+3y+4z=20

{75y135z=5(1)135y+85z=10(2)

我们现在再用 (2) 式来消去 y

135y+85z=1013y+8z=5013y=508zy=5013813

代入得

{75(5013813)135z=5135y+85z=10()

4513z=13513z=3

我们再将 z=3 代会得 y=2,再带回得 x=1

代码#

这里有应对 doubleint 两种数据类型的代码。

应对 double 数据的#

double a[N][N];
cin >> n;
for (int i = 1; i <= n; ++ i) {
    for (int j = 1; j <= n; ++ j) {
        cin >> a[i][j];
    }
    cin >> a[i][n + 1];
}
// a[1][1] * x1 + a[1][2] * x2 + ... + a[1][n] * xn = a[1][n + 1];
// a[2][1] * x1 + a[2][2] * x2 + ... + a[2][n] * xn = a[2][n + 1];
// ...
// a[n][1] * x1 + a[n][2] * x2 + ... + a[n][m] * xn = a[n][n + 1];

void gauss() {
    for (int i = 1; i <= n; ++ i) { // 现在要把 xi 从第 i + 1 个方程到第 n 个方程消掉
        for (int j = i; j <= n; ++ j) {
            if (fabs(a[j][i]) > fabs(a[i][i])) {
                for (int k = 1; k <= n + 1; ++ k) {
                    swap(a[i][k], a[j][k]);
                }
            }
        }
        for (int j = i + 1; j <= n; ++ j) { // 把 xi 从第 j 个方程消掉
            double ratio = a[j][i] / a[i][i];
            for (int k = 1; k <= n + 1; ++ k) {
                a[j][k] -= a[i][k] * ratio;
            }
        }
    }
    for (int i = n; i >= 1; -- i) { // 解 x[i] 的值
        for (int j = i + 1; j <= n; ++ j) {
            a[i][n + 1] -= a[i][j] * x[j];
        }
        x[i] = a[i][n + 1] / a[i][i];
    }
}

应对 int 数据的#

int a[N][N];
cin >> n;
for (int i = 1; i <= n; ++ i) {
    for (int j = 1; j <= n; ++ j) {
        cin >> a[i][j];
    }
    cin >> a[i][n + 1];
}
// a[1][1] * x1 + a[1][2] * x2 + ... + a[1][n] * xn = a[1][n + 1];
// a[2][1] * x1 + a[2][2] * x2 + ... + a[2][n] * xn = a[2][n + 1];
// ...
// a[n][1] * x1 + a[n][2] * x2 + ... + a[n][m] * xn = a[n][n + 1];

void gauss() {
    for (int i = 1; i <= n; ++ i) { // 现在要把 xi 从第 i + 1 个方程到第 n 个方程消掉
        for (int j = i; j <= n; ++ j) {
            if (a[j][i] != 0) {
                for (int k = 1; k <= n + 1; ++ k) {
                    swap(a[i][k], a[j][k]);
                }
                break;
            }
        }
        for (int j = i + 1; j <= n; ++ j) { // 把 xi 从第 j 个方程消掉
            if (a[j][i] == 0)    continue;
            int l = a[i][i] / gcd(abs(a[i][i]), abs(a[j][i])) * a[j][i];
            int ratioi = l / a[i][i];
            int ratioj = l / a[j][i];
            for (int k = 1; k <= n + 1; ++ k) {
                a[j][k] = a[j][k] * ratioj - a[i][k] * ratioi;
            }
        }
    }
    for (int i = n; i >= 1; -- i) { // 解 x[i] 的值
        for (int j = i + 1; j <= n; ++ j) {
            a[i][n + 1] -= a[i][j] * x[j];
        }
        x[i] = a[i][n + 1] / a[i][i];
    }
}

作者:yifan0305

出处:https://www.cnblogs.com/yifan0305/p/17051498.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载时还请标明出处哟!

posted @   yi_fan0305  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示