diff --git a/doc/dynare.texi b/doc/dynare.texi index 6d6a34df3b3e775a8eaa191444c0eb6734d064f1..9599feaf8e81f7ee3e0dc60894f90a7553ff1667 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -3729,6 +3729,9 @@ the square submatrix of the right Schur vectors corresponding to the forward looking variables (jumpers) and to the explosive eigenvalues must have full rank. +Note that the outcome may be different from what would be suggested by +@code{sum(abs(oo_.dr.eigval))} when eigenvalues are very close to @ref{qz_criterium}. + @optionshead @table @code @@ -4348,6 +4351,7 @@ exogenous variables are made available in @code{oo_.exo_simul} (@pxref{oo_.exo_simul}). Default: @code{0}. @item qz_criterium = @var{DOUBLE} +@anchor{qz_criterium} Value used to split stable from unstable eigenvalues in reordering the Generalized Schur decomposition used for solving 1^st order problems. Default: @code{1.000001} (except when estimating with diff --git a/matlab/check.m b/matlab/check.m index f97a758f49ccd8fa355b5e78982faa6171a0148c..d1755fbb18c6bbdec8101930d27029e8e4e4eceb 100644 --- a/matlab/check.m +++ b/matlab/check.m @@ -78,7 +78,6 @@ end eigenvalues_ = dr.eigval; [m_lambda,i]=sort(abs(eigenvalues_)); -n_explod = nnz(abs(eigenvalues_) > options.qz_criterium); % Count number of forward looking variables if ~options.block @@ -91,7 +90,7 @@ else end result = 0; -if (nyf == n_explod) && (dr.full_rank) +if (nyf == dr.edim) && (dr.full_rank) result = 1; end @@ -101,7 +100,7 @@ if options.noprint == 0 disp(sprintf('%16s %16s %16s\n','Modulus','Real','Imaginary')) z=[m_lambda real(eigenvalues_(i)) imag(eigenvalues_(i))]'; disp(sprintf('%16.4g %16.4g %16.4g\n',z)) - disp(sprintf('\nThere are %d eigenvalue(s) larger than 1 in modulus ', n_explod)); + disp(sprintf('\nThere are %d eigenvalue(s) larger than 1 in modulus ', dr.edim)); disp(sprintf('for %d forward-looking variable(s)',nyf)); skipline() if result diff --git a/matlab/dyn_first_order_solver.m b/matlab/dyn_first_order_solver.m index c74786f82f082178811483f0ff5fff683c4e57c0..f262a61a1bfb3974e96031169969da489b87831c 100644 --- a/matlab/dyn_first_order_solver.m +++ b/matlab/dyn_first_order_solver.m @@ -202,6 +202,9 @@ else return end + dr.sdim = sdim; % Number of stable eigenvalues. + dr.edim = length(dr.eigval)-sdim; % Number of exposive eigenvalues. + nba = nd-sdim; if task==1 diff --git a/matlab/resol.m b/matlab/resol.m index 8cee960d5d56e144ab64541657f631015872a968..e58eb7e1ba34de2316c1c2526a4914a3451ccf54 100644 --- a/matlab/resol.m +++ b/matlab/resol.m @@ -140,6 +140,8 @@ end if options.block [dr,info,M,options,oo] = dr_block(dr,check_flag,M,options,oo); + dr.edim = nnz(abs(dr.eigval) > options.qz_criterium); + dr.sdim = dr.nd-dr.edim; else [dr,info] = stochastic_solvers(dr,check_flag,M,options,oo); end diff --git a/matlab/stochastic_solvers.m b/matlab/stochastic_solvers.m index 9b62f5a46679ff5559c5ed92953d1d2e568143c4..587641023e4f8145470ecc97c93db787a1d820d0 100644 --- a/matlab/stochastic_solvers.m +++ b/matlab/stochastic_solvers.m @@ -232,10 +232,11 @@ if M_.maximum_endo_lead == 0 end dr.eigval = eig(kalman_transition_matrix(dr,nstatic+(1:nspred),1:nspred,M_.exo_nbr)); dr.full_rank = 1; - if any(abs(dr.eigval) > options_.qz_criterium) + dr.edim = nnz(abs(dr.eigval) > options_.qz_criterium); + dr.sdim = nd-dr.edim; + if dr.edim temp = sort(abs(dr.eigval)); - nba = nnz(abs(dr.eigval) > options_.qz_criterium); - temp = temp(nd-nba+1:nd)-1-options_.qz_criterium; + temp = temp(dr.sdim+1:nd)-1-options_.qz_criterium; info(1) = 3; info(2) = temp'*temp; end