数学建模社区-数学中国
标题:
最速下降法与牛顿法结合求无约束最优值(mtlab动画演示)
[打印本页]
作者:
风奔跑
时间:
2008-1-25 22:53
标题:
最速下降法与牛顿法结合求无约束最优值(mtlab动画演示)
<p>哈哈,我已经实现了最速下降法语牛顿发的结合,并且还可以动画演示其求解最优值的迭代过程。都已在程序上实现了。(matlab).运行的时,最速下降精度不要弄得太小,到后面的牛顿精度就可以取任意值了。</p><p>
! P# q; u* T- \ P
</p><p>tic</p><p>clc;clear;<br/>syms x1 x2<br/>G=[];<br/>G=input('请输入想x1^2,x2^2,x1*x2,x1,x2,常系数,如[1,2,3,4,5,6] 系数向量=:');<br/>a=G(1,1);b=G(1,2);c=G(1,3);d=G(1,4);e=G(1,5);g=G(1,6);<br/>f=a*x1^2+b*x2^2+c*x1*x2+d*x1+e*x2+g;</p><p>%画出原始图像<br/>figure;<br/>x11=-100:0.5:100;<br/>x22=x11;<br/>[x11,x22]=meshgrid(x11,x22);<br/>f11=a.*x11.^2+b*x22.^2+c*x11.*x22+d.*x11+e.*x22+g;<br/>surf(f11),grid on,hold on;<br/>%画出原始图像</p><p>df1=diff(f,x1);df2=diff(f,x2);%对函数进行求一阶导<br/>DF=[df1;df2];<br/>df11=diff(df1,x1);df12=diff(df1,x2);<br/>df21=diff(df2,x1);df22=diff(df2,x2);%这里进行求函数二阶导数<br/>DEE=[df11,df12;df21,df22];<br/>x=input('请输入x的初始值为x=[x1,x2],x=:');<br/>x=x';<br/>E=input('请输入你所要求的最速下降法的精度数(一般取3~5)E=:');</p><p>%这里进行一些相关初始值的计算<br/>T=[];<br/>d=T;<br/>T(:,1)=subs(DF,[x1,x2],[x(1),x(2)]);<br/>TH=subs(DEE,[x1,x2],[x(1),x(2)]);<br/>%这里进行一些相关初始值的计算</p><p>disp('由于你输入的初始值,这里将开始最速下降法搜寻:');<br/> for k=1:100000<br/> d(:,1)=-T(:,1);%d(k)是x(k+1)=x(k)+A(k)*d(k)<br/> A(1)=(T(:,1)'*T(:,1))/(T(:,1)'*TH*T(:,1));<br/> TH=subs(DEE,[x1,x2],[x(1,k),x(2,k)]);<br/> T(:,k)=subs(DF,[x1,x2],[x(1,k),x(2,k)]);<br/> d(:,k+1)=-T(:,k);<br/>
& u2 c* Z3 u, P, R' F
<br/> A(k)=(T(:,k)'*T(:,k))/(T(:,k)'*TH*T(:,k));<br/>
6 P8 Y6 k |3 Z( \' K- T) c
<br/> KLJ(:,k)=norm(T(:,k));<br/> GG(k)=subs(f,[x1,x2],[x(1,k),x(2,k)]);<br/> if norm(T(:,k))<E<br/> disp('有这里你就进入牛顿法求最优了');<br/> disp(' ');<br/> disp('FX就是最速下的解 ')<br/> FX=subs(f,[x1,x2],[x(1,k),x(2,k)])<br/> disp(' ');<br/> disp('对应的x值为 ');<br/> x(:,k)<br/> break;<br/> end<br/> x(:,k+1)=x(:,k)+A(k)*d(:,k);<br/> end<br/>
6 m0 e; y- ]" Q1 W% S; S
<br/>toc<br/>%画出最速下降迭代点最终停留位置<br/>figure;<br/>plot3(x11,x22,f11,'r'),grid on;<br/>for tk=1:k<br/>h1=line( 'Color' ,[0 1 0], 'Marker' , '.' , 'MarkerSize' ,20, 'EraseMode' , 'xor' ); <br/>set(h1, 'xdata' ,x(1,tk), 'ydata' ,x(2,tk), 'zdata' , GG(tk));<br/>drawnow; % 刷新屏幕<br/>pause(0.1);<br/>end<br/>fop1=getframe(gcf)<br/>image(fop1.cdata)<br/>%画出最速下降迭代点最终停留位置<br/>tic<br/>Y=x(:,k);<br/>EE=input('请输入牛顿最终的精度系数EE=:');<br/>TT(:,1)=subs(DF,[x1,x2],[Y(1),Y(2)]);<br/>THH=subs(DEE,[x1,x2],[Y(1),Y(2)]);<br/>aa=1;<br/>disp('程序可以运行到这里');<br/>for kk=1:10000<br/> dd(:,kk)=-inv(THH)*TT(:,kk);<br/> Y(:,kk+1)=Y(:,kk)+ aa*dd(:,kk);<br/> THH=subs(DEE,[x1,x2],[Y(1,kk),Y(2,kk)]);<br/> TT(:,kk+1)=subs(DF,[x1,x2],[Y(1,kk+1),Y(2,kk+1)]);<br/> PP=norm(TT(:,kk));<br/> GG1(kk)=subs(f,[x1,x2],[Y(1,kk),Y(2,kk)]);<br/> if PP<EE<br/> disp('到这里您已经得到全局最优解了');<br/> FXX=subs(f,[x1,x2],[Y(1,kk),Y(2,kk)])<br/> disp(' ');<br/> disp('对应的x值为: ');<br/> Y(:,kk)<br/> break;<br/> end<br/>end<br/>FXX=subs(f,[x1,x2],[Y(1,kk),Y(2,kk)])</p><p>toc<br/>%画出最终极值点停留位置<br/>figure;<br/>plot3(x11,x22,f11,'r'),grid on;<br/>for J=1:kk<br/>h2=line( 'Color' ,[0 1 0], 'Marker' , '.' , 'MarkerSize' ,40, 'EraseMode' , 'xor' ); <br/>set(h2, 'xdata' ,Y(1,J), 'ydata' ,Y(2,J), 'zdata' , GG1(1,J));<br/>pause(0.1);</p><p>fop=getframe(gcf);<br/>image(fop.cdata);<br/>end<br/>disp('现在程序已经结束了');<br/>%画出最终极值点停留位置</p><p>
1 m% P6 _! e- i1 u: |3 {( d5 ]
</p>[attach]3912[/attach]<br/>
zuiyouhua.txt.txt
2008-1-25 22:53 上传
点击文件名下载附件
下载积分: 体力 -2 点
3.07 KB, 下载次数: 67, 下载积分: 体力 -2 点
zuiyouhua.txt
作者:
liwenhui
时间:
2008-1-28 12:25
<p>高手!</p>
作者:
风奔跑
时间:
2008-3-2 22:46
注意刚开始的最速下降的精度取:5~3之间较好
作者:
madio
时间:
2008-3-3 17:48
能说说是怎样将两个方法结合的?是怎样的思路?
作者:
风奔跑
时间:
2008-3-14 21:24
<p>我的思路是这样的: 最速下降法能找出全局最优点,但在接近最优点的区域内就会陷入“齿型”迭代中,使其每进行一步迭代都要花掉非常久的时间,这样长久的等待是无法忍受的,不信你就在我那个程序的第一步迭代中把精度取得很小如:0.000000001等,其实我等过一个钟都没有什么结果出来。</p><p>再者我们考究一下 牛顿迭代法求最优问题,牛顿法相对最速下降法的速度就快得多了,而且还有一个好处就是能高度逼近最优值,而不会出现死等待的现象。 如后面的精度,你可以取如:0.0000000000001等。</p><p></p><p>但是牛顿法也有缺点,就是要求的初始值非常严格,如果取不好,逼近的最优解将不收敛,甚至不是最优解。 就算收敛也不能保证那个结就是全局最优解,所以我们的出发点应该是:为牛顿法找到一个好的初始点,而且这个初始点应该是在全局最优点附近,这个初始点就能保证牛顿法高精度收敛到最优点,而且速度还很快。</p><p>思路概括如下:</p><p>1。用最速下降法在大范围找到一个好的初始点给牛顿法:(最速下降法在精度不是很高的情况下逼近速度也是蛮快的)</p><p>2。在最优点附近改用牛顿法,用最速下降法找到的点为牛顿法的初始点,提高逼近速度与精度。</p><p>3。这样两种方法相结合,既能提高逼近的精度,还能提高逼近的速度,而且还能保证是全局最优点。这就充分吸收各自的优点,扬长避短。得到理想的结果了。</p><p>不知我的回答满意吗?</p><p></p><p></p>
作者:
madio
时间:
2008-3-14 21:57
为什么不用拟牛顿方法呢?使用牛顿法需要二阶导数信息,在最优解附近是否能满足呢?
作者:
风奔跑
时间:
2008-3-14 22:53
恩,是有这个问题,我也在想可能用拟牛顿方法,因为海塞矩阵在那个附近不一定能求得可逆。不过可能程序要编起来就要更麻烦些了,而且基本上我们这个程序也能得到想要的结果,特殊情况没遇到过。 不过问题确实存在,恩,我看看能不能改好些!
作者:
catjessie
时间:
2008-4-14 13:29
挺不错的想法,值得学习一下
作者:
lzh0601
时间:
2008-4-19 12:04
要仔细看下了
作者:
songsxh
时间:
2009-5-19 11:49
好东东啊,分享啦!谢谢啊!
作者:
小宇宙
时间:
2009-6-27 13:39
谢谢 谢谢 谢谢
作者:
小宇宙
时间:
2009-6-27 13:39
谢谢 谢谢 谢谢
作者:
liudao
时间:
2009-11-16 20:31
挺不错的想法,值得学习一下
作者:
hellosky
时间:
2009-11-24 23:35
bucuo 不错,借鉴了,我还没怎么搞懂呢
作者:
lirui0081
时间:
2009-12-2 21:55
厉害·~!~!~!~!~!
作者:
阿鑫
时间:
2009-12-21 18:45
高手,学习学习。
作者:
yinfeiyangfang
时间:
2010-1-7 22:12
回复
11#
小宇宙
4 J1 M: \( Z6 e" v, Y0 X% m8 Z
- q. b! Y0 ~7 f% l$ M W; ^+ C
0 y- Z3 Z- ]8 W, N3 T
谢谢 谢谢 谢谢(本文来自于数学中国社区,网址为
http://www.madio.net/mcm
)
作者:
congyirui
时间:
2010-1-22 21:47
你那个程序我试了一下,很人性化,很完美,太强大了!
作者:
suxiangshiwoha
时间:
2010-6-7 23:54
哇~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
作者:
咫尺天涯
时间:
2010-6-9 10:45
厉害!!!!!!!!!!!!!!!!
作者:
shuihanjian
时间:
2010-8-19 11:41
楼主好厉害呀。。
作者:
bqlzhouwang
时间:
2012-3-16 15:16
楼主好人。。。
作者:
love卿251314
时间:
2012-3-30 08:24
牛人啊 高手。。。。。。
作者:
snowkiss20
时间:
2015-8-21 14:20
好像不错!~~~
* i4 c" P v, U3 d$ v
作者:
snowkiss20
时间:
2015-8-21 14:20
好像不错!~~~
1 Y$ l# M4 \1 |3 s+ c- I( D# Q
作者:
snowkiss20
时间:
2015-8-21 14:20
好像不错!~~~
# ]5 A% B- ^ |) t v4 d3 N9 F
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5