diff --git a/matlab/ep/ep_problem_1.m b/matlab/ep/ep_problem_1.m new file mode 100644 index 0000000000000000000000000000000000000000..51c7fb1a80e8b955b90629151913c26a082b9fa8 --- /dev/null +++ b/matlab/ep/ep_problem_1.m @@ -0,0 +1,122 @@ +function [res, A, info] = ep_problem_1(y, x, pfm) + +info = false; + +params = pfm.params; +steady_state = pfm.steady_state; +ny = pfm.ny; +periods = pfm.periods; +dynamic_model = pfm.dynamic_model; +lead_lag_incidence = pfm.lead_lag_incidence; +i_cols_1 = pfm.i_cols_1; +i_cols_j = pfm.i_cols_j; +i_cols_T = pfm.i_cols_T; +order = pfm.order; +hybrid_order = pfm.hybrid_order; +h_correction = pfm.h_correction; +nodes = pfm.nodes; +weights = pfm.weights; +nnodes = pfm.nnodes; + +i_cols_p = pfm.i_cols_p; +i_cols_s = pfm.i_cols_s; +i_cols_f = pfm.i_cols_f; +i_rows = pfm.i_rows; + +i_cols_Ap = pfm.i_cols_Ap; +i_cols_As = pfm.i_cols_As; +i_cols_Af = pfm.i_cols_Af; +i_hc = pfm.i_hc; + +Y = pfm.Y; +Y(pfm.i_upd_y) = y; + +A1 = pfm.A1; +res = pfm.res; + +for i = 1:order+1 + i_w_p = 1; + for j = 1:nnodes^(i-1) + innovation = x; + if i > 1 + innovation(i+1,:) = nodes(mod(j-1,nnodes)+1,:); + end + if i <= order + for k=1:nnodes + if hybrid_order==2 && i==order + z = [Y(i_cols_p,i_w_p); + Y(i_cols_s,j); + Y(i_cols_f,(j-1)*nnodes+k)+h_correction(i_hc)]; + else + z = [Y(i_cols_p,i_w_p); + Y(i_cols_s,j); + Y(i_cols_f,(j-1)*nnodes+k)]; + end + + [d1,jacobian] = dynamic_model(z,innovation,params,steady_state,i+1); + if i == 1 + % in first period we don't keep track of + % predetermined variables + i_cols_A = [i_cols_As - ny; i_cols_Af]; + A1(i_rows,i_cols_A) = A1(i_rows,i_cols_A) + weights(k)*jacobian(:,i_cols_1); + else + i_cols_A = [i_cols_Ap; i_cols_As; i_cols_Af]; + A1(i_rows,i_cols_A) = A1(i_rows,i_cols_A) + weights(k)*jacobian(:,i_cols_j); + end + res(:,i,j) = res(:,i,j)+weights(k)*d1; + i_cols_Af = i_cols_Af + ny; + end + else + z = [Y(i_cols_p,i_w_p); + Y(i_cols_s,j); + Y(i_cols_f,j)]; + [d1,jacobian] = dynamic_model(z,innovation,params,steady_state,i+1); + if i == 1 + % in first period we don't keep track of + % predetermined variables + i_cols_A = [i_cols_As - ny; i_cols_Af]; + A1(i_rows,i_cols_A) = jacobian(:,i_cols_1); + else + i_cols_A = [i_cols_Ap; i_cols_As; i_cols_Af]; + A1(i_rows,i_cols_A) = jacobian(:,i_cols_j); + end + res(:,i,j) = d1; + i_cols_Af = i_cols_Af + ny; + end + i_rows = i_rows + ny; + if mod(j,nnodes) == 0 + i_w_p = i_w_p + 1; + end + if i > 1 + if mod(j,nnodes) == 0 + i_cols_Ap = i_cols_Ap + ny; + end + i_cols_As = i_cols_As + ny; + end + end + i_cols_p = i_cols_p + ny; + i_cols_s = i_cols_s + ny; + i_cols_f = i_cols_f + ny; +end +nzA = cell(periods,pfm.world_nbr); +for j=1:pfm.world_nbr + i_rows_y = find(lead_lag_incidence')+(order+1)*ny; + offset_c = ny*(sum(nnodes.^(0:order-1),2)+j-1); + offset_r = (j-1)*ny; + for i=order+2:periods + [d1,jacobian] = dynamic_model(Y(i_rows_y,j), x, params, steady_state, i+1); + if i == periods + [ir,ic,v] = find(jacobian(:,i_cols_T)); + else + [ir,ic,v] = find(jacobian(:,i_cols_j)); + end + nzA{i,j} = [offset_r+ir,offset_c+pfm.icA(ic), v]'; + res(:,i,j) = d1; + i_rows_y = i_rows_y + ny; + offset_c = offset_c + pfm.world_nbr*ny; + offset_r = offset_r + pfm.world_nbr*ny; + end +end +A2 = [nzA{:}]'; +A = [A1; sparse(A2(:,1),A2(:,2),A2(:,3),ny*(periods-order-1)*pfm.world_nbr,pfm.dimension)]; +res = res(pfm.i_upd_r); diff --git a/matlab/ep/ep_problem_2.m b/matlab/ep/ep_problem_2.m index 9168631bfe5a06927da76bb836f360d2357e36b6..d94f277f8b374810675d9c8bfda99fafb43ac342 100644 --- a/matlab/ep/ep_problem_2.m +++ b/matlab/ep/ep_problem_2.m @@ -1,37 +1,37 @@ -function [res,A,info] = ep_problem_2(y,x,pm) +function [res,A,info] = ep_problem_2(y, x, pfm) -info = 0; -res = []; +info = false; A = []; -dynamic_model = pm.dynamic_model; -ny = pm.ny; -params = pm.params; -steady_state = pm.steady_state; -order = pm.order; -nodes = pm.nodes; -nnodes = pm.nnodes; -weights = pm.weights; -h_correction = pm.h_correction; -dimension = pm.dimension; -world_nbr = pm.world_nbr; -nnzA = pm.nnzA; -periods = pm.periods; -i_rows = pm.i_rows'; -i_cols = pm.i_cols; -nyp = pm.nyp; -nyf = pm.nyf; -hybrid_order = pm.hybrid_order; -i_cols_1 = pm.i_cols_1; -i_cols_j = pm.i_cols_j; -icA = pm.icA; -i_cols_T = pm.i_cols_T; -eq_index = pm.eq_index; +dynamic_model = pfm.dynamic_model; +ny = pfm.ny; +params = pfm.params; +steady_state = pfm.steady_state; +order = pfm.stochastic_order; +nodes = pfm.nodes; +nnodes = pfm.nnodes; +weights = pfm.weights; +h_correction = pfm.h_correction; +dimension = pfm.dimension; +world_nbr = pfm.world_nbr; +nnzA = pfm.nnzA; +periods = pfm.periods; +i_rows = pfm.i_rows'; +i_cols = pfm.i_cols; +nyp = pfm.nyp; +nyf = pfm.nyf; +hybrid_order = pfm.hybrid_order; +i_cols_1 = pfm.i_cols_1; +i_cols_j = pfm.i_cols_j; +icA = pfm.icA; +i_cols_T = pfm.i_cols_T; +eq_index = pfm.eq_index; + + i_cols_p = i_cols(1:nyp); i_cols_s = i_cols(nyp+(1:ny)); i_cols_f = i_cols(nyp+ny+(1:nyf)); -i_cols_A = i_cols; i_cols_Ap0 = i_cols_p; i_cols_As = i_cols_s; i_cols_Af0 = i_cols_f - ny; @@ -39,10 +39,11 @@ i_hc = i_cols_f - 2*ny; nzA = cell(periods,world_nbr); res = zeros(ny,periods,world_nbr); -Y = zeros(ny*(periods+2),world_nbr); -Y(1:ny,1) = pm.y0; +Y = pfm.Y; %zeros(ny*(periods+2),world_nbr); +Y(1:ny,1) = pfm.y0; Y(end-ny+1:end,:) = repmat(steady_state,1,world_nbr); -Y(pm.i_upd_y) = y; +Y(pfm.i_upd_y) = y; + offset_r0 = 0; for i = 1:order+1 i_w_p = 1; @@ -81,7 +82,7 @@ for i = 1:order+1 if hybrid_order == 2 && (k > 1 || i == order) z = [Y(i_cols_p,1); Y(i_cols_s,1); - Y(i_cols_f,k1)+h_correction(i_hc)]; + Y(i_cols_f,k1)+h_correction(i_hc)]; else z = [Y(i_cols_p,1); Y(i_cols_s,1); @@ -192,4 +193,4 @@ if nargout > 1 iA = [nzA{:}]'; A = sparse(iA(:,1),iA(:,2),iA(:,3),dimension,dimension); end -res = res(pm.i_upd_r); \ No newline at end of file +res = res(pfm.i_upd_r); diff --git a/matlab/ep/extended_path.m b/matlab/ep/extended_path.m index 2b807d36f8b3de236ab821cbd7284f85cac94f1e..c4a590d0cb749aa5da5c5e458293c271dd9f1653 100644 --- a/matlab/ep/extended_path.m +++ b/matlab/ep/extended_path.m @@ -36,18 +36,18 @@ function [ts,oo_] = extended_path(initialconditions, samplesize, exogenousvariab % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <https://www.gnu.org/licenses/>. -[initialconditions, innovations, pfm, ep, verbosity, options_, oo_] = ... +[initialconditions, innovations, pfm, options_, oo_] = ... extended_path_initialization(initialconditions, samplesize, exogenousvariables, options_, M_, oo_); -[shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innovations, ep, exogenousvariables, samplesize,M_,options_,oo_); +[shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innovations, exogenousvariables, samplesize, M_, options_, oo_); % Initialize the matrix for the paths of the endogenous variables. -endogenous_variables_paths = NaN(M_.endo_nbr,samplesize+1); +endogenous_variables_paths = NaN(M_.endo_nbr, samplesize+1); endogenous_variables_paths(:,1) = initialconditions; % Set waitbar (graphic or text mode) hh_fig = dyn_waitbar(0,'Please wait. Extended Path simulations...'); -set(hh_fig,'Name','EP simulations.'); +set(hh_fig,'Name', 'EP simulations.' ); % Initialize while-loop index. t = 1; @@ -67,14 +67,25 @@ while (t <= samplesize) else initialguess = []; end - [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths] = extended_path_core(ep.periods, M_.endo_nbr, M_.exo_nbr, innovations.positive_var_indx, ... - spfm_exo_simul, ep.use_first_order_solution_as_initial_guess, endogenous_variables_paths(:,t-1), ... - oo_.steady_state, ... - verbosity, ep.stochastic.order, ... - M_, pfm, ep.stochastic.algo, ep.solve_algo, ep.stack_solve_algo, ... - options_.lmmcp, ... - options_, ... - oo_, initialguess); + if t>2 + [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths] = extended_path_core(innovations.positive_var_indx, ... + spfm_exo_simul, ... + endogenous_variables_paths(:,t-1), ... + pfm, ... + M_, ... + options_, ... + oo_, ... + initialguess); + else + [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths, pfm, options_] = extended_path_core(innovations.positive_var_indx, ... + spfm_exo_simul, ... + endogenous_variables_paths(:,t-1), ... + pfm, ... + M_, ... + options_, ... + oo_, ... + initialguess); + end if ~info_convergence msg = sprintf('No convergence of the (stochastic) perfect foresight solver (in period %s)!', int2str(t)); warning(msg) diff --git a/matlab/ep/extended_path_core.m b/matlab/ep/extended_path_core.m index f5bf14d491250de9964d9a7a8258d5a3e0266abf..71571b112c14f9835574f2e6f6ad8e770ce40c55 100644 --- a/matlab/ep/extended_path_core.m +++ b/matlab/ep/extended_path_core.m @@ -1,10 +1,13 @@ -function [y, info_convergence, endogenousvariablespaths] = extended_path_core(periods,endo_nbr,exo_nbr,positive_var_indx, ... - exo_simul,init,initial_conditions,... - steady_state, ... - debug,order,M_,pfm,algo,solve_algo,stack_solve_algo,... - olmmcp,options_,oo_,initialguess) +function [y, info_convergence, endogenousvariablespaths, pfm, options_] = extended_path_core(positive_var_indx, ... + exo_simul, ... + initial_conditions ,... + pfm, ... + M_, ... + options_, ... + oo_, ... + initialguess) -% Copyright © 2016-2023 Dynare Team +% Copyright © 2016-2025 Dynare Team % % This file is part of Dynare. % @@ -23,6 +26,18 @@ function [y, info_convergence, endogenousvariablespaths] = extended_path_core(pe ep = options_.ep; +periods = ep.periods; +endo_nbr = M_.endo_nbr; +exo_nbr = M_.exo_nbr; +init = options_.ep.use_first_order_solution_as_initial_guess; +steady_state = oo_.steady_state; +debug = options_.verbosity; +order = options_.ep.stochastic.order; + +algo = ep.stochastic.algo; +solve_algo = ep.solve_algo; +stack_solve_algo = ep.stack_solve_algo; + if init% Compute first order solution (Perturbation)... endo_simul = simult_(M_,options_,initial_conditions,oo_.dr,exo_simul(2:end,:),1); else @@ -41,30 +56,39 @@ if debug end if options_.bytecode && order > 0 - error('Option order > 0 of extended_path command is not compatible with bytecode option.') + error('Option order > 0 of extended_path command with order>0 is not compatible with bytecode option.') end if options_.block && order > 0 - error('Option order > 0 of extended_path command is not compatible with block option.') + error('Option order > 0 of extended_path command with order>0 is not compatible with block option.') end if order == 0 + % Extended Path options_.periods = periods; options_.block = pfm.block; oo_.endo_simul = endo_simul; oo_.exo_simul = exo_simul; oo_.steady_state = steady_state; - options_.lmmcp = olmmcp; options_.solve_algo = solve_algo; options_.stack_solve_algo = stack_solve_algo; [endogenousvariablespaths, info_convergence] = perfect_foresight_solver_core(oo_.endo_simul, oo_.exo_simul, oo_.steady_state, oo_.exo_steady_state, M_, options_); else + % Stochastic Extended Path switch(algo) - case 0 - [flag, endogenousvariablespaths] = ... - solve_stochastic_perfect_foresight_model(endo_simul, exo_simul, pfm, ep.stochastic.quadrature.nodes, ep.stochastic.order); - case 1 - [flag, endogenousvariablespaths] = ... - solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options_, pfm, ep.stochastic.order); + case 0 + % Full tree of future trajectories. + if nargout>3 + [flag, endogenousvariablespaths, errorcode, ~, pfm, options_] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, options_, M_, pfm); + else + [flag, endogenousvariablespaths, errorcode] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, options_, M_, pfm); + end + case 1 + % Sparse tree of future histories. + if nargout>3 + [flag, endogenousvariablespaths, errorcode, ~, pfm, options_] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options_, M_, pfm); + else + [flag, endogenousvariablespaths, errorcode] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options_, M_, pfm); + end end info_convergence = ~flag; end diff --git a/matlab/ep/extended_path_initialization.m b/matlab/ep/extended_path_initialization.m index 0359b9ee23ad5f1f61e4e29ebb5271def398ba89..90828dc4b6895472bf0af0170f4dae43b2e37d05 100644 --- a/matlab/ep/extended_path_initialization.m +++ b/matlab/ep/extended_path_initialization.m @@ -1,4 +1,4 @@ -function [initial_conditions, innovations, pfm, ep, verbosity, options_, oo_] = extended_path_initialization(initial_conditions, sample_size, exogenousvariables, options_, M_, oo_) +function [initial_conditions, innovations, pfm, options_, oo_] = extended_path_initialization(initial_conditions, sample_size, exogenousvariables, options_, M_, oo_) % [initial_conditions, innovations, pfm, ep, verbosity, options_, oo_] = extended_path_initialization(initial_conditions, sample_size, exogenousvariables, options_, M_, oo_) % Initialization of the extended path routines. % @@ -36,8 +36,7 @@ function [initial_conditions, innovations, pfm, ep, verbosity, options_, oo_] = ep = options_.ep; % Set verbosity levels. -options_.verbosity = ep.verbosity; -verbosity = ep.verbosity+ep.debug; +options_.verbosity = ep.verbosity+ep.debug; % Set maximum number of iterations for the deterministic solver. options_.simul.maxit = ep.maxit; @@ -114,25 +113,28 @@ end pfm.nnzA = M_.NNZDerivatives(1); % setting up integration nodes if order > 0 -if ep.stochastic.order > 0 +if ep.stochastic.order>0 [nodes,weights,nnodes] = setup_integration_nodes(options_.ep,pfm); pfm.nodes = nodes; pfm.weights = weights; pfm.nnodes = nnodes; % compute number of blocks - [block_nbr,pfm.world_nbr] = get_block_world_nbr(ep.stochastic.algo,nnodes,ep.stochastic.order,ep.periods); + [pfm.block_nbr, pfm.world_nbr] = get_block_world_nbr(ep.stochastic.algo,nnodes,ep.stochastic.order,ep.periods); else block_nbr = ep.periods; end % set boundaries if mcp -[lb, ub] = feval(sprintf('%s.dynamic_complementarity_conditions', M_.fname), M_.params); -pfm.eq_index = M_.dynamic_mcp_equations_reordering; -if options_.ep.solve_algo == 10 - options_.lmmcp.lb = repmat(lb,block_nbr,1); - options_.lmmcp.ub = repmat(ub,block_nbr,1); -elseif options_.ep.solve_algo == 11 - options_.mcppath.lb = repmat(lb,block_nbr,1); - options_.mcppath.ub = repmat(ub,block_nbr,1); +if ~ep.stochastic.order + [lb, ub] = feval(sprintf('%s.dynamic_complementarity_conditions', M_.fname), M_.params); + pfm.eq_index = M_.dynamic_mcp_equations_reordering; + if options_.ep.solve_algo == 10 + options_.lmmcp.lb = repmat(lb, ep.periods, 1); + options_.lmmcp.ub = repmat(ub, ep.periods, 1); + elseif options_.ep.solve_algo == 11 + options_.mcppath.lb = repmat(lb, ep.periods, 1); + options_.mcppath.ub = repmat(ub, ep.periods, 1); + end +else + % For SEP, boundaries are set in solve_stochastic_perfect_foresight_model_{0,1}.m end -pfm.block_nbr = block_nbr; diff --git a/matlab/ep/extended_path_mc.m b/matlab/ep/extended_path_mc.m index b49f4bcbba5c3ca689a5d392352b08a5204c0845..8fbf172563e6602ad31960060f073621c1b1c2d1 100644 --- a/matlab/ep/extended_path_mc.m +++ b/matlab/ep/extended_path_mc.m @@ -1,5 +1,5 @@ function Simulations = extended_path_mc(initialconditions, samplesize, replic, exogenousvariables, options_, M_, oo_) -% Simulations = extended_path_mc(initialconditions, samplesize, replic, exogenousvariables, options_, M_, oo_) + % Stochastic simulation of a non linear DSGE model using the Extended Path method (Fair and Taylor 1983). A time % series of size T is obtained by solving T perfect foresight models. % @@ -36,7 +36,7 @@ function Simulations = extended_path_mc(initialconditions, samplesize, replic, e % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <https://www.gnu.org/licenses/>. -[initialconditions, innovations, pfm, ep, ~, options_, oo_] = ... +[initialconditions, innovations, pfm, options_, oo_] = ... extended_path_initialization(initialconditions, samplesize, exogenousvariables, options_, M_, oo_); % Check the dimension of the first input argument @@ -64,12 +64,12 @@ data = NaN(size(initialconditions, 1), samplesize+1, replic); vexo = NaN(innovations.effective_number_of_shocks, samplesize+1, replic); info = NaN(replic, 1); -if ep.parallel +if options_.ep.parallel % Use the Parallel toolbox. parfor i=1:replic innovations_ = innovations; oo__ = oo_; - [shocks, spfm_exo_simul, innovations_, oo__] = extended_path_shocks(innovations_, ep, exogenousvariables(:,:,i), samplesize, M_, options_, oo__); + [shocks, spfm_exo_simul, innovations_, oo__] = extended_path_shocks(innovations_, exogenousvariables(:,:,i), samplesize, M_, options_, oo__); endogenous_variables_paths = NaN(M_.endo_nbr,samplesize+1); endogenous_variables_paths(:,1) = initialconditions(:,1); exogenous_variables_paths = NaN(innovations_.effective_number_of_shocks,samplesize+1); @@ -80,12 +80,21 @@ if ep.parallel t = t+1; spfm_exo_simul(2,:) = shocks(t-1,:); exogenous_variables_paths(:,t) = shocks(t-1,:); - [endogenous_variables_paths(:,t), info_convergence] = extended_path_core(ep.periods, M_.endo_nbr, M_.exo_nbr, innovations_.positive_var_indx, ... - spfm_exo_simul, ep.use_first_order_solution_as_initial_guess, endogenous_variables_paths(:,t-1), ... - oo__.steady_state, ... - ep.verbosity, ep.stochastic.order, ... - M_, pfm,ep.stochastic.algo, ep.solve_algo, ep.stack_solve_algo, ... - options_.lmmcp, options_, oo__); + if t>2 + % Set initial guess for the solver (using the solution of the + % previous period problem). + initialguess = [endogenousvariablespaths(:, 2:end), oo_.steady_state]; + else + initialguess = []; + end + [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths] = extended_path_core(innovations.positive_var_indx, ... + spfm_exo_simul, ... + endogenous_variables_paths(:,t-1), ... + pfm, ... + M_, ... + options_, ... + oo__, ... + initialguess); if ~info_convergence msg = sprintf('No convergence of the (stochastic) perfect foresight solver (in period %s, iteration %s)!', int2str(t), int2str(i)); warning(msg) @@ -99,7 +108,7 @@ if ep.parallel else % Sequential approach. for i=1:replic - [shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innovations, ep, exogenousvariables(:,:,i), samplesize, M_, options_, oo_); + [shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innovations, exogenousvariables(:,:,i), samplesize, M_, options_, oo_); endogenous_variables_paths = NaN(M_.endo_nbr,samplesize+1); endogenous_variables_paths(:,1) = initialconditions(:,1); exogenous_variables_paths = NaN(innovations.effective_number_of_shocks,samplesize+1); @@ -109,12 +118,21 @@ else t = t+1; spfm_exo_simul(2,:) = shocks(t-1,:); exogenous_variables_paths(:,t) = shocks(t-1,:); - [endogenous_variables_paths(:,t), info_convergence] = extended_path_core(ep.periods, M_.endo_nbr, M_.exo_nbr, innovations.positive_var_indx, ... - spfm_exo_simul, ep.use_first_order_solution_as_initial_guess, endogenous_variables_paths(:,t-1), ... - oo_.steady_state, ... - ep.verbosity, ep.stochastic.order, ... - M_, pfm,ep.stochastic.algo, ep.solve_algo, ep.stack_solve_algo, ... - options_.lmmcp, options_, oo_); + if t>2 + % Set initial guess for the solver (using the solution of the + % previous period problem). + initialguess = [endogenousvariablespaths(:, 2:end), oo_.steady_state]; + else + initialguess = []; + end + [endogenous_variables_paths(:,t), info_convergence, endogenousvariablespaths] = extended_path_core(innovations.positive_var_indx, ... + spfm_exo_simul, ... + endogenous_variables_paths(:,t-1), ... + pfm, ... + M_, ... + options_, ... + oo_, ... + initialguess); if ~info_convergence msg = sprintf('No convergence of the (stochastic) perfect foresight solver (in period %s, iteration %s)!', int2str(t), int2str(i)); warning(msg) diff --git a/matlab/ep/extended_path_shocks.m b/matlab/ep/extended_path_shocks.m index 7c567ee4e1e3f20bf474277b71aa50153e5748bc..f86d89c300b452ab4b7d9b573797ef3e3dfb7459 100644 --- a/matlab/ep/extended_path_shocks.m +++ b/matlab/ep/extended_path_shocks.m @@ -1,6 +1,6 @@ -function [shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innovations, ep, exogenousvariables, sample_size,M_,options_, oo_) -% [shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innovations, ep, exogenousvariables, sample_size,M_,options_, oo_) -% Copyright © 2016-2023 Dynare Team +function [shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innovations, exogenousvariables, sample_size, M_, options_, oo_) + +% Copyright © 2016-2025 Dynare Team % % This file is part of Dynare. % @@ -19,14 +19,14 @@ function [shocks, spfm_exo_simul, innovations, oo_] = extended_path_shocks(innov % Simulate shocks. if isempty(exogenousvariables) - switch ep.innovation_distribution + switch options_.ep.innovation_distribution case 'gaussian' shocks = zeros(sample_size, M_.exo_nbr); shocks(:,innovations.positive_var_indx) = transpose(transpose(innovations.covariance_matrix_upper_cholesky)*randn(innovations.effective_number_of_shocks,sample_size)); case 'calibrated' options = options_; options.periods = options.ep.periods; - oo_local = make_ex_(M_,options,oo_); + oo_local = make_ex_(M_, options, oo_); shocks = oo_local.exo_simul(2:end,:); otherwise error(['extended_path:: ' ep.innovation_distribution ' distribution for the structural innovations is not (yet) implemented!']) @@ -38,4 +38,4 @@ end % Copy the shocks in exo_simul oo_.exo_simul = shocks; -spfm_exo_simul = repmat(oo_.exo_steady_state',ep.periods+2,1); \ No newline at end of file +spfm_exo_simul = repmat(oo_.exo_steady_state',options_.ep.periods+2,1); diff --git a/matlab/ep/setup_stochastic_perfect_foresight_model_solver.m b/matlab/ep/setup_stochastic_perfect_foresight_model_solver.m index 5266a1b4f0ab9b457a590ff962505d5af9eca255..b319672274e5f77e99b7fb2813270cda9f950882 100644 --- a/matlab/ep/setup_stochastic_perfect_foresight_model_solver.m +++ b/matlab/ep/setup_stochastic_perfect_foresight_model_solver.m @@ -5,7 +5,7 @@ function pfm = setup_stochastic_perfect_foresight_model_solver(M_,options_,oo_) % o options_ [struct] Dynare's options structure % o oo_ [struct] Dynare's results structure -% Copyright © 2013-2023 Dynare Team +% Copyright © 2013-2025 Dynare Team % % This file is part of Dynare. % diff --git a/matlab/ep/solve_stochastic_perfect_foresight_model.m b/matlab/ep/solve_stochastic_perfect_foresight_model.m index d18b6cf05b94a32fed1eacb375e24a481b852785..8263f5e706c3a2f6c49a264817dba545858cf722 100644 --- a/matlab/ep/solve_stochastic_perfect_foresight_model.m +++ b/matlab/ep/solve_stochastic_perfect_foresight_model.m @@ -33,6 +33,16 @@ nyf = pfm.nyf; i_cols_1 = pfm.i_cols_1; i_cols_j = pfm.i_cols_j; i_cols_T = nonzeros(lead_lag_incidence(1:2,:)'); +hybrid_order = pfm.hybrid_order; +if hybrid_order > 0 + if hybrid_order == 2 + h_correction = 0.5*pfm.dr.ghs2(pfm.dr.inv_order_var); + end +else + h_correction = 0; +end +%h_correction = pfm.h_correction; + maxit = pfm.maxit_; tolerance = pfm.tolerance; @@ -122,6 +132,7 @@ for iter = 1:maxit i_cols_Ap = i_cols_p; i_cols_As = i_cols_s; i_cols_Af = i_cols_f - ny; + i_hc = i_cols_f - 2*ny; for i = 1:order+1 i_w_p = 1; for j = 1:nnodes^(i-1) @@ -148,9 +159,16 @@ for iter = 1:maxit i_cols_Af = i_cols_Af + ny; end else - y = [Y(i_cols_p,i_w_p); - Y(i_cols_s,j); - Y(i_cols_f,j)]; + % i==order+1 + if hybrid_order==2 + y = [Y(i_cols_p,i_w_p); + Y(i_cols_s,j); + Y(i_cols_f,j)+h_correction(i_hc)]; + else + y = [Y(i_cols_p,i_w_p); + Y(i_cols_s,j); + Y(i_cols_f,j)]; + end [d1,jacobian] = dynamic_model(y,innovation,params,steady_state,i+1); if i == 1 % in first period we don't keep track of diff --git a/matlab/ep/solve_stochastic_perfect_foresight_model_0.m b/matlab/ep/solve_stochastic_perfect_foresight_model_0.m new file mode 100644 index 0000000000000000000000000000000000000000..02947bb21b63db46055a9b2f739529c9ef50f990 --- /dev/null +++ b/matlab/ep/solve_stochastic_perfect_foresight_model_0.m @@ -0,0 +1,170 @@ +function [errorflag, endo_simul, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_0(endo_simul, exo_simul, options_, M_, pfm) + +% Copyright © 2025 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 <https://www.gnu.org/licenses/>. + +update_pfm_struct = false; +update_options_struct = false; + +if nargout>4 + update_pfm_struct = true; +end + +if nargout>5 + update_options_struct = true; +end + +dynamic_model = pfm.dynamic_model; + +periods = pfm.periods; + +order = pfm.stochastic_order; + +lead_lag_incidence = pfm.lead_lag_incidence; +lead_lag_incidence_t = transpose(lead_lag_incidence); +ny = pfm.ny; +nyp = pfm.nyp; +nyf = pfm.nyf; +i_cols_1 = pfm.i_cols_1; +i_cols_j = pfm.i_cols_j; +i_cols_T = nonzeros(lead_lag_incidence(1:2,:)'); + +nodes = pfm.nodes; +weights = pfm.weights; +nnodes = pfm.nnodes; + +if update_pfm_struct + + % make sure that there is a node equal to zero + % and permute nodes and weights to have zero first + k = find(sum(abs(nodes),2) < 1e-12); + if ~isempty(k) + nodes = [nodes(k,:); nodes(1:k-1,:); nodes(k+1:end,:)]; + weights = [weights(k); weights(1:k-1); weights(k+1:end)]; + else + error('there is no nodes equal to zero') + end + + pfm.nodes = nodes; + pfm.weights = weights; + + hybrid_order = pfm.hybrid_order; + dr = pfm.dr; + if hybrid_order > 0 + if hybrid_order == 2 + h_correction = 0.5*dr.ghs2(dr.inv_order_var); + end + else + h_correction = 0; + end + + pfm.h_correction = h_correction; + + z = endo_simul(lead_lag_incidence_t(:)>0); + [~, jacobian] = dynamic_model(z, exo_simul, pfm.params, pfm.steady_state, 2); + + world_nbr = nnodes^order; + Y = repmat(endo_simul(:),1,world_nbr); + + % The columns of A map the elements of Y such that + % each block of Y with ny rows are unfolded column wise + dimension = ny*(sum(nnodes.^(0:order-1),2)+(periods-order)*world_nbr); + + i_upd_r = zeros(dimension,1); + i_upd_y = i_upd_r; + i_upd_r(1:ny) = (1:ny); + i_upd_y(1:ny) = ny+(1:ny); + i1 = ny+1; + i2 = 2*ny; + n1 = ny+1; + n2 = 2*ny; + for i=2:periods + for j=1:nnodes^min(i-1,order) + i_upd_r(i1:i2) = (n1:n2)+(j-1)*ny*periods; + i_upd_y(i1:i2) = (n1:n2)+ny+(j-1)*ny*(periods+2); + i1 = i2+1; + i2 = i2+ny; + end + n1 = n2+1; + n2 = n2+ny; + end + + if rows(lead_lag_incidence)>2 + icA = [find(lead_lag_incidence(1,:)) find(lead_lag_incidence(2,:))+world_nbr*ny ... + find(lead_lag_incidence(3,:))+2*world_nbr*ny]'; + else + if nyf + icA = [find(lead_lag_incidence(2,:))+world_nbr*ny find(lead_lag_incidence(3,:))+2*world_nbr*ny ]'; + else + icA = [find(lead_lag_incidence(1,:)) find(lead_lag_incidence(2,:))+world_nbr*ny ]'; + end + end + + i_rows = 1:ny; + i_cols = find(lead_lag_incidence'); + i_cols_p = i_cols(1:nyp); + i_cols_s = i_cols(nyp+(1:ny)); + i_cols_f = i_cols(nyp+ny+(1:nyf)); + + pfm.i_cols_Ap = i_cols_p; + pfm.i_cols_As = i_cols_s; + pfm.i_cols_Af = i_cols_f - ny; + pfm.i_hc = i_cols_f - 2*ny; + pfm.i_cols_p = i_cols_p; + pfm.i_cols_s = i_cols_s; + pfm.i_cols_f = i_cols_f; + pfm.i_rows = i_rows; + + pfm.A1 = sparse([],[],[],ny*(sum(nnodes.^(0:order-1),2)+1),dimension,(order+1)*world_nbr*nnz(jacobian)); + pfm.res = zeros(ny,periods,world_nbr); + + pfm.order = order; + pfm.world_nbr = world_nbr; + + pfm.hybrid_order = hybrid_order; + pfm.i_cols_1 = i_cols_1; + pfm.i_cols_h = i_cols_j; + pfm.icA = icA; + pfm.i_cols_T = i_cols_T; + pfm.i_upd_r = i_upd_r; + pfm.i_upd_y = i_upd_y; + pfm.Y = Y; + + pfm.dimension = dimension; + +end + +y = repmat(pfm.steady_state, pfm.dimension/pfm.ny, 1); + +if update_options_struct + % Set algorithm + options_.solve_algo = options_.ep.solve_algo; + options_.simul.maxit = options_.ep.maxit; + [lb, ub] = feval(sprintf('%s.dynamic_complementarity_conditions', M_.fname), pfm.params); + pfm.eq_index = M_.dynamic_mcp_equations_reordering; + if options_.ep.solve_algo == 10 + options_.lmmcp.lb = repmat(lb, pfm.dimension/pfm.ny, 1); + options_.lmmcp.ub = repmat(ub, pfm.dimension/pfm.ny, 1); + elseif options_.ep.solve_algo == 11 + options_.mcppath.lb = repmat(lb, pfm.dimension/pfm.ny, 1); + options_.mcppath.ub = repmat(ub, pfm.dimension/pfm.ny, 1); + end +end + +[y, errorflag, ~, ~, errorcode] = dynare_solve(@ep_problem_1, y, options_.simul.maxit, options_.dynatol.f, options_.dynatol.x, options_, exo_simul, pfm); + +endo_simul(:,2) = y(1:ny); diff --git a/matlab/ep/solve_stochastic_perfect_foresight_model_1.m b/matlab/ep/solve_stochastic_perfect_foresight_model_1.m index 633cd542c6347a60449211fea13f5d8fd0379aff..d65c464757f618f76f8c8e097334869d8620068e 100644 --- a/matlab/ep/solve_stochastic_perfect_foresight_model_1.m +++ b/matlab/ep/solve_stochastic_perfect_foresight_model_1.m @@ -1,6 +1,6 @@ -function [errorflag, endo_simul, errorcode, y] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, Options, pfm, order, varargin) +function [errorflag, endo_simul, errorcode, y, pfm, options_] = solve_stochastic_perfect_foresight_model_1(endo_simul, exo_simul, options_, M_, pfm) -% Copyright © 2012-2022 Dynare Team +% Copyright © 2012-2025 Dynare Team % % This file is part of Dynare. % @@ -17,87 +17,73 @@ function [errorflag, endo_simul, errorcode, y] = solve_stochastic_perfect_foresi % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <https://www.gnu.org/licenses/>. -if nargin < 6 - homotopy_parameter = 1; -else - homotopy_parameter = varargin{1}; +update_pfm_struct = false; +update_options_struct = false; + +if nargout>4 + update_pfm_struct = true; end -flag = 0; -err = 0; - -EpOptions = Options.ep; - -params = pfm.params; -steady_state = pfm.steady_state; -ny = pfm.ny; -periods = pfm.periods; -dynamic_model = pfm.dynamic_model; -lead_lag_incidence = pfm.lead_lag_incidence; -nyp = pfm.nyp; -nyf = pfm.nyf; -i_cols_1 = pfm.i_cols_1; -i_cols_A1 = pfm.i_cols_A1; -i_cols_j = pfm.i_cols_j; -i_cols_T = nonzeros(lead_lag_incidence(1:2,:)'); -hybrid_order = pfm.hybrid_order; -dr = pfm.dr; -nodes = pfm.nodes; -weights = pfm.weights; -nnodes = pfm.nnodes; - -maxit = pfm.maxit_; -tolerance = pfm.tolerance; -verbose = pfm.verbose; - -number_of_shocks = size(exo_simul,2); - -% make sure that there is a node equal to zero -% and permute nodes and weights to have zero first -k = find(sum(abs(nodes),2) < 1e-12); -if ~isempty(k) - nodes = [nodes(k,:); nodes(1:k-1,:); nodes(k+1:end,:)]; - weights = [weights(k); weights(1:k-1); weights(k+1:end)]; -else - error('there is no nodes equal to zero') +if nargout>5 + update_options_struct = true; end -if hybrid_order > 0 - if hybrid_order == 2 - h_correction = 0.5*dr.ghs2(dr.inv_order_var); + + +if update_pfm_struct + + periods = pfm.periods; + + order = pfm.stochastic_order; + + ny = pfm.ny; + lead_lag_incidence = pfm.lead_lag_incidence; + i_cols_1 = pfm.i_cols_1; + i_cols_j = pfm.i_cols_j; + i_cols_T = nonzeros(lead_lag_incidence(1:2,:)'); + + nodes = pfm.nodes; + weights = pfm.weights; + nnodes = pfm.nnodes; + + % Make sure that there is a node equal to zero and permute nodes and weights to have zero first + k = find(sum(abs(nodes),2) < 1e-12); + if ~isempty(k) + nodes = [nodes(k,:); nodes(1:k-1,:); nodes(k+1:end,:)]; + weights = [weights(k); weights(1:k-1); weights(k+1:end)]; + else + error('there is no nodes equal to zero') end -else - h_correction = 0; -end -if verbose - disp (' -----------------------------------------------------'); - disp ('MODEL SIMULATION :'); - fprintf('\n'); -end + pfm.nodes = nodes; + pfm.weights = weights; -% Each column of Y represents a different world -% The upper right cells are unused -% The first row block is ny x 1 -% The second row block is ny x nnodes -% The third row block is ny x nnodes^2 -% and so on until size ny x nnodes^order -world_nbr = pfm.world_nbr; -Y = endo_simul(:,2:end-1); -Y = repmat(Y,1,world_nbr); -pfm.y0 = endo_simul(:,1); - -% The columns of A map the elements of Y such that -% each block of Y with ny rows are unfolded column wise -% number of blocks -block_nbr = pfm.block_nbr; -% dimension of the problem -dimension = ny*block_nbr; -pfm.dimension = dimension; -if order == 0 - i_upd_r = (1:ny*periods)'; - i_upd_y = i_upd_r + ny; -else - i_upd_r = zeros(dimension,1); + if pfm.hybrid_order > 0 + if pfm.hybrid_order == 2 + pfm.h_correction = 0.5*pfm.dr.ghs2(pfm.dr.inv_order_var); + end + else + pfm.h_correction = 0; + end + + % Each column of Y represents a different world + % The upper right cells are unused + % The first row block is ny x 1 + % The second row block is ny x nnodes + % The third row block is ny x nnodes^2 + % and so on until size ny x nnodes^order + world_nbr = pfm.world_nbr; + % Y = endo_simul(:,2:end-1); + pfm.Y = repmat(endo_simul(:), 1, world_nbr); + pfm.y0 = endo_simul(:,1); + + % The columns of A map the elements of Y such that + % each block of Y with ny rows are unfolded column wise + % number of blocks + block_nbr = pfm.block_nbr; + % dimension of the problem + dimension = ny*block_nbr; + pfm.dimension = dimension; + i_upd_r = zeros(dimension, 1); i_upd_y = i_upd_r; i_upd_r(1:ny) = (1:ny); i_upd_y(1:ny) = ny+(1:ny); @@ -116,32 +102,36 @@ else n1 = n2+1; n2 = n2+ny; end + icA = [find(lead_lag_incidence(1,:)) find(lead_lag_incidence(2,:))+world_nbr*ny ... + find(lead_lag_incidence(3,:))+2*world_nbr*ny]'; + + pfm.i_rows = 1:ny; + pfm.i_cols = find(lead_lag_incidence'); + pfm.i_cols_1 = i_cols_1; + pfm.i_cols_h = i_cols_j; + pfm.icA = icA; + pfm.i_cols_T = i_cols_T; + pfm.i_upd_r = i_upd_r; + pfm.i_upd_y = i_upd_y; + +end + +y = repmat(pfm.steady_state, pfm.block_nbr, 1); + +if update_options_struct + % Set algorithm + options_.solve_algo = options_.ep.solve_algo; + options_.simul.maxit = options_.ep.maxit; + [lb, ub] = feval(sprintf('%s.dynamic_complementarity_conditions', M_.fname), pfm.params); + pfm.eq_index = M_.dynamic_mcp_equations_reordering; + if options_.ep.solve_algo == 10 + options_.lmmcp.lb = repmat(lb, pfm.block_nbr, 1); + options_.lmmcp.ub = repmat(ub, pfm.block_nbr, 1); + elseif options_.ep.solve_algo == 11 + options_.mcppath.lb = repmat(lb, pfm.block_nbr, 1); + options_.mcppath.ub = repmat(ub, pfm.block_nbr, 1); + end end -icA = [find(lead_lag_incidence(1,:)) find(lead_lag_incidence(2,:))+world_nbr*ny ... - find(lead_lag_incidence(3,:))+2*world_nbr*ny]'; -h1 = clock; -pfm.order = order; -pfm.world_nbr = world_nbr; -pfm.nodes = nodes; -pfm.nnodes = nnodes; -pfm.weights = weights; -pfm.h_correction = h_correction; -pfm.i_rows = 1:ny; -i_cols = find(lead_lag_incidence'); -pfm.i_cols = i_cols; -pfm.nyp = nyp; -pfm.nyf = nyf; -pfm.hybrid_order = hybrid_order; -pfm.i_cols_1 = i_cols_1; -pfm.i_cols_h = i_cols_j; -pfm.icA = icA; -pfm.i_cols_T = i_cols_T; -pfm.i_upd_r = i_upd_r; -pfm.i_upd_y = i_upd_y; - -Options.steady.maxit = 100; -y = repmat(steady_state,block_nbr,1); -Options.solve_algo = Options.ep.solve_algo; -Options.steady.maxit = Options.ep.maxit; -[y, errorflag, ~, ~, errorcode] = dynare_solve(@ep_problem_2, y, Options.simul.maxit, Options.dynatol.f, Options.dynatol.x, Options, exo_simul, pfm); -endo_simul(:,2) = y(1:ny); \ No newline at end of file + +[y, errorflag, ~, ~, errorcode] = dynare_solve(@ep_problem_2, y, options_.simul.maxit, options_.dynatol.f, options_.dynatol.x, options_, exo_simul, pfm); +endo_simul(:,2) = y(1:pfm.ny); diff --git a/tests/ep/burnside.mod b/tests/ep/burnside.mod index 958cb8f62f1c17ddc9087ba84dc3d22dd5ac92cb..a932a95335bb500b36a3db138b175bfc76307f5e 100644 --- a/tests/ep/burnside.mod +++ b/tests/ep/burnside.mod @@ -34,6 +34,7 @@ end set_dynare_seed('default'); stoch_simul(order=1,irf=0,periods=201); y_perturbation_1 = oo_.endo_simul(1,:)'; +e_1 = oo_.exo_simul; set_dynare_seed('default'); stoch_simul(order=2,irf=0,periods=201); @@ -48,16 +49,31 @@ options_.simul.maxit = 100; set_dynare_seed('default'); ytrue=exact_solution(M_,oo_, 800); - +/* set_dynare_seed('default'); options_.ep.stochastic.order = 0; -ts = extended_path([], 200, [], options_, M_, oo_); +ts = extended_path([], 200, e_1, options_, M_, oo_); +*/ + set_dynare_seed('default'); -options_.ep.stochastic.order = 2; -options_.ep.stochastic.IntegrationAlgorithm='Stroud-Cubature-3';//'Unscented'; //'Tensor-Gaussian-Quadrature'; +options_.ep.stochastic.order = 1; +options_.ep.stochastic.IntegrationAlgorithm='Tensor-Gaussian-Quadrature';//'Stroud-Cubature-3';//'Unscented'; //; +options_.ep.stochastic.quadrature.nodes = 3; +options_.ep.stochastic.algo = 0; +options_.ep.stochastic.hybrid_order = 2; +ts1 = extended_path([], 200, e_1, options_, M_, oo_); + + +set_dynare_seed('default'); +options_.ep.stochastic.order = 1; +options_.ep.stochastic.IntegrationAlgorithm='Tensor-Gaussian-Quadrature';//'Stroud-Cubature-3';//'Unscented'; //'Tensor-Gaussian-Quadrature'; options_.ep.stochastic.quadrature.nodes = 3; -ts1_4 = extended_path([], 200, [], options_, M_, oo_); +options_.ep.stochastic.algo = 1; +options_.ep.stochastic.hybrid_order = 2; +ts1_ = extended_path([], 200, e_1, options_, M_, oo_); + +return set_dynare_seed('default'); options_.ep.stochastic.order = 4; diff --git a/tests/ep/rbc.mod b/tests/ep/rbc.mod index 4003c4aa0281499b6b8dfc9e3990ddf4c94597e7..c1b29b77b28b91043de5ca09656fab74f3923c1d 100644 --- a/tests/ep/rbc.mod +++ b/tests/ep/rbc.mod @@ -72,12 +72,13 @@ end; steady(nocheck); -options_.ep.verbosity = 0; options_.ep.stochastic.order = 0; +options_.ep.stack_solve_algo=0; ts0 = extended_path([], 10, [], options_, M_, oo_); options_.ep.stochastic.order = 1; + options_.ep.stochastic.nodes = 3; options_.ep.stochastic.IntegrationAlgorithm='Tensor-Gaussian-Quadrature'; ts1_3 = extended_path([], 10, [], options_, M_, oo_); diff --git a/tests/ep/rbc_mc.mod b/tests/ep/rbc_mc.mod index 5f30d6ce5e92d64016472bdd5e712929e3de3eaf..a0dcadbb2b15c42c943c49a6554474b798c82284 100644 --- a/tests/ep/rbc_mc.mod +++ b/tests/ep/rbc_mc.mod @@ -72,4 +72,6 @@ end; steady(nocheck); -Simulations = extended_path_mc([], 2, 2, [], options_, M_, oo_); \ No newline at end of file +options_.ep.stack_solve_algo=0; + +Simulations = extended_path_mc([], 10, 2, [], options_, M_, oo_); diff --git a/tests/ep/rbcii.mod b/tests/ep/rbcii.mod index 3f3fa32a5ad1d46c75281b34ffea87020efd8bb3..24385ccf196505b51f150d5b78f0f42b3fc9d8d0 100644 --- a/tests/ep/rbcii.mod +++ b/tests/ep/rbcii.mod @@ -50,13 +50,10 @@ end; steady(nocheck); - options_.ep.stochastic.order = 0; - - ts = extended_path([], 200, [], options_, M_, oo_); - ts.save('rbcii-sim-data'); - - options_.ep.stochastic.order = 1; - ts1_4 = extended_path([], 200, [], options_, M_, oo_); + //options_.ep.stochastic.order = 0; + set_dynare_seed(2009); + Simulated_time_series = extended_path([], 200, [], options_, M_, oo_); + Simulated_time_series.save('rbcii-sim-data'); @#else diff --git a/tests/ep/rbcii_MCP.mod b/tests/ep/rbcii_MCP.mod index ffad81e92673981cc5e54ab7730ae8b676a8c958..01ec2854075673d2f1fe10aec9da64bb7ccdfea7 100644 --- a/tests/ep/rbcii_MCP.mod +++ b/tests/ep/rbcii_MCP.mod @@ -49,9 +49,10 @@ shocks; stderr 0.10; end; -extended_path(periods=200,lmmcp); +set_dynare_seed(2009); +extended_path(periods=200,order=0,lmmcp); -if any(oo_.endo_simul(strmatch('i',M_.endo_names,'exact'),:)<-1e-6) +if any(Simulated_time_series.i.data<-1e-6) error('lmmcp tag did not work.') end @@ -59,10 +60,10 @@ ds = dseries('rbcii-sim-data.mat'); if isoctave tolerance=5e-5; else - tolerance=1e-6; + tolerance=1e-5; end -if any(abs(transpose(oo_.endo_simul(strmatch('i',M_.endo_names,'exact'),:))-ds.Investment.data)>tolerance) +if any(abs(Simulated_time_series.i.data-ds.Investment.data)>tolerance) error('Simulation with lmmcp returns different results.') end