zoukankan      html  css  js  c++  java
  • (四)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=-Bkgk;
        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
  • 相关阅读:
    shell加密为二进制可执行文件
    lua自写限制并发访问模块
    centos虚拟机中挂新硬盘
    lua文件修改为二进制文件
    常用一些命令方法
    常用问题处理方法
    CVE-2010-3333
    Kernel Stack Overflow(转)
    NULL Pointer Dereference(转)
    Linux内核漏洞利用-环境配置(转)
  • 原文地址:https://www.cnblogs.com/Aaron12/p/9036867.html
Copyright © 2011-2022 走看看