Python02 雅克比迭代法 Gauss-Seidel迭代法 列选主元法 LU分解法(附代码)

本文通过Python实现了雅克比迭代法、Gauss-Seidel迭代法和列选主元法的LU分解法求解线性方程组。实验展示了不同方法在特定方程下的收敛性和解题效果,同时提供了测试代码供参考。
摘要由CSDN通过智能技术生成

1. 实验结果

(1)在定义的矩阵类中设置需要求解的方程为:

(2)在 test.py 中选择雅克比迭代法求解:
输入:最大容许迭代次数和精度要求;
输出:根据谱半径判断方法是否收敛,收敛时得到满足精度要求的方程的根及迭代次数;

当把方程改成

时,再使用雅克比迭代法,可得到迭代矩阵的谱半径不小于 1,即该方法发散,直到达到迭代次数上限也未得到方程的解:

(3)选择 Guass-Seidel 迭代法求解:
输入:最大容许迭代次数和精度要求;
输出:根据谱半径判断方法是否收敛,收敛时得到满足精度要求的方程的根及迭代次数;

当把方程改成

时,再使用 Guass-Seidel 迭代法,可得到迭代矩阵的谱半径也不小于 1,即该方法同样发散,直到达到迭代次数上限也未得到方程的解:

(4)选择列选主元法求解:
输出:方程的解;

(5)选择 LU 分解法(Doolittle 法)求解:
输出:方程的解;

2. 代码

test.py

from class1 import matrix

m = matrix()  
# 选择四种求解方法中的一种求解方法,根据所选方法的要求输入所需参数后输出满足要求的解
i = int(input('选择方法:1.雅克比迭代法; 2. Gauss-Seidel迭代法; 3. 列选主元法; 4. LU分解法(Doolittle法)\n'))
if i == 1:
   N = float(input("最大容许迭代次数:"))
   e = float(input("精度要求:"))
   print('雅克比迭代法:')
   m.Jacobi(N, e)
elif i == 2:
   N = float(input("最大容许迭代次数:"))
   e = float(input("精度要求:"))
   print('Guass-Seidel迭代法:')
   m.G_S(N, e)
elif i == 3:
   print('列选主元法:')
   m.Guass()
elif i == 4:
   print('LU分解法:')
   m.LU()

class1.py

import math
import numpy as np

class matrix(object):
    """包括: 1.雅克比迭代法; 2. Gauss-Seidel迭代法; 3. 列选主元法; 4. LU分解法(Doolittle法)"""

    # 设置求解的方程的输入系数矩阵A、值矩阵b
    def __init__(self):
        self.A = np.array([[5.0, 2, 1], [-1, 4, 2], [2, -3, 10]])
        self.b = np.array([-12, 20, 3])
        # 采用雅克比方法和G-S方法不收敛的方程
        # self.A = np.array([[2, -3, 10], [-1, 4, 2], [5, 2, 1]])
        # self.b = np.array([3, 20, -12])

    # 求矩阵谱半径,可以用于判断Jacobi迭代法和G-S迭代法的收敛性
    def spectral_radius(self, B):
        a, b = np.linalg.eig(B)  # a为特征值集合,b为特征值向量
        return np.max(np.abs(a))  # 谱半径

    # 1. Jacobi迭代法:输入参数最大容许迭代次数N、精度要求e( 输入系数矩阵A、值矩阵b )
    def Jacobi(self, N=100, e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值