* 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-bf33cf982152
time-shift
stepan 2010-01-10 14:36:45 +00:00
parent 139491219b
commit 3c4d69ace2
4 changed files with 40 additions and 112 deletions

View File

@ -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{:});

View File

@ -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

View File

@ -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;

View File

@ -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;