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
评论