From b58eaa8e2b869f894b480c371ba60e14cf6ede7e Mon Sep 17 00:00:00 2001 From: Michel Juillard <michel.juillard@mjui.fr> Date: Fri, 18 Nov 2011 22:12:36 +0100 Subject: [PATCH] introducing new test for 0/0 case in mjdgges --- matlab/DsgeLikelihood.m | 2 +- matlab/dr1.m | 10 +++++++--- matlab/print_info.m | 2 +- mex/sources/mjdgges/mjdgges.c | 10 +++++++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/matlab/DsgeLikelihood.m b/matlab/DsgeLikelihood.m index e2099fca1..c282e500f 100644 --- a/matlab/DsgeLikelihood.m +++ b/matlab/DsgeLikelihood.m @@ -259,7 +259,7 @@ Model.H = H; [T,R,SteadyState,info,Model,DynareOptions,DynareResults] = dynare_resolve(Model,DynareOptions,DynareResults,'restrict'); % Return, with endogenous penalty when possible, if dynare_resolve issues an error code (defined in resol). -if info(1) == 1 || info(1) == 2 || info(1) == 5 || info(1) == 22 || info(1) == 24 +if info(1) == 1 || info(1) == 2 || info(1) == 5 || info(1) == 7 || info(1) == 22 || info(1) == 24 fval = penalty+1; info = info(1); exit_flag = 0; diff --git a/matlab/dr1.m b/matlab/dr1.m index 2058ebef3..f717c03cb 100644 --- a/matlab/dr1.m +++ b/matlab/dr1.m @@ -290,9 +290,13 @@ else % use original Dynare solver mexErrCheck('mjdgges', err); if info1 - info(1) = 2; - info(2) = info1; - info(3) = size(e,2); + if info1 == -30 + info(1) = 7; + else + info(1) = 2; + info(2) = info1; + info(3) = size(e,2); + end return end diff --git a/matlab/print_info.m b/matlab/print_info.m index a6784396f..015b2003e 100644 --- a/matlab/print_info.m +++ b/matlab/print_info.m @@ -49,7 +49,7 @@ if ~noprint error(['The Jacobian matrix evaluated at the steady state contains elements ' ... 'that are not real or are infinite']) case 7 - error(['One of the eigenvalues is is close to 0/0 (the absolute ' ... + error(['One of the eigenvalues is close to 0/0 (the absolute ' ... 'value of numerator and denominator is smaller than 1e-6)']) case 19 error('The steadystate file did not compute the steady state') diff --git a/mex/sources/mjdgges/mjdgges.c b/mex/sources/mjdgges/mjdgges.c index e42b8234c..bbd91a40c 100644 --- a/mex/sources/mjdgges/mjdgges.c +++ b/mex/sources/mjdgges/mjdgges.c @@ -60,7 +60,15 @@ mjdgges(double *a, double *b, double *z, double *n, double *sdim, double *eval_r pei = eval_i; for (per = eval_r; per <= &eval_r[i_n-1]; ++per) { - *per = *par / *pb; + if ((fabs(*par) > 1e-6) || (fabs(*pb) > 1e-6)) + *per = *par / *pb; + else + { + /* the ratio is too close to 0/0; + returns specific error number only if no other error */ + if (i_info == 0) + *info = -30; + } if (*pai == 0.0 && *pb == 0.0) *pei = 0.0; else -- GitLab