From 893a0ef8adb168daa52409e326a8d296d4003d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= <stephane.adjemian@univ-lemans.fr> Date: Mon, 30 Dec 2013 15:41:06 +0100 Subject: [PATCH] Cosmetic/Efficiency changes. --- matlab/sim1.m | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/matlab/sim1.m b/matlab/sim1.m index ac01d2beb..0eb131cb4 100644 --- a/matlab/sim1.m +++ b/matlab/sim1.m @@ -34,6 +34,7 @@ global M_ options_ oo_ endogenous_terminal_period = options_.endogenous_terminal_period; vperiods = options_.periods*ones(1,options_.simul.maxit); +azero = options_.dynatol.f/1e7; lead_lag_incidence = M_.lead_lag_incidence; @@ -83,7 +84,11 @@ z = Y(find(lead_lag_incidence')); A = sparse([],[],[],periods*ny,periods*ny,periods*nnz(jacobian)); res = zeros(periods*ny,1); - + +o_periods = periods; + +ZERO = zeros(length(i_upd),1); + h1 = clock ; for iter = 1:options_.simul.maxit h2 = clock ; @@ -109,8 +114,9 @@ for iter = 1:options_.simul.maxit if endogenous_terminal_period && iter>1 dr = max(abs(d1)); - if 10000*dr<options_.dynatol.f && 100*max(abs(res(i_rows(end)+1:end)))<options_.dynatol.f + if dr<azero vperiods(iter) = it; + periods = it-M_.maximum_lag; break end end @@ -124,6 +130,7 @@ for iter = 1:options_.simul.maxit end err = max(abs(res)); + if options_.debug fprintf('\nLargest absolute residual at iteration %d: %10.3f\n',iter,err); if any(isnan(res)) || any(isinf(res)) || any(isnan(Y)) || any(isinf(Y)) @@ -131,13 +138,14 @@ for iter = 1:options_.simul.maxit end skipline() end + if err < options_.dynatol.f stop = 1 ; break end if endogenous_terminal_period && iter>1 - dy = zeros(length(i_upd),1); + dy = ZERO; dy(1:i_rows(end)) = -A(1:i_rows(end),1:i_rows(end))\res(1:i_rows(end)); else dy = -A\res; @@ -148,7 +156,8 @@ for iter = 1:options_.simul.maxit end if endogenous_terminal_period - err = evaluate_max_dynamic_residual(model_dynamic, Y, oo_.exo_simul, params, steady_state, periods, ny, max_lag, lead_lag_incidence); + err = evaluate_max_dynamic_residual(model_dynamic, Y, oo_.exo_simul, params, steady_state, o_periods, ny, max_lag, lead_lag_incidence); + periods = o_periods; end -- GitLab