BFGS校正和DFP校正的拟牛顿法

      牛顿法成功的关键是利用了Hesse矩阵提供的曲率信息,但计算二阶导矩阵也就是Hesse矩阵工作量大,难以计算,在拟牛顿法中,我们运用目标函数值和一阶导数信息来构造函数的近似曲率

理论原理以及推导(代码在末尾)

 上面的式子近似于拉格朗日展开,其中B_{k}矩阵是在迭代过程中需要我们不断去校正的Hesse近似矩阵,我们需要找到B_{k}矩阵的规律

 上式为拉格朗日展开式,其中g_{k}为一阶导数矩阵,G_{k}为Hesse矩阵,我们对上式两边同时求导   可得:             

   

进一步:

 我们从上面的式子得到了Hesse矩阵的规律B_{k} s^{k}=y^{k}  H_{k}^{-1}=B_{k};现在我们需要一种简单快捷的计算H_{k}的方式,构造H_{k+1}=H_{k}+auu^{T}+bvv^{T};  其中a,b表示常数,u,v未知,我们需要让上面式子满足条件:当H_{k}在满足拟牛顿法时,通过上述构造的等式推出的H_{k+1}也满足拟牛顿法,显然u=s_{k},v=H_{k}y_{k},则类似于合并同类项也可推出a=\frac{1}{u^{T}y_{k}},b=\frac{-1}{v^{T}y_{k}},以上可以推出近似Hesse矩阵的推导公式为:

这就是所谓的DFP校正的拟牛顿法,而类似的,BFGS校正法也利用同样的构造,得出的B_{k}推导公式(具体推导不在演示):

 代码部分

 根据上述理论原理,对于具体问题展开代码(matlab实现)

f(x1,x2)=x1^{2}+2*x2^{2}-2*x1*x2-4*x1

初始点为x=(1,1),精度为1e-5

% function [k,x0]=DFP(x0,ess)
clc;clear;close all;
x0=[1,1]';
ess=1e-5;
pause(1);
syms x1 x2 a;
H=[1,0;0,1];% 初始H矩阵一般为单位阵
k=1;
f=x1^2+2*x2^2-2*x1*x2-4*x1;
%求导
fx=diff(f,x1);
fy=diff(f,x2);
gk=[fx,fy]';
gk2=1;
while ((norm(gk2)>ess)&&(k<10))
    gk1=subs(gk,[x1,x2],x0')
    d=-H*gk1;
    xk=x0+a*d;
    fk1=subs(f,[x1,x2],xk');
    fk2=diff(fk1,a);
    a0=solve(fk2,a);
    x3=subs(xk,a,a0);
    gk2=subs(gk,[x1,x2],x3');
    s=x3-x0;y=gk2-gk1;
    H=H+(s*s')/(s'*y)-(H*y*y'*H)/(y'*H*y);
    x0=x3;
    k=k+1
end
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的女友叫苏苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值