From b32e75306dece5dedb976aa6e0f72e79bbbb5279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Ry=C3=BBk=29?= <stepan@adjemian.eu> Date: Wed, 22 Jan 2025 12:37:13 +0100 Subject: [PATCH] Add option use_first_order_solution to extended_path command. Use the model simulation based on a first-order local approximation as the initial guess for the nonlinear solver in each period. Can speed-up extended path simulations. We could also consider simulations based on higher order approximations, but I did not find any significant improvements with a second order approximation. --- doc/manual/source/the-model-file.rst | 7 +++++++ matlab/default_option_values.m | 5 ++--- matlab/ep/euler_equation_error.m | 6 +++--- matlab/ep/extended_path.m | 6 +++--- matlab/ep/extended_path_initialization.m | 4 ++-- matlab/ep/extended_path_mc.m | 10 +++++----- preprocessor | 2 +- 7 files changed, 23 insertions(+), 17 deletions(-) diff --git a/doc/manual/source/the-model-file.rst b/doc/manual/source/the-model-file.rst index b45fce6ad8..4eee8396bf 100644 --- a/doc/manual/source/the-model-file.rst +++ b/doc/manual/source/the-model-file.rst @@ -5309,6 +5309,13 @@ which is described below. rate or a model with irreversible investment). For specifying the necessary complementarity conditions, see :opt:`lmmcp`. + .. option:: use_first_order_solution + + Utilize the model simulation based on a first-order local + approximation as the initial guess for the nonlinear solver in + each period. If this is not applied, solution in previous + period is used. + Typology and ordering of variables ---------------------------------- diff --git a/matlab/default_option_values.m b/matlab/default_option_values.m index a1d501d980..300b4c6114 100644 --- a/matlab/default_option_values.m +++ b/matlab/default_option_values.m @@ -12,7 +12,7 @@ function options_ = default_option_values(M_) % SPECIAL REQUIREMENTS % none -% Copyright © 2018-2024 Dynare Team +% Copyright © 2018-2025 Dynare Team % % This file is part of Dynare. % @@ -195,8 +195,7 @@ ep.use_bytecode = 0; % Initialization of the perfect foresight equilibrium paths % * init=0, previous solution is used. % * init=1, a path generated with the first order reduced form is used. -% * init=2, mix of cases 0 and 1. -ep.init = 0; +ep.use_first_order_solution_as_initial_guess = false; % Maximum number of iterations for the deterministic solver. ep.maxit = 500; % Number of periods for the perfect foresight model. diff --git a/matlab/ep/euler_equation_error.m b/matlab/ep/euler_equation_error.m index 3bb304a569..c8b04725fa 100644 --- a/matlab/ep/euler_equation_error.m +++ b/matlab/ep/euler_equation_error.m @@ -1,7 +1,7 @@ function e = euler_equation_error(y0,x,innovations,M_,options_,oo_,pfm,nodes,weights) % e = euler_equation_error(y0,x,innovations,M_,options_,oo_,pfm,nodes,weights) -% Copyright © 2016-2023 Dynare Team +% Copyright © 2016-2025 Dynare Team % % This file is part of Dynare. % @@ -23,7 +23,7 @@ ep = options_.ep; y1 = extended_path_core(ep.periods, ... M_.endo_nbr, M_.exo_nbr, ... innovations.positive_var_indx, ... - x, ep.init, y0, oo_.steady_state, ... + x, ep.use_first_order_solution_as_initial_guess, y0, oo_.steady_state, ... 0, ... ep.stochastic.order, M_, ... pfm, ep.stochastic.algo, ... @@ -38,7 +38,7 @@ for i=1:length(nodes) x2 = x1; x2(2,:) = x2(2,:) + nodes(i,:); y2 = extended_path_core(ep.periods, M_.endo_nbr, M_.exo_nbr, ... - innovations.positive_var_indx, x2, ep.init, ... + innovations.positive_var_indx, x2, ep.use_first_order_solution_as_initial_guess, ... y1, oo_.steady_state, 0, ... ep.stochastic.order, M_, pfm, ep.stochastic.algo, ... ep.solve_algo, ep.stack_solve_algo, options_.lmmcp, ... diff --git a/matlab/ep/extended_path.m b/matlab/ep/extended_path.m index fe1bf640ef..2b807d36f8 100644 --- a/matlab/ep/extended_path.m +++ b/matlab/ep/extended_path.m @@ -19,7 +19,7 @@ function [ts,oo_] = extended_path(initialconditions, samplesize, exogenousvariab % % SPECIAL REQUIREMENTS -% Copyright © 2009-2023 Dynare Team +% Copyright © 2009-2025 Dynare Team % % This file is part of Dynare. % @@ -68,7 +68,7 @@ while (t <= samplesize) 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.init, endogenous_variables_paths(:,t-1), ... + 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, ... @@ -106,4 +106,4 @@ if any(isnan(endogenous_variables_paths(:))) end ts = dseries(transpose(endogenous_variables_paths), initial_period, M_.endo_names); -oo_.endo_simul = transpose(ts.data); \ No newline at end of file +oo_.endo_simul = transpose(ts.data); diff --git a/matlab/ep/extended_path_initialization.m b/matlab/ep/extended_path_initialization.m index 362788dec9..0359b9ee23 100644 --- a/matlab/ep/extended_path_initialization.m +++ b/matlab/ep/extended_path_initialization.m @@ -16,7 +16,7 @@ function [initial_conditions, innovations, pfm, ep, verbosity, options_, oo_] = % % SPECIAL REQUIREMENTS -% Copyright © 2016-2024 Dynare Team +% Copyright © 2016-2025 Dynare Team % % This file is part of Dynare. % @@ -71,7 +71,7 @@ options_.stack_solve_algo = ep.stack_solve_algo; % Compute the first order reduced form if needed. dr = struct(); -if ep.init +if ep.use_first_order_solution_as_initial_guess options_.order = 1; oo_.dr=set_state_space(dr,M_); [oo_.dr,info,M_.params] = resol(0,M_,options_,oo_.dr,oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state); diff --git a/matlab/ep/extended_path_mc.m b/matlab/ep/extended_path_mc.m index fcfe284b54..b49f4bcbba 100644 --- a/matlab/ep/extended_path_mc.m +++ b/matlab/ep/extended_path_mc.m @@ -19,7 +19,7 @@ function Simulations = extended_path_mc(initialconditions, samplesize, replic, e % % SPECIAL REQUIREMENTS -% Copyright © 2016-2023 Dynare Team +% Copyright © 2016-2025 Dynare Team % % This file is part of Dynare. % @@ -81,8 +81,8 @@ if ep.parallel 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.init, endogenous_variables_paths(:,t-1), ... - oo__.steady_state, ... + 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__); @@ -110,8 +110,8 @@ else 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.init, endogenous_variables_paths(:,t-1), ... - oo_.steady_state, ... + 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_); diff --git a/preprocessor b/preprocessor index 86822b5e6e..991759b2c7 160000 --- a/preprocessor +++ b/preprocessor @@ -1 +1 @@ -Subproject commit 86822b5e6e8b5fc3f98673d6e6d21eed8051e2d4 +Subproject commit 991759b2c7c60b59a41e1079cdfcf938170d716c -- GitLab