计算机数值方法-高斯若尔当消元解线性方程组

算法流程

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()

发布了84 篇原创文章 · 获赞 12 · 访问量 2903

猜你喜欢

转载自blog.csdn.net/qq_43294914/article/details/105569577