* Efficiency change in numgrad (two, three and five points formulas) files. Do not evaluate the objective function at x, this is already
done in csminwel.m or in csminit.m. * Fixed bug in the calling sequence of numgrad5.m (five points formula) in csminwel.m. * Cosmetic changes. git-svn-id: https://www.dynare.org/svn/dynare/trunk@3334 ac1d8469-bf42-47a9-8791-bf33cf982152time-shift
parent
139491219b
commit
3c4d69ace2
|
@ -23,7 +23,7 @@ function [fh,xh,gh,H,itct,fcount,retcodeh] = csminwel(fcn,x0,H0,grad,crit,nit,me
|
|||
% http://sims.princeton.edu/yftp/optimize/mfiles/csminwel.m
|
||||
|
||||
% Copyright (C) 1993-2007 Christopher Sims
|
||||
% Copyright (C) 2006-2008 Dynare Team
|
||||
% Copyright (C) 2006-2008, 2010 Dynare Team
|
||||
%
|
||||
% This file is part of Dynare.
|
||||
%
|
||||
|
@ -63,6 +63,7 @@ snit=100;
|
|||
%end
|
||||
|
||||
[f0,cost_flag] = feval(fcn,x0,varargin{:});
|
||||
|
||||
if ~cost_flag
|
||||
disp('Bad initial parameter.')
|
||||
return
|
||||
|
@ -71,11 +72,13 @@ end
|
|||
if NumGrad
|
||||
switch method
|
||||
case 2
|
||||
[g,badg] = numgrad(fcn,x0, varargin{:});
|
||||
[g,badg] = numgrad(fcn, f0, x0, varargin{:});
|
||||
badg
|
||||
g
|
||||
case 3
|
||||
[g,badg] = numgrad3(fcn,x0, varargin{:});
|
||||
[g,badg] = numgrad3(fcn, f0, x0, varargin{:});
|
||||
case 5
|
||||
[g,badg] = numgrad5(fcn,x0, varargin{:});
|
||||
[g,badg] = numgrad5(fcn, f0, x0, varargin{:});
|
||||
end
|
||||
else
|
||||
[g,badg] = feval(grad,x0,varargin{:});
|
||||
|
@ -118,11 +121,11 @@ while ~done
|
|||
if NumGrad
|
||||
switch method
|
||||
case 2
|
||||
[g1 badg1] = numgrad(fcn, x1,varargin{:});
|
||||
[g1 badg1] = numgrad(fcn, f1, x1, varargin{:});
|
||||
case 3
|
||||
[g1 badg1] = numgrad3(fcn, x1,varargin{:});
|
||||
[g1 badg1] = numgrad3(fcn, f1, x1, varargin{:});
|
||||
case 5
|
||||
[g1,badg1] = numgrad5(fcn,x0, varargin{:});
|
||||
[g1,badg1] = numgrad5(fcn, f1, x1, varargin{:});
|
||||
end
|
||||
else
|
||||
[g1 badg1] = feval(grad,x1,varargin{:});
|
||||
|
@ -152,11 +155,11 @@ while ~done
|
|||
if NumGrad
|
||||
switch method
|
||||
case 2
|
||||
[g2 badg2] = numgrad(fcn, x2,varargin{:});
|
||||
[g2 badg2] = numgrad(fcn, f2, x2, varargin{:});
|
||||
case 3
|
||||
[g2 badg2] = numgrad3(fcn, x2,varargin{:});
|
||||
[g2 badg2] = numgrad3(fcn, f2, x2, varargin{:});
|
||||
case 5
|
||||
[g2,badg2] = numgrad5(fcn,x0, varargin{:});
|
||||
[g2,badg2] = numgrad5(fcn, f2, x2, varargin{:});
|
||||
end
|
||||
else
|
||||
[g2 badg2] = feval(grad,x2,varargin{:});
|
||||
|
@ -187,11 +190,11 @@ while ~done
|
|||
if NumGrad
|
||||
switch method
|
||||
case 2
|
||||
[g3 badg3] = numgrad(fcn, x3,varargin{:});
|
||||
[g3 badg3] = numgrad(fcn, f3, x3, varargin{:});
|
||||
case 3
|
||||
[g3 badg3] = numgrad3(fcn, x3,varargin{:});
|
||||
[g3 badg3] = numgrad3(fcn, f3, x3, varargin{:});
|
||||
case 5
|
||||
[g3,badg3] = numgrad5(fcn,x0, varargin{:});
|
||||
[g3,badg3] = numgrad5(fcn, f3, x3, varargin{:});
|
||||
end
|
||||
else
|
||||
[g3 badg3] = feval(grad,x3,varargin{:});
|
||||
|
@ -251,11 +254,11 @@ while ~done
|
|||
if NumGrad
|
||||
switch method
|
||||
case 2
|
||||
[gh,badgh] = numgrad(fcn,xh,varargin{:});
|
||||
[gh,badgh] = numgrad(fcn, fh, xh, varargin{:});
|
||||
case 3
|
||||
[gh,badgh] = numgrad3(fcn,xh,varargin{:});
|
||||
[gh,badgh] = numgrad3(fcn, fh, xh, varargin{:});
|
||||
case 5
|
||||
[gh,badgh] = numgrad5(fcn,xh,varargin{:});
|
||||
[gh,badgh] = numgrad5(fcn, fh, xh, varargin{:});
|
||||
end
|
||||
else
|
||||
[gh badgh] = feval(grad, xh,varargin{:});
|
||||
|
|
103
matlab/numgrad.m
103
matlab/numgrad.m
|
@ -1,11 +1,11 @@
|
|||
function [g, badg] = numgrad(fcn,x,varargin)
|
||||
function [g, badg] = numgrad(fcn,f0,x,varargin)
|
||||
% function [g badg] = numgrad(fcn,xvarargin)
|
||||
|
||||
% Original file downloaded from:
|
||||
% http://sims.princeton.edu/yftp/optimize/mfiles/numgrad.m
|
||||
|
||||
% Copyright (C) 1993-2007 Christopher Sims
|
||||
% Copyright (C) 2008 Dynare Team
|
||||
% Copyright (C) 2008, 2010 Dynare Team
|
||||
%
|
||||
% This file is part of Dynare.
|
||||
%
|
||||
|
@ -22,108 +22,39 @@ function [g, badg] = numgrad(fcn,x,varargin)
|
|||
% You should have received a copy of the GNU General Public License
|
||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
fh = NaN;
|
||||
|
||||
delta = 1e-6;
|
||||
%delta=1e-2;
|
||||
n=length(x);
|
||||
tvec=delta*eye(n);
|
||||
g=zeros(n,1);
|
||||
%--------------------old way to deal with variable # of P's--------------
|
||||
%tailstr = ')';
|
||||
%stailstr = [];
|
||||
%for i=nargin-2:-1:1
|
||||
% tailstr=[ ',P' num2str(i) tailstr];
|
||||
% stailstr=[' P' num2str(i) stailstr];
|
||||
%end
|
||||
%f0 = eval([fcn '(x' tailstr]); % Is there a way not to do this?
|
||||
%---------------------------------------------------------------^yes
|
||||
[f0,cost_flag] = feval(fcn, x, varargin{:});
|
||||
%f0 = eval([fcn '(x,varargin{:})']);
|
||||
% disp(' first fcn in numgrad.m ------------------')
|
||||
%home
|
||||
% disp('numgrad.m is working. ----') % Jiinil on 9/5/95
|
||||
% sizex=size(x),sizetvec=size(tvec),x, % Jinill on 9/6/95
|
||||
|
||||
badg=0;
|
||||
goog=1;% stepan 07/07/2008
|
||||
scale=1; % stepan 07/07/2008
|
||||
goog=1;
|
||||
scale=1;
|
||||
for i=1:n
|
||||
% i,tveci=tvec(:,i)% ,plus=x+scale*tvec(:,i) % Jinill Kim on 9/6/95
|
||||
if size(x,1)>size(x,2)
|
||||
tvecv=tvec(i,:);
|
||||
else
|
||||
tvecv=tvec(:,i);
|
||||
end
|
||||
[fh,cost_flag] = feval(fcn, x+scale*transpose(tvecv), varargin{:});% stepan 07/07/2008
|
||||
if cost_flag% stepan 07/07/2008
|
||||
[fh,cost_flag] = feval(fcn, x+scale*transpose(tvecv), varargin{:});
|
||||
if cost_flag
|
||||
g0 = (fh - f0) / (scale*delta);
|
||||
else
|
||||
[fh,cost_flag] = feval(fcn, x-scale*transpose(tvecv), varargin{:});
|
||||
if cost_flag
|
||||
g0 = (f0-fh) / (scale*delta);
|
||||
else
|
||||
goog=0;
|
||||
goog = 0;
|
||||
end
|
||||
end
|
||||
% disp(' fcn in the i=1:n loop of numgrad.m ------------------')% Jinill 9/6/95
|
||||
% disp(' and i is') % Jinill
|
||||
% i % Jinill
|
||||
% fprintf('Gradient w.r.t. %3d: %10g\n',i,g0) %see below Jinill 9/6/95
|
||||
% -------------------------- special code to essentially quit here
|
||||
% absg0=abs(g0) % Jinill on 9/6/95
|
||||
if goog && abs(g0)< 1e15 % stepan 07/07/2008
|
||||
g(i)=g0;
|
||||
% disp('good gradient') % Jinill Kim
|
||||
if goog && abs(g0)< 1e15
|
||||
g(i) = g0;
|
||||
else
|
||||
disp('bad gradient ------------------------') % Jinill Kim
|
||||
% fprintf('Gradient w.r.t. %3d: %10g\n',i,g0) %see above
|
||||
g(i)=0;
|
||||
badg=1;
|
||||
% return
|
||||
% can return here to save time if the gradient will never be
|
||||
% used when badg returns as true.
|
||||
disp('bad gradient ------------------------')
|
||||
% fprintf('Gradient w.r.t. %3d: %10g\n',i,g0)
|
||||
g(i) = 0;
|
||||
badg = 1;
|
||||
end
|
||||
end
|
||||
%-------------------------------------------------------------
|
||||
% if g0 > 0
|
||||
% sided=2;
|
||||
% g1 = -(eval([fcn '(x-scale*tvec(:,i)''' tailstr]) - f0) ...
|
||||
% /(scale*delta);
|
||||
% if g1<0
|
||||
% scale = scale/10;
|
||||
% else
|
||||
% break
|
||||
% end
|
||||
% else
|
||||
% sided=1;
|
||||
% break
|
||||
% end
|
||||
% end
|
||||
% if sided==1
|
||||
% g(i)=g0;
|
||||
% else
|
||||
% if (g0<1e20)
|
||||
% if (g1>-1e20)
|
||||
% g(i)=(g0+g1)/2;
|
||||
% else
|
||||
% g(i)=0;
|
||||
% badg=1;
|
||||
% disp( ['Banging against wall, parameter ' int2str(i)] );
|
||||
% end
|
||||
% else
|
||||
% if g1>-1e20
|
||||
% if g1<0
|
||||
% g(i)=0;
|
||||
% badg=1;
|
||||
% disp( ['Banging against wall, parameter ' int2str(i)] );
|
||||
% else
|
||||
% g(i)=g1;
|
||||
% end
|
||||
% else
|
||||
% g(i)=0;
|
||||
% badg=1;
|
||||
% disp(['Valley around parameter ' int2str(i)])
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
%end
|
||||
%save g.dat g x f0
|
||||
%eval(['save g g x f0 ' stailstr]);
|
||||
end
|
|
@ -1,4 +1,4 @@
|
|||
function [g, badg, f0, f1, f2] = numgrad3(fcn,x,varargin)
|
||||
1function [g, badg, f0, f1, f2] = numgrad3(fcn,f0,x,varargin)
|
||||
% Computes the gradient of the objective function fcn using a three points
|
||||
% formula if possible.
|
||||
%
|
||||
|
@ -11,7 +11,7 @@ function [g, badg, f0, f1, f2] = numgrad3(fcn,x,varargin)
|
|||
% http://sims.princeton.edu/yftp/optimize/mfiles/numgrad.m
|
||||
|
||||
% Copyright (C) 1993-2007 Christopher Sims
|
||||
% Copyright (C) 2008 Dynare Team
|
||||
% Copyright (C) 2008, 2010 Dynare Team
|
||||
%
|
||||
% This file is part of Dynare.
|
||||
%
|
||||
|
@ -28,7 +28,6 @@ function [g, badg, f0, f1, f2] = numgrad3(fcn,x,varargin)
|
|||
% You should have received a copy of the GNU General Public License
|
||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
f0 = NaN;
|
||||
f1 = NaN;
|
||||
f2 = NaN;
|
||||
|
||||
|
@ -37,8 +36,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;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
function [g, badg, f0, f1, f2, f3, f4] = numgrad5(fcn,x,varargin)
|
||||
function [g, badg, f0, f1, f2, f3, f4] = numgrad5(fcn,f0,x,varargin)
|
||||
% Computes the gradient of the objective function fcn using a five points
|
||||
% formula if possible.
|
||||
%
|
||||
|
@ -13,7 +13,7 @@ function [g, badg, f0, f1, f2, f3, f4] = numgrad5(fcn,x,varargin)
|
|||
% http://sims.princeton.edu/yftp/optimize/mfiles/numgrad.m
|
||||
|
||||
% Copyright (C) 1993-2007 Christopher Sims
|
||||
% Copyright (C) 2008 Dynare Team
|
||||
% Copyright (C) 2008, 2010 Dynare Team
|
||||
%
|
||||
% This file is part of Dynare.
|
||||
%
|
||||
|
@ -30,7 +30,6 @@ function [g, badg, f0, f1, f2, f3, f4] = numgrad5(fcn,x,varargin)
|
|||
% You should have received a copy of the GNU General Public License
|
||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
f0 = NaN;
|
||||
f1 = NaN;
|
||||
f2 = NaN;
|
||||
f3 = NaN;
|
||||
|
@ -41,8 +40,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;
|
||||
|
|
Loading…
Reference in New Issue