diff --git a/matlab/evaluate_planner_objective.m b/matlab/evaluate_planner_objective.m index cbaf1b4d090f1c73b24db8b393aa19d011d1ce55..ec34a87b69d7ab711c9994a765b7b0441e6795fd 100644 --- a/matlab/evaluate_planner_objective.m +++ b/matlab/evaluate_planner_objective.m @@ -6,8 +6,8 @@ function planner_objective_value = evaluate_planner_objective(M_,options_,oo_) % oo_: (structure) output results % OUTPUT % planner_objective_value (double) -% -%Returns a vector containing first order or second-order approximations of +% +%Returns a vector containing first order or second-order approximations of % - the unconditional expectation of the planner's objective function % - the conditional expectation of the planner's objective function starting from the non-stochastic steady state and allowing for future shocks % depending on the value of options_.order. @@ -52,7 +52,7 @@ function planner_objective_value = evaluate_planner_objective(M_,options_,oo_) % W(y,0,1) = Wbar + 0.5*Wss % In the discretionary case, the model is assumed to be linear and the utility is assumed to be linear-quadratic. This changes 2 aspects of the results delinated above: -% 1) the second-order derivatives of the policy and transition functions h and g are zero. +% 1) the second-order derivatives of the policy and transition functions h and g are zero. % 2) the unconditional expectation of states coincides with its steady-state, which entails E(yhat) = 0 % Therefore, the unconditional welfare can now be approximated as % E(W) = (1 - beta)^{-1} ( Ubar + 0.5 ( U_xx h_y^2 E(yhat^2) + U_xx h_u^2 E(u^2) ) @@ -91,47 +91,47 @@ planner_objective_value = zeros(2,1); if options_.ramsey_policy if oo_.gui.ran_perfect_foresight T = size(oo_.endo_simul,2); - [U_term] = feval([M_.fname '.objective.static'],oo_.endo_simul(:,T),oo_.exo_simul(T,:), M_.params); + [U_term] = feval([M_.fname '.objective.static'],oo_.endo_simul(:,T-M_.maximum_lead),oo_.exo_simul(T-M_.maximum_lead,:), M_.params); EW = U_term/(1-beta); W = EW; - for t=T:-1:2 + for t=T-M_.maximum_lead:-1:1+M_.maximum_lag [U] = feval([M_.fname '.objective.static'],oo_.endo_simul(:,t),oo_.exo_simul(t,:), M_.params); W = U + beta*W; end planner_objective_value(1) = EW; planner_objective_value(2) = W; else - ys = oo_.dr.ys; + ys = oo_.dr.ys; if options_.order == 1 || M_.hessian_eq_zero [U] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); planner_objective_value(1) = U/(1-beta); - planner_objective_value(2) = U/(1-beta); + planner_objective_value(2) = U/(1-beta); elseif options_.order == 2 && ~M_.hessian_eq_zero [U,Uy,Uyy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); - + Gy = dr.ghx(nstatic+(1:nspred),:); Gu = dr.ghu(nstatic+(1:nspred),:); Gyy = dr.ghxx(nstatic+(1:nspred),:); Gyu = dr.ghxu(nstatic+(1:nspred),:); Guu = dr.ghuu(nstatic+(1:nspred),:); Gss = dr.ghs2(nstatic+(1:nspred),:); - + gy(dr.order_var,:) = dr.ghx; gu(dr.order_var,:) = dr.ghu; gyy(dr.order_var,:) = dr.ghxx; gyu(dr.order_var,:) = dr.ghxu; guu(dr.order_var,:) = dr.ghuu; gss(dr.order_var,:) = dr.ghs2; - + Uyy = full(Uyy); - + Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy); Uyygugu = A_times_B_kronecker_C(Uyy,gu,gu); - + %% Unconditional welfare - + old_noprint = options_.noprint; - + if ~old_noprint options_.noprint = 1; end @@ -143,25 +143,25 @@ if options_.ramsey_policy if ~old_noprint options_.noprint = 0; end - + oo_.mean(isnan(oo_.mean)) = options_.huge_number; oo_.var(isnan(oo_.var)) = options_.huge_number; - + Ey = oo_.mean; Eyhat = Ey - ys(dr.order_var(nstatic+(1:nspred))); - + var_corr = Eyhat*Eyhat'; Eyhatyhat = oo_.var(:) + var_corr(:); Euu = M_.Sigma_e(:); - + EU = U + Uy*gy*Eyhat + 0.5*((Uyygygy + Uy*gyy)*Eyhatyhat + (Uyygugu + Uy*guu)*Euu + Uy*gss); EW = EU/(1-beta); - + %% Conditional welfare starting from the non-stochastic steady-state - + Wbar = U/(1-beta); Wy = Uy*gy/(eye(nspred)-beta*Gy); - + if isempty(options_.qz_criterium) options_.qz_criterium = 1+1e-6; end @@ -171,7 +171,7 @@ if options_.ramsey_policy Wuu = Uyygugu + Uy*guu + beta*(Wyygugu + Wy*Guu); Wss = (Uy*gss + beta*(Wy*Gss + Wuu*M_.Sigma_e(:)))/(1-beta); W = Wbar + 0.5*Wss; - + planner_objective_value(1) = EW; planner_objective_value(2) = W; else @@ -184,23 +184,23 @@ if options_.ramsey_policy end elseif options_.discretionary_policy ys = oo_.dr.ys; - + [U,Uy,Uyy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); - + Gy = dr.ghx(nstatic+(1:nspred),:); Gu = dr.ghu(nstatic+(1:nspred),:); gy(dr.order_var,:) = dr.ghx; gu(dr.order_var,:) = dr.ghu; - + Uyy = full(Uyy); - + Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy); Uyygugu = A_times_B_kronecker_C(Uyy,gu,gu); - + %% Unconditional welfare - + old_noprint = options_.noprint; - + if ~old_noprint options_.noprint = 1; end @@ -209,36 +209,33 @@ elseif options_.discretionary_policy if ~old_noprint options_.noprint = 0; end - + oo_.mean(isnan(oo_.mean)) = options_.huge_number; oo_.var(isnan(oo_.var)) = options_.huge_number; - + Ey = oo_.mean; Eyhat = Ey - ys(dr.order_var(nstatic+(1:nspred))); - + var_corr = Eyhat*Eyhat'; Eyhatyhat = oo_.var(:) + var_corr(:); Euu = M_.Sigma_e(:); - + EU = U + Uy*gy*Eyhat + 0.5*(Uyygygy*Eyhatyhat + Uyygugu*Euu); EW = EU/(1-beta); - - + + %% Conditional welfare starting from the non-stochastic steady-state - + Wbar = U/(1-beta); Wy = Uy*gy/(eye(nspred)-beta*Gy); - - if isempty(options_.qz_criterium) - options_.qz_criterium = 1+1e-6; - end + %solve Lyapunuv equation Wyy=gy'*Uyy*gy+beta*Gy'Wyy*Gy Wyy = reshape(lyapunov_symm(sqrt(beta)*Gy',reshape(Uyygygy,nspred,nspred),options_.lyapunov_fixed_point_tol,options_.qz_criterium,options_.lyapunov_complex_threshold, 3, options_.debug),1,nspred*nspred); Wyygugu = A_times_B_kronecker_C(Wyy,Gu,Gu); Wuu = Uyygugu + beta*Wyygugu; Wss = beta*Wuu*M_.Sigma_e(:)/(1-beta); W = Wbar + 0.5*Wss; - + planner_objective_value(1) = EW; planner_objective_value(2) = W; end @@ -250,7 +247,7 @@ if ~options_.noprint else fprintf('\nApproximated value of unconditional welfare: %10.8f\n', planner_objective_value(1)) fprintf('\nApproximated value of conditional welfare: %10.8f\n', planner_objective_value(2)) - end + end elseif options_.discretionary_policy fprintf('\nApproximated value of unconditional welfare with discretionary policy: %10.8f\n', planner_objective_value(1)) fprintf('\nApproximated value of conditional welfare with discretionary policy: %10.8f\n', planner_objective_value(2)) diff --git a/tests/optimal_policy/Ramsey/ramsey_histval.mod b/tests/optimal_policy/Ramsey/ramsey_histval.mod index 09ee4c68999e9dc5b9de2e397b5f3d4f9563d4a8..4c61ba60bf79efe5a7b6e14f8169a26566a4165e 100644 --- a/tests/optimal_policy/Ramsey/ramsey_histval.mod +++ b/tests/optimal_policy/Ramsey/ramsey_histval.mod @@ -23,7 +23,7 @@ r=1; end; histval; -r(0)=1; +a(0)=-1; end; steady_state_model; @@ -42,4 +42,5 @@ end; options_.dr_display_tol=0; planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma))); ramsey_model(planner_discount=0.99,instruments=(r)); -stoch_simul(order=1,periods=500); \ No newline at end of file +stoch_simul(order=1); +evaluate_planner_objective; \ No newline at end of file