26 lines
685 B
Matlab
26 lines
685 B
Matlab
function H = bfgsi(H0,dg,dx)
|
|
% H = bfgsi(H0,dg,dx)
|
|
% dg is previous change in gradient; dx is previous change in x;
|
|
% 6/8/93 version that updates inverse hessian instead of hessian
|
|
% itself.
|
|
% Copyright by Christopher Sims 1996. This material may be freely
|
|
% reproduced and modified.
|
|
if size(dg,2)>1
|
|
dg=dg';
|
|
end
|
|
if size(dx,2)>1
|
|
dx=dx';
|
|
end
|
|
Hdg = H0*dg;
|
|
dgdx = dg'*dx;
|
|
if (abs(dgdx) >1e-12)
|
|
H = H0 + (1+(dg'*Hdg)/dgdx)*(dx*dx')/dgdx - (dx*Hdg'+Hdg*dx')/dgdx;
|
|
else
|
|
disp('bfgs update failed.')
|
|
disp(['|dg| = ' num2str(sqrt(dg'*dg)) '|dx| = ' num2str(sqrt(dx'*dx))]);
|
|
disp(['dg''*dx = ' num2str(dgdx)])
|
|
disp(['|H*dg| = ' num2str(Hdg'*Hdg)])
|
|
H=H0;
|
|
end
|
|
save H.dat H
|