matlab,最速下降法

时间:2013-06-05 16:06:07

标签: matlab methods gradient

我即将解决这个等式(-cos(x).*cos(y).*exp(-((x-pi).^2+(y-pi).^2)=0。我的代码似乎适用于其他更简单的方程式,但这个方法很难实现。有什么建议吗?

clc
close
clear

[x,y] = meshgrid([-20:0.1:20],[-20:0.1:20]);
fn = (-cos(x).*cos(y).*exp(-((x-pi).^2+(y-pi).^2)));
f=@(x,y) (-cos(x).*cos(y).*exp(-((x-pi).^2+(y-pi).^2)));

h=0.001;
dfx=@(x,y) (f(x-2*h,y)-8*f(x-h,y)+8*f(x+h,y)-f(x+2*h,y))/(12*h);
dfy=@(x,y) (f(x,y-2*h)-8*f(x,y-h)+8*f(x,y+h)-f(x,y+2*h))/(12*h);
d2fx=@(x,y) (dfx(x-2*h,y)-8*dfx(x-h,y)+8*dfx(x+h,y)-dfx(x+2*h,y))/(12*h);
d2fy=@(x,y) (dfy(x,y-2*h)-8*dfy(x,y-h)+8*dfy(x,y+h)-dfy(x,y+2*h))/(12*h);
dfxfy=@(x,y) (dfx(x,y-2*h)-8*dfx(x,y-h)+8*dfx(x,y+h)-dfx(x,y+2*h))/(12*h);
dfyfx=@(x,y) (dfy(x-2*h,y)-8*dfy(x-h,y)+8*dfy(x+h,y)-dfy(x+2*h,y))/(12*h);

subplot(2,1,1)
mesh(x,y,f(x,y));
subplot(2,1,2)
contour(x,y,f(x,y))
hold on

l= 1;
dx(1) = -2;
dy(1) = -2;
k = 1;
licznik = 1;
while( 1==1 )
xg = [dfx(dx(l),dy(l))];
yg= [dfy(dx(l),dy(l))];


a=([xg;yg]'*[xg;yg])...
/([xg;yg]'*[d2fx(dx(l),dy(l)),dfxfy(dx(l),dy(l));dfyfx(dx(l),dy(l)),d2fy(dx(l),dy(l))]*[xg;yg]);
wyn = [dx(l);dy(l)]-a*[xg;yg];
dx(l+1)=wyn(1);
dy(l+1)=wyn(2);

if(abs(f(dx(l+1),dy(l+1)) -f(dx(l),dy(l)))<0.01 || l >=100)
break;
end
l=l+1;
end
plot(dx(1),dy(1),'r*')
text(dx(1),dy(1),'START')
plot(dx(2:length(dx)-1),dy(2:length(dy)-1),'g.')
plot(dx(end),dy(end),'r*')
text(dx(end),dy(end),'STOP')
for i=1:length(dx)-1
line([dx(i),dx(i+1)],[dy(i),dy(i+1)],'color','g')
end
for i=1:length(dx)
contour(x,y,f(x,y),[f(dx(i),dy(i)),f(dx(i),dy(i))])
end 

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题!显示我的无知,我以前从未见过如此平坦的功能!这是“很难去”的原因是你要解决的功能是非常平坦的,这意味着你的自适应步长变得很大,比如〜1e23。此外,EPS的容差有点太难了。 0.01非常草率,对于像这个问题一样僵硬的东西,你需要更紧缩的东西。我只是为了好玩而扔了1e-100,它继续像1次迭代一样迭代,一直到80!它仍然是一个糟糕的解决方案,但我认为你可以放心,你的程序是正确的。我注意到当它超出太远时,例如-4,-4,由于x和y的镜像值,误差变为0。

My Plot Output

由于问题看起来如此僵硬,您可能需要考虑一种更强大的技术来计算自适应步长。 HTH!