Updated simulation routine for nonlinear backward models.

Changes necessary for the latest patches on dynare_solve (solve_algo={12,14}).
time-shift
Stéphane Adjemian (Charybdis) 2020-02-27 22:57:16 +01:00
parent 67b18710e8
commit 864d4c25c7
Signed by: stepan
GPG Key ID: 295C1FE89E17EB3C
1 changed files with 22 additions and 7 deletions

View File

@ -38,6 +38,8 @@ function [ysim, xsim] = simul_backward_nonlinear_model_(initialconditions, sampl
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
debug = false;
model_dynamic_s = str2func('dynamic_backward_model_for_simulation');
if ~isempty(innovations)
@ -46,24 +48,37 @@ end
% Simulations (call a Newton-like algorithm for each period).
for it = initialconditions.nobs+(1:samplesize)
ylag = DynareOutput.endo_simul(iy1,it-1); % Set lagged variables.
y = DynareOutput.endo_simul(:,it-1); % A good guess for the initial conditions is the previous values for the endogenous variables.
if debug
dprintf('Période t = %s.', num2str(it-initialconditions.nobs));
end
y_ = DynareOutput.endo_simul(:,it-1);
ylag = y_(iy1); % Set lagged variables.
y = y_; % A good guess for the initial conditions is the previous values for the endogenous variables.
try
if ismember(DynareOptions.solve_algo, [12,14])
[DynareOutput.endo_simul(:,it), info] = dynare_solve(model_dynamic_s, ...
y, DynareOptions, DynareModel.isloggedlhs, model_dynamic, ylag, DynareOutput.exo_simul, DynareModel.params, DynareOutput.steady_state, it);
[DynareOutput.endo_simul(:,it), info] = ...
dynare_solve(model_dynamic_s, y, DynareOptions, ...
DynareModel.isloggedlhs, DynareModel.isauxdiffloggedrhs, DynareModel.endo_names, DynareModel.lhs, ...
model_dynamic, ylag, DynareOutput.exo_simul, DynareModel.params, DynareOutput.steady_state, it);
else
[DynareOutput.endo_simul(:,it), info] = dynare_solve(model_dynamic_s, ...
y, DynareOptions, model_dynamic, ylag, DynareOutput.exo_simul, DynareModel.params, DynareOutput.steady_state, it);
[DynareOutput.endo_simul(:,it), info] = ...
dynare_solve(model_dynamic_s, y, DynareOptions, ...
model_dynamic, ylag, DynareOutput.exo_simul, DynareModel.params, DynareOutput.steady_state, it);
end
if info
error('Newton failed!')
end
catch
dprintf('Newton failed on iteration i = %s.', num2str(it-initialconditions.nobs));
DynareOutput.endo_simul(:, 1:it-1);
dprintf('Newton failed on iteration i = %s.', num2str(it-initialconditions.nobs));
if debug
for i=1:DynareModel.orig_endo_nbr
dprintf('%s \t %s -> %s', DynareModel.endo_names{i}, num2str(DynareOutput.endo_simul(i, it-1)), num2str(DynareOutput.endo_simul(i, it)))
end
end
break
end
end
ysim = DynareOutput.endo_simul(1:DynareModel.orig_endo_nbr,:);