2015-12-16 11:30:15 +01:00
|
|
|
function [endogenousvariables, info] = sim1_lbj(endogenousvariables, exogenousvariables, steadystate, M, options)
|
|
|
|
|
|
|
|
% Performs deterministic simulations with lead or lag on one period using the historical LBJ algorithm
|
2012-01-28 16:17:13 +01:00
|
|
|
%
|
|
|
|
% INPUTS
|
|
|
|
% ...
|
|
|
|
% OUTPUTS
|
|
|
|
% ...
|
|
|
|
% ALGORITHM
|
2012-06-04 17:23:14 +02:00
|
|
|
% Laffargue, Boucekkine, Juillard (LBJ)
|
|
|
|
% see Juillard (1996) Dynare: A program for the resolution and
|
|
|
|
% simulation of dynamic models with forward variables through the use
|
|
|
|
% of a relaxation algorithm. CEPREMAP. Couverture Orange. 9602.
|
2012-01-28 16:17:13 +01:00
|
|
|
%
|
|
|
|
% SPECIAL REQUIREMENTS
|
|
|
|
% None.
|
|
|
|
|
2022-04-13 13:15:19 +02:00
|
|
|
% Copyright © 1996-2022 Dynare Team
|
2012-01-28 16:17:13 +01:00
|
|
|
%
|
|
|
|
% 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
|
2021-06-09 17:33:48 +02:00
|
|
|
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
|
2012-01-28 16:17:13 +01:00
|
|
|
|
2015-12-16 11:30:15 +01:00
|
|
|
lead_lag_incidence = M.lead_lag_incidence;
|
2012-01-28 16:17:13 +01:00
|
|
|
|
2015-12-16 11:30:15 +01:00
|
|
|
ny = size(endogenousvariables,1);
|
|
|
|
nyp = nnz(lead_lag_incidence(1,:));
|
|
|
|
nyf = nnz(lead_lag_incidence(3,:));
|
|
|
|
nrs = ny+nyp+nyf+1;
|
|
|
|
nrc = nyf+1;
|
|
|
|
iyf = find(lead_lag_incidence(3,:)>0);
|
|
|
|
iyp = find(lead_lag_incidence(1,:)>0);
|
|
|
|
isp = [1:nyp];
|
|
|
|
is = [nyp+1:ny+nyp];
|
|
|
|
isf = iyf+nyp;
|
|
|
|
isf1 = [nyp+ny+1:nyf+nyp+ny+1];
|
|
|
|
stop = false;
|
2012-01-28 16:17:13 +01:00
|
|
|
iz = [1:ny+nyp+nyf];
|
|
|
|
|
2018-06-27 17:02:13 +02:00
|
|
|
dynamicmodel = sprintf('%s.dynamic', M.fname);
|
2015-12-16 11:30:15 +01:00
|
|
|
|
|
|
|
verbose = options.verbosity;
|
2015-02-18 23:58:37 +01:00
|
|
|
|
|
|
|
if verbose
|
|
|
|
printline(56)
|
|
|
|
disp(['MODEL SIMULATION :'])
|
|
|
|
skipline()
|
|
|
|
end
|
2012-01-28 16:17:13 +01:00
|
|
|
|
2015-12-16 11:30:15 +01:00
|
|
|
it_init = M.maximum_lag+1;
|
|
|
|
h1 = clock;
|
2012-01-28 16:17:13 +01:00
|
|
|
|
2015-12-16 11:30:15 +01:00
|
|
|
for iter = 1:options.simul.maxit
|
|
|
|
h2 = clock;
|
|
|
|
if ~options.terminal_condition
|
|
|
|
c = zeros(ny*options.periods, nrc);
|
2012-06-04 17:23:14 +02:00
|
|
|
else
|
2015-12-16 11:30:15 +01:00
|
|
|
c = zeros(ny*(options.periods+1), nrc);
|
2012-06-04 17:23:14 +02:00
|
|
|
end
|
2015-12-16 11:30:15 +01:00
|
|
|
it_ = it_init;
|
|
|
|
z = [endogenousvariables(iyp,it_-1) ; endogenousvariables(:,it_) ; endogenousvariables(iyf,it_+1)];
|
|
|
|
[d1, jacobian] = feval(dynamicmodel, z, exogenousvariables, M.params, steadystate, it_);
|
|
|
|
jacobian = [jacobian(:,iz), -d1];
|
|
|
|
ic = [1:ny];
|
|
|
|
icp = iyp;
|
|
|
|
c (ic,:) = jacobian(:,is)\jacobian(:,isf1);
|
|
|
|
for it_ = it_init+(1:options.periods-1)
|
|
|
|
z = [endogenousvariables(iyp,it_-1) ; endogenousvariables(:,it_) ; endogenousvariables(iyf,it_+1)];
|
|
|
|
[d1, jacobian] = feval(dynamicmodel, z, exogenousvariables, M.params, steadystate, it_);
|
|
|
|
jacobian = [jacobian(:,iz), -d1];
|
|
|
|
jacobian(:,[isf nrs]) = jacobian(:,[isf nrs])-jacobian(:,isp)*c(icp,:);
|
|
|
|
ic = ic + ny;
|
|
|
|
icp = icp + ny;
|
|
|
|
c (ic,:) = jacobian(:,is)\jacobian(:,isf1);
|
2012-06-04 17:23:14 +02:00
|
|
|
end
|
2015-12-16 11:30:15 +01:00
|
|
|
if options.terminal_condition == 1
|
|
|
|
s = eye(ny);
|
|
|
|
s(:,isf) = s(:,isf)+c(ic,1:nyf);
|
|
|
|
ic = ic + ny;
|
|
|
|
c(ic,nrc) = s\c(ic,nrc);
|
|
|
|
c = bksup1(c, ny, nrc, iyf, options.periods);
|
|
|
|
c = reshape(c, ny, options.periods+1);
|
2022-03-31 17:39:43 +02:00
|
|
|
endogenousvariables(:,it_init+(0:options.periods)) = endogenousvariables(:,it_init+(0:options.periods))+c;
|
2012-06-04 17:23:14 +02:00
|
|
|
else
|
2015-12-16 11:30:15 +01:00
|
|
|
c = bksup1(c, ny, nrc, iyf, options.periods);
|
|
|
|
c = reshape(c, ny, options.periods);
|
2022-03-31 17:39:43 +02:00
|
|
|
endogenousvariables(:,it_init+(0:options.periods-1)) = endogenousvariables(:,it_init+(0:options.periods-1))+c;
|
2012-01-28 16:17:13 +01:00
|
|
|
end
|
2015-12-16 11:30:15 +01:00
|
|
|
err = max(max(abs(c./options.scalv')));
|
2015-02-18 23:58:37 +01:00
|
|
|
if verbose
|
2015-12-16 11:30:15 +01:00
|
|
|
str = sprintf('Iter: %s,\t err. = %s, \t time = %s', num2str(iter), num2str(err), num2str(etime(clock, h2)));
|
2015-02-18 23:58:37 +01:00
|
|
|
disp(str);
|
|
|
|
end
|
2015-12-16 11:30:15 +01:00
|
|
|
if err < options.dynatol.f
|
|
|
|
stop = true;
|
2015-02-18 23:58:37 +01:00
|
|
|
if verbose
|
|
|
|
skipline()
|
|
|
|
disp(sprintf('Total time of simulation: %s', num2str(etime(clock,h1))))
|
|
|
|
end
|
2015-12-16 11:30:15 +01:00
|
|
|
info.status = 1;% Convergency obtained.
|
|
|
|
info.error = err;
|
|
|
|
info.iterations = iter;
|
2012-01-28 16:17:13 +01:00
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if ~stop
|
2015-02-18 23:58:37 +01:00
|
|
|
if verbose
|
|
|
|
disp(sprintf('Total time of simulation: %s.', num2str(etime(clock,h1))))
|
|
|
|
disp('Maximum number of iterations is reached (modify option maxit).')
|
|
|
|
end
|
2015-12-16 11:30:15 +01:00
|
|
|
info.status = 0;% more iterations are needed.
|
|
|
|
info.error = err;
|
2017-05-16 15:10:20 +02:00
|
|
|
info.errors = c/abs(err);
|
2015-12-16 11:30:15 +01:00
|
|
|
info.iterations = options.simul.maxit;
|
2012-01-28 16:17:13 +01:00
|
|
|
end
|
|
|
|
|
2015-02-18 23:58:37 +01:00
|
|
|
if verbose
|
|
|
|
if stop
|
|
|
|
printline(56)
|
|
|
|
else
|
|
|
|
printline(62)
|
|
|
|
end
|
|
|
|
skipline()
|
|
|
|
end
|