2013-06-05 28 views
0

我即將解決這個方程(-cos(x).*cos(y).*exp(-((x-pi).^2+(y-pi).^2)=0。我的代碼似乎適用於其他更簡單的方程,但這個很難。有什麼建議麼?matlab,最速下降的方法

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))); 
[email protected](x,y) (-cos(x).*cos(y).*exp(-((x-pi).^2+(y-pi).^2))); 

h=0.001; 
[email protected](x,y) (f(x-2*h,y)-8*f(x-h,y)+8*f(x+h,y)-f(x+2*h,y))/(12*h); 
[email protected](x,y) (f(x,y-2*h)-8*f(x,y-h)+8*f(x,y+h)-f(x,y+2*h))/(12*h); 
[email protected](x,y) (dfx(x-2*h,y)-8*dfx(x-h,y)+8*dfx(x+h,y)-dfx(x+2*h,y))/(12*h); 
[email protected](x,y) (dfy(x,y-2*h)-8*dfy(x,y-h)+8*dfy(x,y+h)-dfy(x,y+2*h))/(12*h); 
[email protected](x,y) (dfx(x,y-2*h)-8*dfx(x,y-h)+8*dfx(x,y+h)-dfx(x,y+2*h))/(12*h); 
[email protected](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 
+0

你是什麼意思「難以去」。要儘可能具體。 – bla

回答

1

這是一個有趣的問題!顯示我的無知,我從來沒有見過這樣的平面功能!這是「很難走」的原因是,你正在解決的功能是非常平坦的,這意味着你的自適應步長變得很大,就像〜1e23一樣。另外,對EPS的容忍度有點太難。 0.01相當草率,因爲這個問題一樣僵硬,你需要一些更緊縮的東西。爲了好玩,我扔了1e-100,並且它繼續像1次迭代一樣遍歷,一直到80!這仍然是一個糟糕的解決方案,但我認爲您可以放心,您的程序是正確的。我注意到,當它過沖得太遠,例如-4,-4時,由於x和y的鏡像值,誤差變爲0。

My Plot Output

既然問題顯得是那麼的僵硬,你可能要考慮一個更強大的技術來計算自適應步長。 HTH!