計算機數值方法-高斯若爾當消元解線性方程組

算法流程

G-J 消元法通過這樣的方法來進行初等變換:在每一個循環過程中,先尋找到主元,並將主元通過行變換 (無需列變換) 移動到矩陣的主對角線上, 然後將主元所在的行內的所有元素除以主元,使得主元化爲 1;然後觀察主元所在的列上的其他元素,將它們所在的行減去主元所在的行乘以一定的倍數, 使得主元所在的列內、 除主元外的其他元素化爲 0,這樣就使得主元所在的列化爲了單位矩陣的形式。 這就是一個循環內做的工作。 然後, 在第二輪循環的過程中, 不考慮上一輪計算過程中主元所在的行和列內的元素, 在剩下的矩陣範圍內尋找主元, 然後(如果其不在主對角線上的話) 將其移動到主對角線上, 並再次進行列的處理, 將列化爲單位矩陣的形式。 餘下的步驟依此類推。

C++代碼

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e3 + 10;
double a[N][N];
int n, m;
void test()
{
    printf("經過變換的矩陣爲:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        puts("");
    }
}
void GJE()
{
    for (int i = 0; i < n; i++)
    {
    	double t = a[i][i];
        for (int j = 0; j < m; j++)
        {
            a[i][j] /= t;
        }
        for (int j = 0; j < n; j++)
        {
            if (j == i)
                continue;
            double t = a[j][i] / a[i][i];
            for (int k = 0; k < m; k++)
                a[j][k] -= a[i][k] * t;
        }
    }
}

signed main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> a[i][j];
    GJE();
    test();
    return 0;
}
/*
3 4
2 2 6 4
2 1 7 6
-2 -6 -7 -1
*/

python代碼

class gauss:
    def __init__(self, M, nn, mm):
        self.Matrix = M
        self.n = nn
        self.m = mm

    def solve(self):
        for i in range(0,self.n):
            t = self.Matrix[i][i]
            for j in range(0,self.m):
                self.Matrix[i][j]=self.Matrix[i][j]/t
            for j in range(0,self.n):
                if j == i:
                    continue
                tmp = self.Matrix[j][i] /self.Matrix[i][i]
                for k in range(0,self.m):
                    self.Matrix[j][k] = self.Matrix[j][k] - self.Matrix[i][k]*tmp
            
        for j in range(0, self.m - 1):
            print(self.Matrix[self.n-1][i], end=' ')

def main():
    n,m=map(int, input().split())
    line = [[0] * m] * n
    for i in range(n):
        line[i] = input().split(" ")
        line[i] = list(map(int,line[i]))
    G = gauss(line,n,m)
    G.solve()
main()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章