v4: csolve uses analytical Jacobian when possible

git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@1465 ac1d8469-bf42-47a9-8791-bf33cf982152
time-shift
michel 2007-11-27 14:16:13 +00:00
parent 05fcaed7d2
commit 522e27e636
2 changed files with 20 additions and 11 deletions

View File

@ -43,19 +43,23 @@ af0=sum(abs(f0));
af00=af0; af00=af0;
itct=0; itct=0;
while ~done while ~done
disp([af00-af0 crit*max(1,af0)]) % disp([af00-af0 crit*max(1,af0)])
if itct>3 & af00-af0<crit*max(1,af0) & rem(itct,2)==1 if itct>3 & af00-af0<crit*max(1,af0) & rem(itct,2)==1
randomize=1; randomize=1;
else else
if ~analyticg if ~analyticg
if isempty(varargin) % $$$ if isempty(varargin)
grad = (feval(FUN,x*ones(1,nv)+tvec)-f0*ones(1,nv))/delta; % $$$ grad = (feval(FUN,x*ones(1,nv)+tvec)-f0*ones(1,nv))/delta;
else % $$$ else
grad = (feval(FUN,x*ones(1,nv)+tvec,varargin{:})-f0*ones(1,nv))/delta; % $$$ grad = (feval(FUN,x*ones(1,nv)+tvec,varargin{:})-f0*ones(1,nv))/delta;
end % $$$ end
grad = zeros(nv,nv);
for i=1:nv
grad(:,i) = (feval(FUN,x+tvec(:,i),varargin{:})-f0)/delta;
end
else % use analytic gradient else % use analytic gradient
% grad=feval(gradfun,x,varargin{:}); % grad=feval(gradfun,x,varargin{:});
[f0,grad] = feval(FUN,x,varargin{:}); [f0,grad] = feval(gradfun,x,varargin{:});
end end
if isreal(grad) if isreal(grad)
if rcond(grad)<1e-12 if rcond(grad)<1e-12

View File

@ -8,9 +8,10 @@ function [x,info] = dynare_solve(func,x,jacobian_flag,varargin)
if options_.solve_algo == 0 if options_.solve_algo == 0
if ~isempty(which('fsolve')) & sscanf(version('-release'),'%d') >= 13; if ~isempty(which('fsolve')) & sscanf(version('-release'),'%d') >= 13;
options=optimset('fsolve'); options=optimset('fsolve');
options.MaxFunEvals = 20000; options.MaxFunEvals = 50000;
options.MaxIter = 2000;
options.TolFun=1e-8; options.TolFun=1e-8;
options.Display = 'off'; options.Display = 'iter';
if jacobian_flag if jacobian_flag
options.Jacobian = 'on'; options.Jacobian = 'on';
else else
@ -51,7 +52,7 @@ function [x,info] = dynare_solve(func,x,jacobian_flag,varargin)
error('exiting ...') error('exiting ...')
end end
f = 0.5*fvec'*fvec ; % f = 0.5*fvec'*fvec ;
if max(abs(fvec)) < tolf if max(abs(fvec)) < tolf
return ; return ;
@ -80,7 +81,11 @@ function [x,info] = dynare_solve(func,x,jacobian_flag,varargin)
[x,info]=solve1(func,x,1:nn,1:nn,jacobian_flag,varargin{:}); [x,info]=solve1(func,x,1:nn,1:nn,jacobian_flag,varargin{:});
end end
elseif options_.solve_algo == 3 elseif options_.solve_algo == 3
[x,info] = csolve(func,x,'grad_ss',1e-6,500,varargin{:}); if jacobian_flag
[x,info] = csolve(func,x,func,1e-6,500,varargin{:});
else
[x,info] = csolve(func,x,[],1e-6,500,varargin{:});
end
end end
% fvec1 = feval(func,x,varargin{:}) % fvec1 = feval(func,x,varargin{:})