(四)BFGS
与DFP算法相比,BFGS算法性能更完善,是求解无约束非线性规划问题最常用的方法之一。
BFGS的核心公式和推导过程与DFP类似,只是互换了S(k)和Y(k)的位置
主要算法实现如下:
function [xk,val,k]=bfgs(x0) % BFGS算法求解无约束问题:min f(x) % x0初始点,fun,dfun分别是目标函数和梯度值,e是要求的精度 % x是最优点 val是最优值,k是迭代次数 maxk=500;%最大迭代次数 rho=0.55; sigma=0.4;epsilon=1.0e-5; k=0;n=length(x0);x=x0; Bk=eye(n);%Bk=feval('hessen',x0); while(k<maxk) gk=gfun(x0);%计算梯度值 if(norm(gk)<epsilon)%终止条件 break; end dk=-Bk\gk; m=0;mk=0; while (m<20) newf=fun(x0+rho^m*dk); oldf=fun(x0); if(newf<oldf+sigma*rho^m*gk'*dk) mk=m;break; end m=m+1; end %BFGS校正 xk=x0+rho^mk*dk; sk=xk-x0; yk=gfun(xk)-gk; if(yk'*sk>0) Bk=Bk-(Bk*sk*sk'*Bk)/(sk'*Bk*sk)+(yk*yk')/(yk'*sk); end k=k+1; x0=xk; end val=fun(x0); end
目标函数:
%目标函数 function f=fun(x) f=10*(x(1)^2-x(2))^2+(x(1)-1)^2; end
目标函数的梯度:
%目标函数的梯度 gradient function gf=gfun(x) gf=[40*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-20*(x(1)^2-x(2))]'; end