正文

Matlab优化程序设计(二)2007-06-30 14:11:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/emath/27226.html

分享到:

2.无约束优化方法子程序,至少选取Newton型方法的子程序(Newton方法

Quasi-Newton方法,包括BFGSDFP方法。)、 最速下降方法、共轭梯度方法(至少选择PRPFR方法中的一种)及直接方法(Powll方法,单纯形法,Rosenbrock算法等)中的一种。

function [minx,miny]=Quick(confun,x0,ep)
%函数名:Quick--最速下降法搜索目标函数之极值
%参  数:confun--目标函数名   x0--初始点   ep--精度要求
%返回值:minx--极值点  miny--极值点函数值  
[f,j]=confun(x0);
d=-j;  %方向
while 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%基于二次插值的最优步长搜索
r=1;
f0=confun(x0);
x1=x0+d;
f1=confun(x1);

if f1<f0
    x1=x0+2*r*d;
    f2=confun(x1);
    while f2<f1
        f1=f2;
        r=2*r;
        x1=x0+r*d;
        f2=confun(x1);
      
    end
     r=(4 * f1 - 3 * f0 - f2) * r / (2 * (2 * f1 - f0 - f2));
else
  
    while 1
    f2=f1;
    r=r/2;
    x1=x0+r*d;
    f1=confun(x1);
  
    if f1<f0
        break
    end
end
    r=(4 * f1 - 3 * f0 - f2) * r / (2 * (2 * f1 - f0 - f2));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    x0=x0+r*d;
    [f,j]=confun(x0);
    d=-j;
    if  norm(d) < 0.00001
        break
    end
end
minx=x0;
miny=confun(x0);

eg:

function [f,j]=Rosenbrock(x)

f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;

j=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1))  200*(x(2)-x(1)^2)]; %目标函数Jacobian

>>x0=[-1.2 1];[minx,miny]=Quick(@Rosenbrock,x0,0.00001)

>>minx =1.0000    1.0000

miny = 7.7279e-011

比较:

>> fminsearch(inline('100*(x(2)-x(1)^2)^2+(1-x(1))^2'),[-1.2;1])

ans = 1.00002202178357

      1.00004221975177

Edited by Guassfans 2007-06-30

阅读(3851) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册