diff --git a/matlab/backward/simul_backward_linear_model.m b/matlab/backward/simul_backward_linear_model.m
index 0a454a697..da055a2bb 100644
--- a/matlab/backward/simul_backward_linear_model.m
+++ b/matlab/backward/simul_backward_linear_model.m
@@ -38,7 +38,15 @@ function simulations = simul_backward_linear_model(varargin)
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see .
-[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, nx, ny1, iy1, jdx, model_dynamic, y] = ...
+if M_.maximum_lead
+ error('Model defined in %s.mod is not backward.', M_.fname)
+end
+
+if M_.maximum_lag
+ error('Model defined in %s.mod is not backward.', M_.fname)
+end
+
+[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, nx, ny1, iy1, jdx, model_dynamic] = ...
simul_backward_model_init(varargin{:});
[ysim, xsim] = simul_backward_linear_model_(initialconditions, samplesize, DynareOptions, DynareModel, DynareOutput, innovations, nx, ny1, iy1, jdx, model_dynamic);
diff --git a/matlab/backward/simul_backward_model.m b/matlab/backward/simul_backward_model.m
index ab1aedcf7..7345cf289 100644
--- a/matlab/backward/simul_backward_model.m
+++ b/matlab/backward/simul_backward_model.m
@@ -41,6 +41,12 @@ if M_.maximum_lead
error('Model defined in %s.mod is not backward or static.', M_.fname)
end
+if ~M_.maximum_lag
+ dprintf('Model defined in %s.mod is static. Use simul_static_model instead.', M_.fname)
+ simul_static_model(samplesize, innovations);
+ return
+end
+
if nargin<3
Innovations = [];
else
diff --git a/matlab/backward/simul_backward_nonlinear_model.m b/matlab/backward/simul_backward_nonlinear_model.m
index 75966638e..048d85e4d 100644
--- a/matlab/backward/simul_backward_nonlinear_model.m
+++ b/matlab/backward/simul_backward_nonlinear_model.m
@@ -38,7 +38,15 @@ function simulations = simul_backward_nonlinear_model(varargin)
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see .
-[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, nx, ny1, iy1, jdx, model_dynamic, y] = ...
+if M_.maximum_lead
+ error('Model defined in %s.mod is not backward.', M_.fname)
+end
+
+if M_.maximum_lag
+ error('Model defined in %s.mod is not backward.', M_.fname)
+end
+
+[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, ~, ~, iy1, ~, model_dynamic] = ...
simul_backward_model_init(varargin{:});
[ysim, xsim] = simul_backward_nonlinear_model_(initialconditions, samplesize, DynareOptions, DynareModel, DynareOutput, innovations, iy1, model_dynamic);
diff --git a/matlab/simul_static_model.m b/matlab/simul_static_model.m
new file mode 100644
index 000000000..05667766d
--- /dev/null
+++ b/matlab/simul_static_model.m
@@ -0,0 +1,105 @@
+function simulation = simul_static_model(samplesize, innovations)
+
+% Simulates a stochastic static model (with arbitrary precision).
+%
+% INPUTS
+% - samplesize [integer] scalar, number of periods for the simulation.
+% - innovations [dseries] innovations to be used for the simulation.
+%
+% OUTPUTS
+% - simulation [dseries] Simulated endogenous and exogenous variables.
+%
+% REMARKS
+% [1] The innovations used for the simulation are saved in DynareOutput.exo_simul, and the resulting paths for the endogenous
+% variables are saved in DynareOutput.endo_simul.
+% [2] The last input argument is not mandatory. If absent we use random draws and rescale them with the informations provided
+% through the shocks block.
+
+% Copyright (C) 2019 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare. If not, see .
+
+global M_ options_ oo_
+
+if M_.maximum_lag
+ error('%s.mod has lagged variables, but it should be a static model.', M_.fname)
+end
+
+if M_.maximum_lead
+ error('%s.mod has leaded variables, but it should be a static model.', M_.fname)
+end
+
+% Set innovations.
+if nargin<2 || isempty(innovations)
+ % Set the covariance matrix of the structural innovations.
+ variances = diag(M_.Sigma_e);
+ number_of_shocks = length(M_.Sigma_e);
+ positive_var_indx = find(variances>0);
+ effective_number_of_shocks = length(positive_var_indx);
+ covariance_matrix = M_.Sigma_e(positive_var_indx,positive_var_indx);
+ covariance_matrix_upper_cholesky = chol(covariance_matrix);
+ % Set seed to its default state.
+ if options_.bnlms.set_dynare_seed_to_default
+ set_dynare_seed('default');
+ end
+ % Simulate structural innovations.
+ switch options_.bnlms.innovation_distribution
+ case 'gaussian'
+ oo_.bnlms.shocks = randn(samplesize, effective_number_of_shocks)*covariance_matrix_upper_cholesky;
+ otherwise
+ error('%s distribution for the structural innovations is not (yet) implemented!', options_.bnlms.innovation_distribution)
+ end
+ % Put the simulated innovations in DynareOutput.exo_simul.
+ oo_.exo_simul = zeros(samplesize, number_of_shocks);
+ oo_.exo_simul(:,positive_var_indx) = oo_.bnlms.shocks;
+ innovations = [];
+else
+ if innovations.nobs