赞
踩
(1)在定义的矩阵类中设置需要求解的方程为:
(2)在 test.py 中选择雅克比迭代法求解:
输入:最大容许迭代次数和精度要求;
输出:根据谱半径判断方法是否收敛,收敛时得到满足精度要求的方程的根及迭代次数;
当把方程改成
时,再使用雅克比迭代法,可得到迭代矩阵的谱半径不小于 1,即该方法发散,直到达到迭代次数上限也未得到方程的解:
(3)选择 Guass-Seidel 迭代法求解:
输入:最大容许迭代次数和精度要求;
输出:根据谱半径判断方法是否收敛,收敛时得到满足精度要求的方程的根及迭代次数;
当把方程改成
时,再使用 Guass-Seidel 迭代法,可得到迭代矩阵的谱半径也不小于 1,即该方法同样发散,直到达到迭代次数上限也未得到方程的解:
(4)选择列选主元法求解:
输出:方程的解;
(5)选择 LU 分解法(Doolittle 法)求解:
输出:方程的解;
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()
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。