高斯消去法(线性方程组求解)

问题描述

为求解一个线性方程组,首先构造增广矩阵[A|B],采用偏序选主元策略的高斯消去法变换成上三角矩阵,再执行回代过程得到解。

输入形式

在屏幕上依次输入方阵阶数n,系数矩阵A和常数矩阵B。

输出形式

首先输出上三角矩阵(变换后的增广矩阵),然后每一行输出一个根

样例1输入

4

1 2 1 4

2 0 4 3

4 2 2 1

-3 1 3 2

13

28

20

6

样例1输出

[[ 4. 2. 2. 1. 20. ]

[ 0. 2.5 4.5 2.75 21. ]

[ 0. 0. 4.8 3.6 26.4 ]

[ 0. 0. 0. 3.75 7.5 ]]

[[ 3.]

[-1.]

[ 4.]

[ 2.]]

样例1说明

输入:第1行为方阵阶数4,第2行至5行为系数矩阵A,第6行至9行为常数矩阵B。

输出:首先输出上三角矩阵(变换后的增广矩阵),然后每行依次输出方程解:x1, x2, x3, x4。

代码

# 高斯消元法
import numpy as np

def Input():
    n = int(input())

    A = np.zeros([n, n], dtype=np.double())
    for r in range(n):
        A[r:] = np.array(input().split(), dtype=np.double)

    B = np.zeros([n, 1], dtype=np.double)
    for r in range(n):
        B[r:] = np.array(input(), dtype=np.double)

    return A, B, n


def Gaussian(Aug):
    n = Aug.shape[0]
    epslion = np.finfo(np.float32).eps
    for p in range(0, n):
        max_index = np.argmax(np.fabs(Aug[p:n, p]))

        # 交换p, max_row行
        max_row = max_index + p
        Aug[[p, max_row], :] = Aug[[max_row, p], :]
        if abs(Aug[p, p]) < epslion :
            print('Array a was singular. No unique solution')
            break
        for k in range(p + 1, n):
            m = Aug[k, p] / Aug[p, p]
            Aug[k, p:n + 1] = Aug[k, p:n + 1] - m * Aug[p, p:n + 1]

    return Aug


def backsub(A, B):
    n = B.size

    X = np.zeros([n, 1], dtype=np.double)
    X[n - 1] = B[n - 1] / A[n - 1][n - 1]
    for i in range(n - 2, -1, -1):
        X[i] = (B[i] - A[i, i + 1:] @ X[i + 1:]) / A[i][i]

    return X


def main():
    A, B, n = Input()

    gaussian = Gaussian(np.hstack((A, B)))  # 将A,B以列合并
    print(gaussian)

    X = backsub(gaussian[:, 0:n], gaussian[:, n:])

    print(X)

if __name__ == '__main__':
    main()
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一 误差分析 一、实验目的及要求 1.了解误差分析对数值计算的重要性。 2.掌握避免或减小误差的基本方法。 二、实验设备 安装有C、C++或MATLAB的计算机。 三、实验原理 误差是指观测值与真值之差,偏差是指观测值与平均值之差。根据不同的算法,得到的结果的精度是不一样的。 四、实验内容及步骤 求方程ax2+bx+c=0的根,其中a=1,b= -(5×108+1),c=5×108 采用如下两种计算方案,在计算机上编程计算,将计算结果记录下来,并分析产生误差的原因。 ////////////////////////////// 实验二 Lagrange插值 一、实验目的及要求 1.掌握利用Lagrange插值法及Newton插值法求函数值并编程实现。 2.程序具有一定的通用性,程序运行时先输入节点的个数n,然后输入各节点的值( ),最后输入要求的自变量x的值,输出对应的函数值。 二、实验设备和实验环境 安装有C、C++或MATLAB的计算机。 三、算法描述 1. 插值的基本原理(求解插值问题的基本思路) 构造一个函数y=f(x)通过全部节点,即 (i=0、1、… n) 再用f(x)计算插值,即 2. 拉格朗日(Lagrange)多项式插值 Lagrange插值多项式: 3.牛顿(Newton)插值公式 //////////////////////////////////// 实验三 高斯消去法解方程组 一、实验目的及要求 1.掌握求解线性方程组高斯消去法---列选主元在计算机上的算法实现。 2.程序具有一定的通用性,程序运行时先输入一个数n表示方程含有的未知数个数,然后输入每个线性方程的系数和常数,求出线性方程组的解。 二、实验设备和实验环境 安装有C、C++或MATLAB的计算机。 三、算法描述 1.高斯消去法基本思路 设有方程组 ,设 是可逆矩阵。高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增广矩阵 ,将其中的 变换成一个上三角矩阵,然后求解这个三角形方程组。 2. 利用列选主元高斯消去法求解线性方程组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值