diff --git a/matlab/csolve.m b/matlab/csolve.m index 5f95fe128e39bb3e84060a445e93a86bc09e57ea..e6400b830b1352243cf7c426eb6f42ae4e370d7c 100644 --- a/matlab/csolve.m +++ b/matlab/csolve.m @@ -43,19 +43,23 @@ af0=sum(abs(f0)); af00=af0; itct=0; 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 randomize=1; else if ~analyticg - if isempty(varargin) - grad = (feval(FUN,x*ones(1,nv)+tvec)-f0*ones(1,nv))/delta; - else - grad = (feval(FUN,x*ones(1,nv)+tvec,varargin{:})-f0*ones(1,nv))/delta; - end +% $$$ if isempty(varargin) +% $$$ grad = (feval(FUN,x*ones(1,nv)+tvec)-f0*ones(1,nv))/delta; +% $$$ else +% $$$ grad = (feval(FUN,x*ones(1,nv)+tvec,varargin{:})-f0*ones(1,nv))/delta; +% $$$ end + grad = zeros(nv,nv); + for i=1:nv + grad(:,i) = (feval(FUN,x+tvec(:,i),varargin{:})-f0)/delta; + end else % use analytic gradient % grad=feval(gradfun,x,varargin{:}); - [f0,grad] = feval(FUN,x,varargin{:}); + [f0,grad] = feval(gradfun,x,varargin{:}); end if isreal(grad) if rcond(grad)<1e-12 diff --git a/matlab/dynare_solve.m b/matlab/dynare_solve.m index 5a18e892340ffc35218504c7f04198c60e8b3675..b63dd8c8117c6b233c5acdded2c92f710c010679 100644 --- a/matlab/dynare_solve.m +++ b/matlab/dynare_solve.m @@ -8,9 +8,10 @@ function [x,info] = dynare_solve(func,x,jacobian_flag,varargin) if options_.solve_algo == 0 if ~isempty(which('fsolve')) & sscanf(version('-release'),'%d') >= 13; options=optimset('fsolve'); - options.MaxFunEvals = 20000; + options.MaxFunEvals = 50000; + options.MaxIter = 2000; options.TolFun=1e-8; - options.Display = 'off'; + options.Display = 'iter'; if jacobian_flag options.Jacobian = 'on'; else @@ -51,7 +52,7 @@ function [x,info] = dynare_solve(func,x,jacobian_flag,varargin) error('exiting ...') end - f = 0.5*fvec'*fvec ; +% f = 0.5*fvec'*fvec ; if max(abs(fvec)) < tolf 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{:}); end 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 % fvec1 = feval(func,x,varargin{:})