数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3451|回复: 3

[求助][讨论]MATLAB实现最速下降法

[复制链接]
发表于 2005-5-17 02:05:28 | 显示全部楼层 |阅读模式
<>这个程序是一本美国的数值方法教材上提供的,但是我没有成功地运行出来!</P>
<>希望有高手指点迷津,本人在此先谢谢了!</P>
<>程序清单如下:</P>
<P>function [p0,y0,err,P]=grads(F,G,P0,maxl,delta,epsilon,show)<BR>%input -F is the object function input as string 'F'<BR>%      -G=(-1/norm)(grad F)*grad F;the search direction <BR>%       input as a string 'G'<BR>%      -P0 is the initial strating point  <BR>%      -maxl is the maximum number of interctions<BR>%      -delta is the tolerance for the hmin in the single <BR>%       parameter minuization in the search direction <BR>%      -epsilon is the tolerance for the error in y0<BR>%      -show;if show==1 the iterations are display <BR>%Output-P0 is the point of minium <BR>%      -y0 is the function value F(P0)<BR>%      -err is error bound for y0<BR>%      -P is a vector containing the iterations<BR>if nargin==5,show=0;end <BR>[m,n]=size(P0);<BR>maxj=10;big=1e8;h=1;<BR>P=zeros(maxj,n+1);<BR>len=norm(P0);<BR>y0=feval(F,P0);<BR>if(len&gt;1e4),h=len/le4;end<BR>err=1;cnt=0;cond=0;<BR>P(cnt+1,=[P0 y0];<BR>while(cnt&lt;maxl&amp;cond~=5&amp;(h&gt;delta|err&lt;epsilon))<BR>    %Compute search direction <BR>    S=feval(G,P0);<BR>    %Start single parameter quadratic minimization<BR>    P1=P0+h*S;<BR>    P2=P0+2*h*S;<BR>    y1=feval(F,P1);<BR>    y2=feval(F,P2);<BR>    cond=0;j=0;<BR>    while(j&lt;maxj&amp;cond==0)<BR>        len=norm(P0);<BR>        if(y0&lt;y1)<BR>            P2=P1;<BR>            y2=y1;<BR>            h=h/2;<BR>            P1=P0+h*S;<BR>            y1=feval(F,P1);<BR>        else<BR>            if(y2&lt;y1)<BR>                P1=P2;<BR>                y1=y2;<BR>                h=2*h;<BR>                P2=P0+2*h*S;<BR>                y2=feval(F,P2);<BR>            else<BR>                cond=-1;<BR>            end<BR>        end<BR>        j=j+1;<BR>        if(h&lt;delta),cond=1;end<BR>        if(abs(h)&gt;big|len&gt;big),cond=5;end<BR>    end<BR>    <BR>    if(cond==5)<BR>        Pmin=P1;<BR>        ymin=y1;<BR>    else<BR>        d=4*y1-2*y0-2*y2;<BR>        if(d&lt;0)<BR>            hmin=h*(4*y1-2*y0-2*y2)/d;<BR>        else<BR>            cond=4;<BR>            hmin=h/3;<BR>        end<BR>        %constrcuct the next point<BR>        Pmin=P0+hmin*S;<BR>        ymin=feval(F,Pmin);<BR>        %Determine magitude of next h<BR>        h0=abs(hmin);<BR>        h1=abs(hmin-h);<BR>        h2=abs(hmin-2*h);<BR>        if(h0&lt;h),h=h0;end<BR>        if(h1&lt;h),h=h1;end<BR>        if(h2&lt;h),h=h2;end<BR>        if(h==0),h=hmin;end<BR>        if(h&lt;delta),cond=1;end<BR>        %Terination test for minization <BR>        e0=abs(y0-ymin);<BR>        e1=abs(y1-ymin);<BR>        e2=abs(y2-ymin);<BR>        if(e0~=0&amp;e0&lt;err),err=e0;end<BR>        if(e1~=0&amp;e1&lt;err),err=e1;end<BR>        if(e2~=0&amp;e2&lt;err),err=e2;end<BR>        if(e0==0&amp;e1==0&amp;e2==0),err=0;end<BR>        if(err&lt;epsilon),cond=2;end<BR>        if(cond==2&amp;h&lt;delta),cond=3;end<BR>    end<BR>    cnt=cnt+1;<BR>    P(cnt+1,=[Pmin ymin];<BR>    P0=Pmin;<BR>    y0=ymin;<BR>end<BR>if(show==1)<BR>    disp(P);<BR>end </P>
发表于 2005-5-17 06:11:53 | 显示全部楼层
你用的F是二次函数吗,是不是没收敛
 楼主| 发表于 2005-5-18 07:10:09 | 显示全部楼层
<>谢谢斑竹的答复!</P>
<>请问斑竹,就是能不能举一个例子,来运行这个程序呢?</P>
<>或者你能不能用编写基于matlab最速下降法的代码</P>
发表于 2005-7-24 22:30:18 | 显示全部楼层
请问楼上的兄弟,有没有关于数学建模的matlab程序例子,比较难一点.
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 12:51 , Processed in 0.061692 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表