BFGS算法及其matlab实现

 

目录

 一.前沿

二.基本思想

三.秩2校正公式

 四.算法步骤

 五.matlab程序实现


 一.前沿

上一篇文章介绍了基于秩1的拟牛顿算法,紧接上文,这次我们介绍关于秩2的拟牛顿算法,即BFGS算法。为啥叫BFGS算法,是因为这个鬼算法是由Broyden、Fletcher、Goldforb和Shanno这四个大佬发明的,BFGS校正算法是目前最流行,也是最有效的拟牛顿校正。

二.基本思想

拟牛顿法的基本思想是把牛顿法中用到的Hess阵用一个Hk矩阵来代替。那么Hk是什么呢?Hk的三个特点如下:

(1)Hk近似等于牛顿法中的Hess阵,这样可以保证拟牛顿发所产生的方向与牛顿反向近似,从而保证了拟牛顿法的收敛速度。

(2)Hk是正定的

(3)Hk的更新规则有两种,即用秩1或秩2的矩阵矫正。上篇文章介绍的是秩1算法,所以这篇文章介绍秩2算法。(秩1秩2法其实就是两个更新Hk的不同公式,应该是记住就行了吧,反正推导我也看不懂)。

三.秩2校正公式

在做matlab仿真时,H0通常用一个单位矩阵来代替。经过一次迭代后,Hk的秩2矫正公式如下(手写吧,打公式太痛苦了):

 

 四.算法步骤

步0:确定终止误差e=(0~1),设初始点x0,\delta=(0~1),\sigma=(0,0.5),初始对称正定阵H0=I(单位阵),令k=0

步1:计算gk=\bigtriangledownf(xk).若||gk||<=e,停算,输出xk作为最优解。否则,转步2

 步2:解线性方程组 Hk*dk= -gk,解出dk(即得出搜索方向)

步3:用Armjio搜索技术求步长\alphak=\delta^mk,m的值从0开始,

若f(xk+\delta ^m*dk)<=f(xk)+\alpha*\delta^m*gk'dk 

则 mk=m,步长\alphak=\delta^mk,若不满足上式,则m=m+1,直到满足上述不等式为止 

步4:令Xk+1=xk+ \alphak*dk

步5:由校正公式确定Hk+1,即上图所示。令k=k+1,转步1

 五.matlab程序实现

BFGS封装函数:

function [x,val,k]=bfgs(fun,gfun,x0,varargin)
k=0;
maxk=500;
rho=0.55;
sigma=0.4;
e=1e-5;%精度
n=length(x0);
Hk=eye(n);
while(k<maxk)
    gk=feval(gfun,x0,varargin{:});
    if(norm(gk)<e),break;end
    dk=-Hk\gk;%在后面会更新Hk
    m=0;
    mk=0;
    while(m<20)
        s=feval(fun,x0+rho^m*dk,varargin{:});
        a=feval(fun,x0)+sigma*rho^m*gk'*dk;
        if(s<a)
         mk=m;
         break;
        end
         m=m+1;
        end
        x=x0+dk*rho^mk;
        sk=x-x0;
        yk=feval(gfun,x,varargin{:})-gk;
        if(yk'*sk>0)
          Hk=Hk-(Hk*sk*sk'*Hk)/(sk'*Hk*sk)+(yk*yk')/(yk'*yk);
        end
    x0=x;
    k=k+1;
end
val=feval(fun,x0,varargin{:});
end

其中fun,gfun,main函数在上篇文章都有。

  • 21
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
BFGS算法是一种在matlab中常用的拟牛顿优化算法。在BFGS算法中,通过近似Hessian矩阵的逆来更新搜索方向,并利用线搜索确定步长。这个算法是由Broyden、Fletcher、Goldfarb和Shanno这四位大佬发明的,因此得名BFGS。 在matlab实现BFGS算法的步骤如下: 1. 初始化一些参数,包括初始解、Hessian矩阵的逆的估计、停止准则等。 2. 根据当前解计算目标函数的梯度。 3. 根据当前解和梯度计算搜索方向。 4. 利用线搜索确定步长。 5. 根据步长和搜索方向更新解。 6. 根据新的解和旧的解计算梯度变化。 7. 根据梯度变化和搜索方向更新Hessian矩阵的逆的估计。 8. 判断是否满足停止准则,如果满足则结束算法,否则返回步骤2。 这样,通过迭代更新解和Hessian矩阵的逆的估计,最终可以得到优化问题的解。 需要注意的是,在matlab实现BFGS算法时,常常会使用单位矩阵来代替Hessian矩阵的逆的初值。这是因为单位矩阵在迭代过程中可以很好地逼近真实的Hessian矩阵的逆。 综上所述,BFGS算法是一种常用的拟牛顿优化算法,在matlab中可以通过迭代更新解和Hessian矩阵的逆的估计来求解优化问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [BFGS算法及其matlab实现](https://blog.csdn.net/weixin_42332198/article/details/121236154)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [最优化建模算法理论之BFGS/DFP拟牛顿方法(数学原理及MATLAB实现)](https://blog.csdn.net/weixin_46584887/article/details/117677675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值