(四)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

 

posted on 2018-05-14 16:46  Aaron12  阅读(874)  评论(0编辑  收藏  举报

导航