【数值计算方法】线性方程组迭代算法的Python实现
cnblogs 2024-08-07 10:43:00 阅读 80
迭代求解Ax=b,python算法实现,如雅可比迭代法,高斯迭代法,SOR迭代法等等
线性方程组迭代算法的Python实现
jacobi迭代法
<code>
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)
<code>数值解: [ 1.9999746 2.99999435 -1.0000254 ],
精确解: [ 2 3 -1],
误差: 9.719103983280175e-06
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。