計算機數值方法:列主元消元法解線性方程組

題
高斯消元的優化,爲了避免分母過小造成的誤差,在每次選取基準數的時候在每列中選擇最大的那個並於該行做初等行變換,該代碼的時間複雜度爲 O(N4)O(N^4)

CPP代碼

/*
WANG_zibi 列消元 
 
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e4 + 10;
double a[N][N];
int n, m;
const double INF = 0x3f3f3f3f;
void test()
{
    printf("經過變換的矩陣爲:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        puts("");
    }
}
void deal(int x)
{
    pair<double, int> flag;
    flag.first = flag.second = -INF;
    for (int i = x + 1; i < n; i++)
    {
        if (a[i][x] > flag.first)
        {
            flag.first = a[i][x];
            flag.second = i;
        }
    }
    if(flag.second!=-INF)
    for (int i = 0; i < m; i++)
            swap(a[flag.second][i], a[x][i]);
}
void gauss()
{
    for (int k = 0; k < n; k++)
    {
        deal(k);
        for (int i = k + 1; i < n; i++)
        {
        	
            double t = a[i][k] / a[k][k];
            for (int j = k; j < m; j++)
            {
                a[i][j] -= a[k][j] * t;
            }
        }
    }
    
    for (int j = 2; j >= 0; j--)
    {
        for (int k = j + 1; k < 3; k++)
        {
            a[j][3] = a[j][3] - a[j][k] * a[k][k];
        }
        a[j][j] = a[j][3] / a[j][j];
    }
}

void solve()
{
    printf("最終得到的x1,x2,x3分別爲:\n");
    for (int i = 0; i < 3; i++)
        cout << a[i][i] << " ";
}
signed main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> a[i][j];
    test(); 
    gauss();
    solve();
    return 0;
}

PYTHON代碼

class gauss:
    def __init__(self, M, nn, mm):
        self.Matrix = M
        self.n = nn
        self.m = mm
    def __deal(self, t):
        x = -9999999.0
        y = None
        for i in range(t+1,self.n):
            if(self.Matrix[i][t] > x):
                x = self.Matrix[i][t]
                y=i
            for i in range(0,self.m):
                temp = self.Matrix[t][i]
                self.Matrix[t][i] = self.Matrix[y][i]
                self.Matrix[y][i]=temp

    def solve(self):
        for k in range(0, self.n):
            self.__deal(k)
            for i in range(k + 1, self.n):
                t = self.Matrix[i][k] / self.Matrix[k][k]
                for j in range(0, self.m):
                    self.Matrix[i][j] -= self.Matrix[k][j] * t
        for j in range(self.n - 1, -1, -1):
            for k in range(j + 1, self.n):
                self.Matrix[j][self.n] = self.Matrix[j][self.n] - self.Matrix[j][k] * self.Matrix[k][k]
            self.Matrix[j][j] = self.Matrix[j][self.n] / self.Matrix[j][j]

        for i in range(0, self.m - 1):
            print(self.Matrix[i][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()

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