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 endend 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 endendminx=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

评论