共轭梯度法的MATLAB程序

共轭梯度法的MATLAB程序,第1张

共轭梯度

function f=conjugate_grad_2d(x0,t)

%please input this:conjugate_grad_2d([2,2],0.05)

x=x0

syms xi yi a

f=xi^2-xi*yi+3*yi^2

fx=diff(f,xi)

fy=diff(f,yi)

fx=subs(fx,{xi,yi},x0)

fy=subs(fy,{xi,yi},x0)

fi=[fx,fy]

count=0

while double(sqrt(fx^2+fy^2))>t

s=-fi

if count<=0

s=-fi

else

s=s1

end

x=x+a*s

f=subs(f,{xi,yi},x)

f1=diff(f)

f1=solve(f1)

if f1~=0

ai=double(f1)

else

break

x,f=subs(f,{xi,yi},x),count

end

x=subs(x,a,ai)

f=xi^2-xi*yi+3*yi^2

fxi=diff(f,xi)

fyi=diff(f,yi)

fxi=subs(fxi,{xi,yi},x)

fyi=subs(fyi,{xi,yi},x)

fii=[fxi,fyi]

d=(fxi^2+fyi^2)/(fx^2+fy^2)

s1=-fii+d*s

count=count+1

fx=fxi

fy=fyi

end

x,f=subs(f,{xi,yi},x),count

conj是matlab已有的函数,你这里的函数名也叫conj,运行时matlab会调用matlab原有的conj函数,由于输入参数过多,当然报错>>doc conj

就会看到帮助文档

conj Symbolic complex conjugate

Syntax conj(X)

Description conj(X) is the complex conjugate of X.

For a complex X, conj(X) = real(X)- i*imag(X).

所以先把函数名字和函数M文件名字改掉,再运行函数,不过我想你这里的函数体里可能仍然会报错!

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 共轭梯度法最早是又Hestenes和Stiefle(1952)提出来的,用于解正定系数矩阵的线性方程组,在这个基础上,Fletcher和Reeves(1964)首先提出了解非线性最优化问题的共轭梯度法。由于共轭梯度法不需要矩阵存储,且有较快的收敛速度和二次终止性等优点,现在共轭梯度法已经广泛地应用与实际问题中。 共轭梯度法是一个典型的共轭方向法,它的每一个搜索方向是互相共轭的,而这些搜索方向d仅仅是负梯度方向与上一次迭代的搜索方向的组合,因此,存储量少,计算方便


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11469107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存