Fixed backward model simulation routines.

(cherry picked from commit 45a14d768d)
time-shift
Stéphane Adjemian (Scylla) 2017-07-29 11:28:28 +02:00
parent 1cd20acd7d
commit 8e6fd310c3
2 changed files with 37 additions and 15 deletions

View File

@ -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

View File

@ -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;