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