https://github.com/ruqihuang/AdjointFmaps
Tip revision: d41efaa1636fb8cc0da8f09d89f4a1cae0172320 authored by ruqihuang on 24 August 2017, 07:39:27 UTC
Update readme
Update readme
Tip revision: d41efaa
autoHess.m
function [f,g,H] = autoHess(x,type,funObj,varargin)
% Numerically compute Hessian of objective function from gradient values
p = length(x);
if type == 1
% Use finite differencing
mu = 2*sqrt(1e-12)*(1+norm(x));
[f,g] = funObj(x,varargin{:});
diff = zeros(p);
for j = 1:p
e_j = zeros(p,1);
e_j(j) = 1;
[f diff(:,j)] = funObj(x + mu*e_j,varargin{:});
end
H = (diff-repmat(g,[1 p]))/mu;
elseif type == 3 % Use Complex Differentials
mu = 1e-150;
diff = zeros(p);
for j = 1:p
e_j = zeros(p,1);
e_j(j) = 1;
[f(j) diff(:,j)] = funObj(x + mu*i*e_j,varargin{:});
end
f = mean(real(f));
g = mean(real(diff),2);
H = imag(diff)/mu;
else % Use central differencing
mu = 2*sqrt(1e-12)*(1+norm(x));
f1 = zeros(p,1);
f2 = zeros(p,1);
diff1 = zeros(p);
diff2 = zeros(p);
for j = 1:p
e_j = zeros(p,1);
e_j(j) = 1;
[f1(j) diff1(:,j)] = funObj(x + mu*e_j,varargin{:});
[f2(j) diff2(:,j)] = funObj(x - mu*e_j,varargin{:});
end
f = mean([f1;f2]);
g = mean([diff1 diff2],2);
H = (diff1-diff2)/(2*mu);
end
% Make sure H is symmetric
H = (H+H')/2;
if 0 % DEBUG CODE
[fReal gReal HReal] = funObj(x,varargin{:});
[fReal f]
[gReal g]
[HReal H]
pause;
end