线性方程组迭代算法的Python实现
jacobi迭代法
def JacobiIter(A:np.ndarray,
b:np.ndarray,
tol:float=1e-5,
maxIter:int=100)->Tuple[np.ndarray,np.ndarray]:
"""使用Jacobi迭代法求解线性方程组Ax=b
input:
A: np.ndarray, 系数矩阵
b: np.ndarray, 右端常数
tol: float, 误差限
maxIter: int, 最大迭代次数
output:
x: np.ndarray, 解向量
errors: np.ndarray, 误差序列
"""
from numpy import dot
from numpy.linalg import norm
x0=np.zeros(b.shape)
L=-1*np.tril(A,k=-1).copy()
U=-1*np.triu(A,k=1).copy()
D=np.diag(np.diag(A)).copy()
Dinv=np.linalg.inv(D)
errors=[]
for i in range(maxIter):
x_next=dot(Dinv,(dot((L+U),x0)+b))
# error check
error=norm(b-dot(A,x_next),2)/norm(b,2)
errors.append(error)
if error<tol:
return x_next,np.array(errors)
else:
x0=x_next
- 验证
import numpy as np
from formu_lib import *
A=np.array([[2,-1,0],
[-1,3,-1],
[0,-1,2]])
b=np.array([1,8,-5])
extractVal=np.array([2,3,-1])
x,er=JacobiIter(A,b)
plotLines([list(range(len(er))),],[er,],["Jacobi iter error"])
showError(x,extractVal)
数值解: [ 1.9999746 2.99999435 -1.0000254 ],
精确解: [ 2 3 -1],
误差: 9.719103983280175e-06
标签:迭代,Python,线性方程组,dot,error,np,import,ndarray
From: https://www.cnblogs.com/aksoam/p/18346473