当前位置:   article > 正文

Python02 雅克比迭代法 Gauss-Seidel迭代法 列选主元法 LU分解法(附代码)_改进型节点电压法lu分解法收敛条件

改进型节点电压法lu分解法收敛条件

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/78134
推荐阅读
相关标签
  

闽ICP备14008679号