dynare/matlab/numgrad3.m

45 lines
1.0 KiB
Matlab
Raw Normal View History

function [g, badg] = numgrad3(fcn,x,varargin)
% Computes the gradient of the objective function fcn using a three point
% formula if possible.
%
% Adapted from Sims' numgrad routine.
%
% part of DYNARE, copyright Dynare Team (2008)
% Gnu Public License.
delta = 1e-6;
n=length(x);
tvec=delta*eye(n);
g=zeros(n,1);
[f0,cost_flag] = feval(fcn, x, varargin{:});
badg=0;
goog=1;
scale=1;
for i=1:n
if size(x,1)>size(x,2)
tvecv=tvec(i,:);
else
tvecv=tvec(:,i);
end
[f1,cost_flag1] = feval(fcn, x+scale*transpose(tvecv), varargin{:});
[f2,cost_flag2] = feval(fcn, x-scale*transpose(tvecv), varargin{:});
if cost_flag1 && cost_flag2
g0 = (f1 - f2) / (2*scale*delta);
elseif cost_flag1==1 && cost_flag2==0
g0 = (f1-f0) / (scale*delta);
elseif cost_flag1==0 && cost_flag2==1
g0 = (f0-f2) / (scale*delta);
else
goog=0;
end
if goog && abs(g0)< 1e15
g(i)=g0;
else
disp('bad gradient ------------------------')
g(i)=0;
badg=1;
end
end