diff --git a/doc/dynare.texi b/doc/dynare.texi index c2bd98616b155d68708c5943d82f9aea0c33f5f5..d55844abbe86d3b0b4e1689f3aee373cc2239530 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -6087,7 +6087,10 @@ This command declares the policy maker objective, for use with You need to give the one-period objective, not the discounted lifetime objective. The discount factor is given by the @code{planner_discount} -option of @code{ramsey_policy} and @code{discretionary_policy}. +option of @code{ramsey_policy} and @code{discretionary_policy}. The +objective function can only contain current endogenous variables and no +exogenous ones. This limitation is easily circumvented by defining an +appropriate auxiliary variable in the model. With @code{ramsey_policy}, you are not limited to quadratic objectives: you can give any arbitrary nonlinear expression. diff --git a/matlab/evaluate_planner_objective.m b/matlab/evaluate_planner_objective.m index 3067414af2e8c206f46688a56d7f4e2bb4f461e4..32db62625a24b864182b722003d718e0fd13077f 100644 --- a/matlab/evaluate_planner_objective.m +++ b/matlab/evaluate_planner_objective.m @@ -42,27 +42,12 @@ else end ipred = find(lead_lag_incidence(M.maximum_lag,:))'; order_var = dr.order_var; -LQ = true; - + Gy = dr.ghx(nstatic+(1:nspred),:); Gu = dr.ghu(nstatic+(1:nspred),:); gy(dr.order_var,:) = dr.ghx; gu(dr.order_var,:) = dr.ghu; -if options.ramsey_policy && options.order == 1 && ~options.linear - options.order = 2; - options.qz_criterium = 1+1e-6; - [dr,info] = stochastic_solvers(oo.dr,0,M,options,oo); - Gyy = dr.ghxx(nstatic+(1:nspred),:); - Guu = dr.ghuu(nstatic+(1:nspred),:); - Gyu = dr.ghxu(nstatic+(1:nspred),:); - Gss = dr.ghs2(nstatic+(1:nspred),:); - gyy(dr.order_var,:) = dr.ghxx; - guu(dr.order_var,:) = dr.ghuu; - gyu(dr.order_var,:) = dr.ghxu; - gss(dr.order_var,:) = dr.ghs2; - LQ = false; -end ys = oo.dr.ys; @@ -83,24 +68,15 @@ mexErrCheck('A_times_B_kronecker_C', err); Wbar =U/(1-beta); Wy = Uy*gy/(eye(nspred)-beta*Gy); Wu = Uy*gu+beta*Wy*Gu; -if LQ - Wyy = Uyygygy/(eye(nspred*nspred)-beta*kron(Gy,Gy)); -else - Wyy = (Uy*gyy+Uyygygy+beta*Wy*Gyy)/(eye(nspred*nspred)-beta*kron(Gy,Gy)); -end +Wyy = Uyygygy/(eye(nspred*nspred)-beta*kron(Gy,Gy)); [Wyygugu, err] = A_times_B_kronecker_C(Wyy,Gu,Gu,options.threads.kronecker.A_times_B_kronecker_C); mexErrCheck('A_times_B_kronecker_C', err); [Wyygygu,err] = A_times_B_kronecker_C(Wyy,Gy,Gu,options.threads.kronecker.A_times_B_kronecker_C); mexErrCheck('A_times_B_kronecker_C', err); -if LQ - Wuu = Uyygugu+beta*Wyygugu; - Wyu = Uyygygu+beta*Wyygygu; - Wss = beta*Wuu*M.Sigma_e(:)/(1-beta); -else - Wuu = Uy*guu+Uyygugu+beta*(Wy*Guu+Wyygugu); - Wyu = Uy*gyu+Uyygygu+beta*(Wy*Gyu+Wyygygu); - Wss = (Uy*gss+beta*(Wuu*M.Sigma_e(:)+Wy*Gss))/(1-beta); -end +Wuu = Uyygugu+beta*Wyygugu; +Wyu = Uyygygu+beta*Wyygygu; +Wss = beta*Wuu*M.Sigma_e(:)/(1-beta); + % initialize yhat1 at the steady state yhat1 = oo.steady_state; if options.ramsey_policy