【摘要】 第十二课 共轭梯度法解方程
运行上一篇的程序得到的结果表明,最陡下降法与迄今为止所其它迭代方法比较,在迭代次数上没有竞争力。然而,如果从根本上改进与[A]相互“共轭”的下降向量。于是,引入了满足以下关系的“下降向量” 按照我的个人理解,共轭梯度法不仅在试解上做修正,还在误差值上做改进,这样做的目的是为了提高迭代效率 最陡下降法将被改进为, 算例依然采用高斯赛德尔的例…
第十二课 共轭梯度法解方程
运行上一篇的程序得到的结果表明,最陡下降法与迄今为止所其它迭代方法比较,在迭代次数上没有竞争力。然而,如果从根本上改进与[A]相互“共轭”的下降向量。于是,引入了满足以下关系的“下降向量”
按照我的个人理解,共轭梯度法不仅在试解上做修正,还在误差值上做改进,这样做的目的是为了提高迭代效率
最陡下降法将被改进为,
算例依然采用高斯赛德尔的例子
程序代码如下:分别为一个主程序和一个检查收敛的子程序checkit
主程序
#线性联立方程的共轭梯度法
import numpy as np
import math
import B
n=3
converged=np.array([False])
p=np.zeros((n,1))
r=np.zeros((n,1))
u=np.zeros((n,1))
xnew=np.zeros((n,1))
a=np.array([[16,4,8],[4,5,-4],[8,-4,22]],dtype=np.float)
b=np.array([[4],[2],[5]],dtype=np.float)
x=np.array([[1],[1],[1]],dtype=np.float)
tol=1.0e-5
limit=100
print('系数矩阵')
print(a[:])
print('右手边向量',b[:,0])
print('初始猜测值',x[:,0])
r[:]=b[:]-np.dot(a,x)
p[:]=r[:]
print('前几次迭代值')
iters=0
while(True): iters=iters+1 u[:]=np.dot(a,p) up=np.dot(np.transpose(r),r) alpha=up/np.dot(np.transpose(p),u) xnew[:]=x[:]+p[:]*alpha r[:]=r[:]-u[:]*alpha beta=np.dot(np.transpose(r),r)/up p[:]=r[:]+p[:]*beta if iters<5: print(x[:,0]) B.checkit(xnew,x,tol,converged) if converged==True or iters==limit: break x[:,0]=xnew[:,0]
print('到收敛需要迭代次数',iters)
print('解向量',x[:,0])
checkit
def checkit(loads,oldlds,tol,converged):
#检查前后两个量的收敛性
neq=loads.shape[0]
big=0.0 converged[:]=True
for i in range(1,neq+1): if abs(loads[i-1,0])>big: big=abs(loads[i-1,0])
for i in range(1,neq+1): if abs(loads[i-1,0]-oldlds[i-1,0])/big>tol: converged[:]=False
终端输出结果:
程序结果与计算结果一致,而且只需要4次迭代,可见共轭梯度法的高效性。
文章来源: blog.csdn.net,作者:深渊潜航,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/seventonight/article/details/115862847
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END