2012-06-08 14:46:44 +02:00
function sim1 ( )
2006-10-29 18:27:48 +01:00
% function sim1
2012-06-04 17:23:14 +02:00
% Performs deterministic simulations with lead or lag on one period.
% Uses sparse matrices.
2006-10-29 18:27:48 +01:00
%
% INPUTS
% ...
% OUTPUTS
% ...
% ALGORITHM
2012-06-04 17:23:14 +02:00
% ...
2006-10-29 18:27:48 +01:00
%
% SPECIAL REQUIREMENTS
% None.
2008-08-01 14:40:33 +02:00
2013-06-12 16:42:09 +02:00
% Copyright (C) 1996-2013 Dynare Team
2008-08-01 14:40:33 +02: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
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
2005-02-18 20:54:39 +01:00
global M_ options_ oo_
2013-12-27 18:35:53 +01:00
endogenous_terminal_period = options_ . endogenous_terminal_period ;
vperiods = options_ . periods * ones ( 1 , options_ . simul . maxit ) ;
2013-12-30 15:41:06 +01:00
azero = options_ . dynatol . f / 1e7 ;
2013-12-27 18:35:53 +01:00
2006-01-12 11:21:40 +01:00
lead_lag_incidence = M_ . lead_lag_incidence ;
2012-06-04 17:23:14 +02:00
ny = M_ . endo_nbr ;
max_lag = M_ . maximum_endo_lag ;
2006-01-12 11:21:40 +01:00
nyp = nnz ( lead_lag_incidence ( 1 , : ) ) ;
2012-06-04 17:23:14 +02:00
iyp = find ( lead_lag_incidence ( 1 , : ) > 0 ) ;
ny0 = nnz ( lead_lag_incidence ( 2 , : ) ) ;
iy0 = find ( lead_lag_incidence ( 2 , : ) > 0 ) ;
2006-01-12 11:21:40 +01:00
nyf = nnz ( lead_lag_incidence ( 3 , : ) ) ;
iyf = find ( lead_lag_incidence ( 3 , : ) > 0 ) ;
2012-06-04 17:23:14 +02:00
nd = nyp + ny0 + nyf ;
nrc = nyf + 1 ;
2005-02-18 20:54:39 +01:00
isp = [ 1 : nyp ] ;
is = [ nyp + 1 : ny + nyp ] ;
isf = iyf + nyp ;
isf1 = [ nyp + ny + 1 : nyf + nyp + ny + 1 ] ;
stop = 0 ;
2006-01-12 11:21:40 +01:00
iz = [ 1 : ny + nyp + nyf ] ;
2005-02-18 20:54:39 +01:00
2013-05-23 11:52:28 +02:00
periods = options_ . periods ;
2012-06-04 17:23:14 +02:00
steady_state = oo_ . steady_state ;
params = M_ . params ;
endo_simul = oo_ . endo_simul ;
exo_simul = oo_ . exo_simul ;
i_cols_1 = nonzeros ( lead_lag_incidence ( 2 : 3 , : ) ' ) ;
i_cols_A1 = find ( lead_lag_incidence ( 2 : 3 , : ) ' ) ;
i_cols_T = nonzeros ( lead_lag_incidence ( 1 : 2 , : ) ' ) ;
2013-01-18 17:02:15 +01:00
i_cols_0 = nonzeros ( lead_lag_incidence ( 2 , : ) ' ) ;
i_cols_A0 = find ( lead_lag_incidence ( 2 , : ) ' ) ;
2012-06-04 17:23:14 +02:00
i_cols_j = 1 : nd ;
i_upd = ny + ( 1 : periods * ny ) ;
Y = endo_simul ( : ) ;
2013-12-28 17:41:36 +01:00
skipline ( )
2005-02-18 20:54:39 +01:00
disp ( [ ' -----------------------------------------------------' ] ) ;
2013-10-06 20:22:20 +02:00
fprintf ( ' MODEL SIMULATION:\n' ) ;
2005-02-18 20:54:39 +01:00
2012-06-04 17:23:14 +02:00
model_dynamic = str2func ( [ M_ . fname , ' _dynamic' ] ) ;
z = Y ( find ( lead_lag_incidence ' ) ) ;
[ d1 , jacobian ] = model_dynamic ( z , oo_ . exo_simul , params , ...
2013-07-11 20:53:15 +02:00
steady_state , M_ . maximum_lag + 1 ) ;
2012-06-04 17:23:14 +02:00
A = sparse ( [ ] , [ ] , [ ] , periods * ny , periods * ny , periods * nnz ( jacobian ) ) ;
res = zeros ( periods * ny , 1 ) ;
2013-12-30 15:41:06 +01:00
o_periods = periods ;
ZERO = zeros ( length ( i_upd ) , 1 ) ;
2005-02-18 20:54:39 +01:00
h1 = clock ;
2013-10-09 13:06:06 +02:00
for iter = 1 : options_ . simul . maxit
2008-10-21 17:33:51 +02:00
h2 = clock ;
2012-06-04 17:23:14 +02:00
i_rows = 1 : ny ;
i_cols = find ( lead_lag_incidence ' ) ;
i_cols_A = i_cols ;
2013-12-27 18:35:53 +01:00
2013-07-11 20:53:15 +02:00
for it = ( M_ . maximum_lag + 1 ) : ( M_ . maximum_lag + periods )
2012-06-04 17:23:14 +02:00
2013-12-27 18:35:53 +01:00
[ d1 , jacobian ] = model_dynamic ( Y ( i_cols ) , exo_simul , params , steady_state , it ) ;
2013-07-11 20:53:15 +02:00
if it == M_ . maximum_lag + periods && it == M_ . maximum_lag + 1
2013-01-18 17:02:15 +01:00
A ( i_rows , i_cols_A0 ) = jacobian ( : , i_cols_0 ) ;
2013-07-11 20:53:15 +02:00
elseif it == M_ . maximum_lag + periods
2012-06-04 17:23:14 +02:00
A ( i_rows , i_cols_A ( i_cols_T ) ) = jacobian ( : , i_cols_T ) ;
2013-07-11 20:53:15 +02:00
elseif it == M_ . maximum_lag + 1
2013-01-18 17:02:15 +01:00
A ( i_rows , i_cols_A1 ) = jacobian ( : , i_cols_1 ) ;
2012-06-04 17:23:14 +02:00
else
A ( i_rows , i_cols_A ) = jacobian ( : , i_cols_j ) ;
end
res ( i_rows ) = d1 ;
2013-12-27 18:35:53 +01:00
if endogenous_terminal_period && iter > 1
dr = max ( abs ( d1 ) ) ;
2013-12-30 15:41:06 +01:00
if dr < azero
2013-12-27 18:35:53 +01:00
vperiods ( iter ) = it ;
2013-12-30 15:41:06 +01:00
periods = it - M_ . maximum_lag ;
2013-12-27 18:35:53 +01:00
break
end
end
2012-06-04 17:23:14 +02:00
i_rows = i_rows + ny ;
i_cols = i_cols + ny ;
2013-12-27 18:35:53 +01:00
2013-07-11 20:53:15 +02:00
if it > M_ . maximum_lag + 1
2012-06-04 17:23:14 +02:00
i_cols_A = i_cols_A + ny ;
end
2008-10-21 17:33:51 +02:00
end
2012-06-04 17:23:14 +02:00
err = max ( abs ( res ) ) ;
2013-12-30 15:41:06 +01:00
2013-10-06 20:22:20 +02:00
if options_ . debug
fprintf ( ' \nLargest absolute residual at iteration %d: %10.3f\n' , iter , err ) ;
if any ( isnan ( res ) ) || any ( isinf ( res ) ) || any ( isnan ( Y ) ) || any ( isinf ( Y ) )
fprintf ( ' \nWARNING: NaN or Inf detected in the residuals or endogenous variables.\n' ) ;
end
skipline ( )
end
2013-12-30 15:41:06 +01:00
2011-12-12 11:34:27 +01:00
if err < options_ . dynatol . f
2008-10-21 17:33:51 +02:00
stop = 1 ;
break
end
2012-06-04 17:23:14 +02:00
2013-12-27 18:35:53 +01:00
if endogenous_terminal_period && iter > 1
2013-12-30 15:41:06 +01:00
dy = ZERO ;
2013-12-27 18:35:53 +01:00
dy ( 1 : i_rows ( end ) ) = - A ( 1 : i_rows ( end ) , 1 : i_rows ( end ) ) \ res ( 1 : i_rows ( end ) ) ;
else
dy = - A \ res ;
end
2012-06-04 17:23:14 +02:00
Y ( i_upd ) = Y ( i_upd ) + dy ;
2005-02-18 20:54:39 +01:00
end
2013-12-28 17:41:36 +01:00
if endogenous_terminal_period
2013-12-30 15:41:06 +01:00
err = evaluate_max_dynamic_residual ( model_dynamic , Y , oo_ . exo_simul , params , steady_state , o_periods , ny , max_lag , lead_lag_incidence ) ;
periods = o_periods ;
2013-12-28 17:41:36 +01:00
end
2012-06-04 17:23:14 +02:00
2013-10-06 20:22:20 +02:00
if stop
if any ( isnan ( res ) ) || any ( isinf ( res ) ) || any ( isnan ( Y ) ) || any ( isinf ( Y ) )
oo_ . deterministic_simulation . status = 0 ; % NaN or Inf occurred
oo_ . deterministic_simulation . error = err ;
oo_ . deterministic_simulation . iterations = iter ;
2013-12-27 18:35:53 +01:00
oo_ . deterministic_simulation . periods = vperiods ( 1 : iter ) ;
2013-10-06 20:22:20 +02:00
oo_ . endo_simul = reshape ( Y , ny , periods + 2 ) ;
skipline ( ) ;
fprintf ( ' \nSimulation terminated after %d iterations.\n' , iter ) ;
2013-12-28 17:41:36 +01:00
fprintf ( ' Total time of simulation: %16.13f\n' , etime ( clock , h1 ) ) ;
2014-05-12 12:14:28 +02:00
fprintf ( ' WARNING: Simulation terminated with NaN or Inf in the residuals or endogenous variables. There is most likely something wrong with your model.\n' ) ;
2013-10-06 20:22:20 +02:00
else
skipline ( ) ;
fprintf ( ' \nSimulation concluded successfully after %d iterations.\n' , iter ) ;
2013-12-28 17:41:36 +01:00
fprintf ( ' Total time of simulation: %16.13f\n' , etime ( clock , h1 ) ) ;
fprintf ( ' Max. Abs. Error : %16.13f\n' , err ) ;
fprintf ( ' Convergency obtained!\n' ) ;
2013-10-06 20:22:20 +02:00
oo_ . deterministic_simulation . status = 1 ; % Convergency obtained.
oo_ . deterministic_simulation . error = err ;
oo_ . deterministic_simulation . iterations = iter ;
2013-12-27 18:35:53 +01:00
oo_ . deterministic_simulation . periods = vperiods ( 1 : iter ) ;
2013-10-06 20:22:20 +02:00
oo_ . endo_simul = reshape ( Y , ny , periods + 2 ) ;
end
elseif ~ stop
skipline ( ) ;
fprintf ( ' \nSimulation terminated after %d iterations.\n' , iter ) ;
2013-12-28 17:41:36 +01:00
fprintf ( ' Total time of simulation: %16.13f\n' , etime ( clock , h1 ) ) ;
fprintf ( ' Max. Abs. Error : %16.13f\n' , err ) ;
2014-04-23 15:18:33 +02:00
fprintf ( ' WARNING : maximum number of iterations is reached (modify option maxit).\n' ) ;
2008-10-21 17:33:51 +02:00
oo_ . deterministic_simulation . status = 0 ; % more iterations are needed.
oo_ . deterministic_simulation . error = err ;
2013-12-27 18:35:53 +01:00
oo_ . deterministic_simulation . periods = vperiods ( 1 : iter ) ;
2013-10-09 13:06:06 +02:00
oo_ . deterministic_simulation . iterations = options_ . simul . maxit ;
2005-02-18 20:54:39 +01:00
end
disp ( [ ' -----------------------------------------------------' ] ) ;
2013-12-27 18:35:53 +01:00
skipline ( ) ;