牛顿法成功的关键是利用了Hesse矩阵提供的曲率信息,但计算二阶导矩阵也就是Hesse矩阵工作量大,难以计算,在拟牛顿法中,我们运用目标函数值和一阶导数信息来构造函数的近似曲率
理论原理以及推导(代码在末尾)
上面的式子近似于拉格朗日展开,其中矩阵是在迭代过程中需要我们不断去校正的Hesse近似矩阵,我们需要找到
矩阵的规律
上式为拉格朗日展开式,其中为一阶导数矩阵,
为Hesse矩阵,我们对上式两边同时求导 可得:
进一步:
我们从上面的式子得到了Hesse矩阵的规律
;现在我们需要一种简单快捷的计算
的方式,构造
; 其中a,b表示常数,u,v未知,我们需要让上面式子满足条件:当
在满足拟牛顿法时,通过上述构造的等式推出的
也满足拟牛顿法,显然
,则类似于合并同类项也可推出
,以上可以推出近似Hesse矩阵的推导公式为:
这就是所谓的DFP校正的拟牛顿法,而类似的,BFGS校正法也利用同样的构造,得出的推导公式(具体推导不在演示):
代码部分
根据上述理论原理,对于具体问题展开代码(matlab实现)
初始点为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