Skip to content
Snippets Groups Projects
Commit 2937471a authored by MichelJuillard's avatar MichelJuillard
Browse files

corrected and clarified error messages when steady state computation

fails
(cherry-picked by hand from commit 48e00c57)
parent 49fa0bca
No related branches found
No related tags found
No related merge requests found
...@@ -35,7 +35,35 @@ function [x,info] = dynare_solve(func,x,jacobian_flag,varargin) ...@@ -35,7 +35,35 @@ function [x,info] = dynare_solve(func,x,jacobian_flag,varargin)
global options_ global options_
tolf = options_.solve_tolf ;
info = 0; info = 0;
% checking initial values
if jacobian_flag
[fvec,fjac] = feval(func,x,varargin{:});
else
fvec = feval(func,x,varargin{:});
fjac = zeros(nn,nn) ;
end
i = find(~isfinite(fvec));
if ~isempty(i)
disp(['STEADY: numerical initial values or parameters incompatible with the following' ...
' equations'])
disp(i')
disp('Please check for example')
disp(' i) if all parameters occurring in these equations are defined')
disp(' ii) that no division by an endogenous variable initialized to 0 occurs')
info = 1;
x = NaN;
return;
end
if max(abs(fvec)) < tolf
return ;
end
if options_.solve_algo == 0 if options_.solve_algo == 0
if ~exist('OCTAVE_VERSION') if ~exist('OCTAVE_VERSION')
if ~user_has_matlab_license('optimization_toolbox') if ~user_has_matlab_license('optimization_toolbox')
...@@ -60,7 +88,7 @@ if options_.solve_algo == 0 ...@@ -60,7 +88,7 @@ if options_.solve_algo == 0
func = @(x) func2(x, varargin{:}); func = @(x) func2(x, varargin{:});
% The Octave version of fsolve does not converge when it starts from the solution % The Octave version of fsolve does not converge when it starts from the solution
fvec = feval(func,x); fvec = feval(func,x);
if max(abs(fvec)) >= options_.solve_tolf if max(abs(fvec)) >= tolf
[x,fval,exitval,output] = fsolve(func,x,options); [x,fval,exitval,output] = fsolve(func,x,options);
else else
exitval = 3; exitval = 3;
...@@ -77,30 +105,6 @@ elseif options_.solve_algo == 1 ...@@ -77,30 +105,6 @@ elseif options_.solve_algo == 1
[x,info]=solve1(func,x,1:nn,1:nn,jacobian_flag,1,varargin{:}); [x,info]=solve1(func,x,1:nn,1:nn,jacobian_flag,1,varargin{:});
elseif options_.solve_algo == 2 || options_.solve_algo == 4 elseif options_.solve_algo == 2 || options_.solve_algo == 4
nn = size(x,1) ; nn = size(x,1) ;
tolf = options_.solve_tolf ;
if jacobian_flag
[fvec,fjac] = feval(func,x,varargin{:});
else
fvec = feval(func,x,varargin{:});
fjac = zeros(nn,nn) ;
end
i = find(~isfinite(fvec));
if ~isempty(i)
disp(['STEADY: numerical initial values incompatible with the following' ...
' equations'])
disp(i')
disp('Please check for example')
disp(' i) if all parameters occurring in these equations are defined')
disp(' ii) that no division by an endogenous variable initialized to 0 occurs')
error('exiting ...')
end
if max(abs(fvec)) < tolf
return ;
end
if ~jacobian_flag if ~jacobian_flag
fjac = zeros(nn,nn) ; fjac = zeros(nn,nn) ;
......
...@@ -55,8 +55,8 @@ if ~noprint ...@@ -55,8 +55,8 @@ if ~noprint
error('The steadystate file did not compute the steady state') error('The steadystate file did not compute the steady state')
case 20 case 20
error(['Impossible to find the steady state. Either the model' ... error(['Impossible to find the steady state. Either the model' ...
' doesn''t have a unique steady state of the guess values' ... ' doesn''t have a steady state or there is an infinity of steady states' ...
' are too far from the solution']) ' or the guess values are too far from the solution'])
case 21 case 21
error('The steady state is complex') error('The steady state is complex')
case 22 case 22
......
...@@ -58,9 +58,11 @@ fvec = fvec(j1); ...@@ -58,9 +58,11 @@ fvec = fvec(j1);
i = find(~isfinite(fvec)); i = find(~isfinite(fvec));
if ~isempty(i) if ~isempty(i)
disp(['STEADY: numerical initial values incompatible with the following' ... disp(['SOLVE1: during the resolution of the non-linear system, the evaluation of the following ' ...
' equations']) 'equation(s) resulted in a non-finite number:'])
disp(j1(i)') disp(j1(i)')
check = 1;
return;
end end
f = 0.5*fvec'*fvec ; f = 0.5*fvec'*fvec ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment