diff --git a/matlab/evaluate_planner_objective.m b/matlab/evaluate_planner_objective.m index c37764ab6c8033c0e4a25297f62893204125840f..65c1059b1c5296d91b2b62365a17b12526537847 100644 --- a/matlab/evaluate_planner_objective.m +++ b/matlab/evaluate_planner_objective.m @@ -198,7 +198,7 @@ if options_.ramsey_policy Wbar = U/(1-beta); Wy = Uy*gy/(eye(nspred)-beta*Gy); Wu = Uy*gu + beta*Wy*Gu; - + if isempty(options_.qz_criterium) options_.qz_criterium = 1+1e-6; end @@ -225,16 +225,43 @@ if options_.ramsey_policy planner_objective_value.conditional.steady_initial_multiplier = W_L_SS; planner_objective_value.conditional.zero_initial_multiplier = W_L_0; else - %Order k code will go here! - if ~isempty(M_.endo_histval) - fprintf('\nevaluate_planner_objective: order>2 conditional and unconditional welfare calculations not yet supported when an histval block is provided\n') - else - fprintf('\nevaluate_planner_objective: order>2 conditional welfare with initial Lagrange multipliers set to zero and unconditional welfare calculations not yet supported\n') - planner_objective_value.conditional.steady_initial_multiplier = k_order_welfare(dr, M_, options_); - planner_objective_value.conditional.zero_initial_multiplier = NaN; - planner_objective_value.unconditional = NaN; + % Computes the welfare decision rule + [W] = k_order_welfare(dr,M_,options_); + % Appends the welfare decision rule to the endogenous variables decision + % rule + g = dr; + for i=0:options_.order + eval("g.g_"+num2str(i)+" = [dr.g_"+num2str(i)+"; W.W_"+num2str(i)+"];"); end - return + % Amends the steady-state vector accordingly + [U] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); + ysteady = [ys(oo_.dr.order_var); U/(1-beta)]; + + % Generates the sequence of shocks to compute unconditional welfare + nper = 10000; + nburn = 1000; + chol_S = chol(M_.Sigma_e); + exo_simul = chol_S*randn(nper,M_.exo_nbr)'; + yhat_start = zeros(M_.endo_nbr+1,1); + [moment] = k_order_mean(options_.order, M_.nstatic, M_.npred, M_.nboth, M_.nfwrd+1, M_.exo_nbr, 1, nburn, yhat_start, exo_simul, ysteady, g); + + % Stores the result for unconditional welfare + planner_objective_value.unconditional = moment(end); + + % Conditional welfare + % Gets initial values + [yhat_L_SS,yhat_L_0, u] = get_initial_state(ys,M_,dr,oo_); + + % Conditional welfare (i) with Lagrange multipliers set to their + % steady-state values + yhat_start(M_.nstatic+1:M_.nstatic+M_.npred+M_.nboth) = yhat_L_SS; + [moment,sim] = k_order_mean(options_.order, M_.nstatic, M_.npred, M_.nboth, M_.nfwrd+1, M_.exo_nbr, 1, 0, yhat_start, u, ysteady, g); + planner_objective_value.conditional.steady_initial_multiplier = sim(end,1); + + % Conditional welfare (ii) with Lagrange multipliers set to 0 + yhat_start(M_.nstatic+1:M_.nstatic+M_.npred+M_.nboth) = yhat_L_0; + [moment,sim] = k_order_mean(options_.order, M_.nstatic, M_.npred, M_.nboth, M_.nfwrd+1, M_.exo_nbr, 1, nburn, yhat_start, u, ysteady, g); + planner_objective_value.conditional.zero_initial_multiplier = sim(end,1); end end elseif options_.discretionary_policy diff --git a/tests/optimal_policy/neo_growth_ramsey_k_order.mod b/tests/optimal_policy/neo_growth_ramsey_k_order.mod index 3b994a8fd97accf3b1b35c376a8e468f511b6717..e11ff0f519361f200592095a1fca3f5e4eb6abc8 100644 --- a/tests/optimal_policy/neo_growth_ramsey_k_order.mod +++ b/tests/optimal_policy/neo_growth_ramsey_k_order.mod @@ -31,13 +31,10 @@ end; stoch_simul(order=6, irf=0); -%evaluate_planner_objective; +evaluate_planner_objective; [W_dynpp] = k_order_welfare(oo_.dr, M_, options_); -%if condWelfare~=oo_.planner_objective_value.conditional.steady_initial_multiplier -% error('Inaccurate conditional welfare with Lagrange multiplier set to its steady-state value'); -%end if ~exist(['neo_growth_k_order' filesep 'Output' filesep 'neo_growth_k_order_results.mat'],'file'); error('neo_growth_k_order must be run first'); end;