r1 = b-A*x0
p = r1
n = 0
for i=1:rank(A) %以下过程可参考算法流程
if(dot(p,A*p) <1.0e-50) %循环结束条件
break
end
alpha = dot(r1,r1)/dot(p,A*p)
x = x0+ alpha*p
r2 = r1- alpha*A*p
if(r2 <1.0e-50)%循环结束条件
break
end
belta = dot(r2,r2)/dot(r1,r1)
p = r2+belta*p
n = n + 1
end
function [x,n]= preconjgrad (A,b,x0,M,eps) %预处理共轭梯度法求线性方程组Ax=b的解
if nargin == 4
eps = 1.0e-6
end
r1 = b-A*x0
iM = inv(M)
z1 = iM*r1
p = z1
n = 0
tol= 1
while tol>=eps
alpha = dot(r1,z1)/dot(p,A*p)
x = x0 + alpha*p
r2 = r1 - alpha*A*p
z2 = iM*r2
belta = dot(r2,z2)/dot(r1,z1)
p = z2+belta*p
n = n + 1
tol = norm(x-x0)
x0 = x %更新迭代值
r1 = r2
z1 = z2
end
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 共轭梯度法最早是又Hestenes和Stiefle(1952)提出来的,用于解正定系数矩阵的线性方程组,在这个基础上,Fletcher和Reeves(1964)首先提出了解非线性最优化问题的共轭梯度法。由于共轭梯度法不需要矩阵存储,且有较快的收敛速度和二次终止性等优点,现在共轭梯度法已经广泛地应用与实际问题中。 共轭梯度法是一个典型的共轭方向法,它的每一个搜索方向是互相共轭的,而这些搜索方向d仅仅是负梯度方向与上一次迭代的搜索方向的组合,因此,存储量少,计算方便欢迎分享,转载请注明来源:内存溢出
评论列表(0条)