2.无约束优化方法子程序,至少选取Newton型方法的子程序(Newton方法
Quasi-Newton方法,包括BFGS、DFP方法。)、 最速下降方法、共轭梯度方法(至少选择PRP、FR方法中的一种)及直接方法(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);
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

评论