From 8e6fd310c3040cc07d875036c8dce633851d0707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Scylla=29?= Date: Sat, 29 Jul 2017 11:28:28 +0200 Subject: [PATCH] Fixed backward model simulation routines. (cherry picked from commit 45a14d768d40e20904ebd055bc4893994531702b) --- matlab/backward/simul_backward_linear_model.m | 30 ++++++++++++++----- .../backward/simul_backward_nonlinear_model.m | 22 +++++++++----- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/matlab/backward/simul_backward_linear_model.m b/matlab/backward/simul_backward_linear_model.m index ccf38eb74..5f0595e46 100644 --- a/matlab/backward/simul_backward_linear_model.m +++ b/matlab/backward/simul_backward_linear_model.m @@ -42,25 +42,39 @@ function DynareOutput = simul_backward_linear_model(varargin) simul_backward_model_init(varargin{:}); % initialization of the returned simulations. -DynareOutput.endo_simul = NaN(DynareModel.endo_nbr,samplesize+1); +DynareOutput.endo_simul = NaN(DynareModel.endo_nbr,samplesize); if isempty(initialconditions) - DynareOutput.endo_simul(:,1) = DynareOutput.steady_state; + if isfield(DynareModel,'endo_histval') && ~isempty(DynareModel.endo_histval) + DynareOutput.endo_simul = [DynareModel.endo_histval, DynareOutput.endo_simul]; + else + DynareOutput.endo_simul = [zeros(DynareModel.endo_nbr, DynareModel.max_lag_orig), DynareOutput.endo_simul]; + end else - DynareOutput.endo_simul(:,1) = initialconditions; + if ~isequal(size(initialconditions, 2), DynareModel.max_lag_orig) + error(['simul_backward_linear_model:: First argument should have %s columns!'], DynareModel.max_lag_orig) + end + DynareOutput.endo_simul = [initialconditions, DynareOutput.endo_simul]; end Y = DynareOutput.endo_simul; -% get coefficients -[cst,jacob] = model_dynamic(zeros(DynareModel.endo_nbr+ny1,1), ... - zeros(2,DynareModel.exo_nbr), ... +if ~DynareModel.max_exo_lag_orig + if DynareModel.max_endo_lag_orig>1 + DynareOutput.exo_simul = [ zeros(DynareModel.max_endo_lag_orig-1, DynareModel.exo_nbr); DynareOutput.exo_simul]; + end +end + +% Get coefficients +[cst, jacob] = model_dynamic(zeros(DynareModel.endo_nbr+ny1,1), ... + zeros(DynareModel.max_lag_orig+1,DynareModel.exo_nbr), ... DynareModel.params, ... - DynareOutput.steady_state,1); + DynareOutput.steady_state, DynareModel.max_lag_orig+1); + A0inv = inv(jacob(:,jdx)); A1 = jacob(:,nonzeros(DynareModel.lead_lag_incidence(1,:))); B = jacob(:,end-nx+1:end); % Simulations -for it = 2:samplesize+1 +for it = DynareModel.max_lag_orig+(1:samplesize) Y(:,it) = -A0inv*(cst + A1*Y(iy1,it-1) + B*DynareOutput.exo_simul(it,:)'); end diff --git a/matlab/backward/simul_backward_nonlinear_model.m b/matlab/backward/simul_backward_nonlinear_model.m index 8e8b14fbf..1465eee17 100644 --- a/matlab/backward/simul_backward_nonlinear_model.m +++ b/matlab/backward/simul_backward_nonlinear_model.m @@ -44,25 +44,33 @@ function DynareOutput = simul_backward_nonlinear_model(varargin) model_dynamic_s = str2func('dynamic_backward_model_for_simulation'); % initialization of the returned simulations. -DynareOutput.endo_simul = NaN(DynareModel.endo_nbr,samplesize+1); +DynareOutput.endo_simul = NaN(DynareModel.endo_nbr, samplesize); if isempty(initialconditions) if isfield(DynareModel,'endo_histval') && ~isempty(DynareModel.endo_histval) - DynareOutput.endo_simul(:,1:DynareModel.maximum_lag) = DynareModel.endo_histval; + DynareOutput.endo_simul = [DynareModel.endo_histval, DynareOutput.endo_simul]; else - warning('simul_backward_nonlinear_model:: Initial condition is zero for all variables! If the model is nonlinear, the model simulation may fail with the default initialization') - DynareOutput.endo_simul(:,1) = 0; + warning('simul_backward_nonlinear_model:: Initial condition is zero for all variables! The model simulation may fail with the default initialization.') + DynareOutput.endo_simul = [zeros(DynareModel.endo_nbr, DynareModel.max_lag_orig), DynareOutput.endo_simul]; end else - DynareOutput.endo_simul(:,1) = initialconditions; + if ~isequal(size(initialconditions, 2), DynareModel.max_lag_orig) + error(['simul_backward_nonlinear_model:: First argument should have %s columns!'], DynareModel.max_lag_orig) + end + DynareOutput.endo_simul = [initialconditions, DynareOutput.endo_simul]; end Y = DynareOutput.endo_simul; +if ~DynareModel.max_exo_lag_orig + if DynareModel.max_endo_lag_orig>1 + DynareOutput.exo_simul = [ zeros(DynareModel.max_endo_lag_orig-1, DynareModel.exo_nbr); DynareOutput.exo_simul]; + end +end % Simulations (call a Newton-like algorithm for each period). -for it = 2:samplesize+1 +for it = DynareModel.max_lag_orig+(1:samplesize) ylag = Y(iy1,it-1); % Set lagged variables. y = Y(:,it-1); % A good guess for the initial conditions is the previous values for the endogenous variables. - Y(:,it) = dynare_solve(model_dynamic_s, y, DynareOptions, model_dynamic, ylag, DynareOutput.exo_simul, DynareModel.params, DynareOutput.steady_state, it+(DynareModel.maximum_exo_lag-1)); + Y(:,it) = dynare_solve(model_dynamic_s, y, DynareOptions, model_dynamic, ylag, DynareOutput.exo_simul, DynareModel.params, DynareOutput.steady_state, it); end DynareOutput.endo_simul = Y; \ No newline at end of file