计算机数值方法:列主元消元法解线性方程组

题
高斯消元的优化,为了避免分母过小造成的误差,在每次选取基准数的时候在每列中选择最大的那个并于该行做初等行变换,该代码的时间复杂度为 O ( N 4 ) O(N^4) O(N4)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值