factoring out steady-state computations; steady_state_model now
generates <fname>_steadystate2.m returning parameters as well in case they have been modified by the user. Added several test cases.time-shift
parent
8f350dc744
commit
ee7078e56c
92
matlab/dr1.m
92
matlab/dr1.m
|
@ -73,81 +73,6 @@ if M_.exo_nbr == 0
|
||||||
oo_.exo_steady_state = [] ;
|
oo_.exo_steady_state = [] ;
|
||||||
end
|
end
|
||||||
|
|
||||||
% expanding system for Optimal Linear Regulator
|
|
||||||
if options_.ramsey_policy
|
|
||||||
if isfield(M_,'orig_model')
|
|
||||||
orig_model = M_.orig_model;
|
|
||||||
M_.endo_nbr = orig_model.endo_nbr;
|
|
||||||
M_.orig_endo_nbr = orig_model.orig_endo_nbr;
|
|
||||||
M_.aux_vars = orig_model.aux_vars;
|
|
||||||
M_.endo_names = orig_model.endo_names;
|
|
||||||
M_.lead_lag_incidence = orig_model.lead_lag_incidence;
|
|
||||||
M_.maximum_lead = orig_model.maximum_lead;
|
|
||||||
M_.maximum_endo_lead = orig_model.maximum_endo_lead;
|
|
||||||
M_.maximum_lag = orig_model.maximum_lag;
|
|
||||||
M_.maximum_endo_lag = orig_model.maximum_endo_lag;
|
|
||||||
oo_.steady_state = oo_.steady_state(1:M_.endo_nbr);
|
|
||||||
end
|
|
||||||
|
|
||||||
if options_.steadystate_flag
|
|
||||||
k_inst = [];
|
|
||||||
instruments = options_.instruments;
|
|
||||||
inst_nbr = size(options_.instruments);
|
|
||||||
for i = 1:inst_nbr
|
|
||||||
k_inst = [k_inst; strmatch(options_.instruments(i,:), ...
|
|
||||||
M_.endo_names,'exact')];
|
|
||||||
end
|
|
||||||
ys = oo_.steady_state;
|
|
||||||
if inst_nbr == 1
|
|
||||||
nl_func = @(x) dyn_ramsey_static_(x,M_,options_,oo_,it_);
|
|
||||||
% inst_val = fzero(nl_func,oo_.steady_state(k_inst));
|
|
||||||
inst_val = csolve(nl_func,oo_.steady_state(k_inst),'',options_.solve_tolf,100);
|
|
||||||
else
|
|
||||||
[inst_val,info1] = dynare_solve('dyn_ramsey_static_', ...
|
|
||||||
oo_.steady_state(k_inst),0, ...
|
|
||||||
M_,options_,oo_,it_);
|
|
||||||
end
|
|
||||||
M_.params = evalin('base','M_.params;');
|
|
||||||
ys(k_inst) = inst_val;
|
|
||||||
[x,check] = feval([M_.fname '_steadystate'],...
|
|
||||||
ys,[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state]);
|
|
||||||
M_.params = evalin('base','M_.params;');
|
|
||||||
if size(x,1) < M_.endo_nbr
|
|
||||||
if length(M_.aux_vars) > 0
|
|
||||||
x = add_auxiliary_variables_to_steadystate(x,M_.aux_vars,...
|
|
||||||
M_.fname,...
|
|
||||||
oo_.exo_steady_state,...
|
|
||||||
oo_.exo_det_steady_state,...
|
|
||||||
M_.params,...
|
|
||||||
options_.bytecode);
|
|
||||||
else
|
|
||||||
error([M_.fname '_steadystate.m doesn''t match the model']);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
oo_.steady_state = x;
|
|
||||||
[junk,junk,multbar] = dyn_ramsey_static_(oo_.steady_state(k_inst),M_,options_,oo_,it_);
|
|
||||||
oo_.steady_state = [x(1:M_.orig_endo_nbr); multbar];
|
|
||||||
else
|
|
||||||
% xx = oo_.steady_state([1:M_.orig_endo_nbr (M_.orig_endo_nbr+M_.orig_eq_nbr+1):end]);
|
|
||||||
xx = oo_.steady_state(1:M_.orig_endo_nbr);
|
|
||||||
[xx,info1] = dynare_solve('dyn_ramsey_static_', ...
|
|
||||||
xx,0,M_,options_,oo_,it_);
|
|
||||||
[junk,junk,multbar] = dyn_ramsey_static_(xx,M_,options_,oo_,it_);
|
|
||||||
oo_.steady_state = [xx; multbar];
|
|
||||||
end
|
|
||||||
|
|
||||||
check1 = max(abs(feval([M_.fname '_static'],...
|
|
||||||
oo_.steady_state,...
|
|
||||||
[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state], M_.params))) > options_.dynatol ;
|
|
||||||
if check1
|
|
||||||
info(1) = 20;
|
|
||||||
info(2) = check1'*check1;
|
|
||||||
return
|
|
||||||
end
|
|
||||||
dr.ys = oo_.steady_state;
|
|
||||||
end
|
|
||||||
klen = M_.maximum_lag + M_.maximum_lead + 1;
|
klen = M_.maximum_lag + M_.maximum_lead + 1;
|
||||||
iyv = M_.lead_lag_incidence';
|
iyv = M_.lead_lag_incidence';
|
||||||
iyv = iyv(:);
|
iyv = iyv(:);
|
||||||
|
@ -163,24 +88,25 @@ z = repmat(dr.ys,1,klen);
|
||||||
if ~options_.bytecode
|
if ~options_.bytecode
|
||||||
z = z(iyr0) ;
|
z = z(iyr0) ;
|
||||||
end;
|
end;
|
||||||
|
exo_ss = [oo_.exo_steady_state' oo_.exo_det_steady_state'];
|
||||||
if options_.order == 1
|
if options_.order == 1
|
||||||
if (options_.bytecode)
|
if (options_.bytecode)
|
||||||
[chck, junk, loc_dr] = bytecode('dynamic','evaluate', z,[oo_.exo_simul ...
|
[chck, junk, loc_dr] = bytecode('dynamic','evaluate', z,exo_ss, ...
|
||||||
oo_.exo_det_simul], M_.params, dr.ys, 1);
|
M_.params, dr.ys, 1);
|
||||||
jacobia_ = [loc_dr.g1 loc_dr.g1_x loc_dr.g1_xd];
|
jacobia_ = [loc_dr.g1 loc_dr.g1_x loc_dr.g1_xd];
|
||||||
else
|
else
|
||||||
[junk,jacobia_] = feval([M_.fname '_dynamic'],z,[oo_.exo_simul ...
|
[junk,jacobia_] = feval([M_.fname '_dynamic'],z,exo_ss, ...
|
||||||
oo_.exo_det_simul], M_.params, dr.ys, it_);
|
M_.params, dr.ys, 1);
|
||||||
end;
|
end;
|
||||||
elseif options_.order == 2
|
elseif options_.order == 2
|
||||||
if (options_.bytecode)
|
if (options_.bytecode)
|
||||||
[chck, junk, loc_dr] = bytecode('dynamic','evaluate', z,[oo_.exo_simul ...
|
[chck, junk, loc_dr] = bytecode('dynamic','evaluate', z,exo_ss, ...
|
||||||
oo_.exo_det_simul], M_.params, dr.ys, 1);
|
M_.params, dr.ys, 1);
|
||||||
jacobia_ = [loc_dr.g1 loc_dr.g1_x];
|
jacobia_ = [loc_dr.g1 loc_dr.g1_x];
|
||||||
else
|
else
|
||||||
[junk,jacobia_,hessian1] = feval([M_.fname '_dynamic'],z,...
|
[junk,jacobia_,hessian1] = feval([M_.fname '_dynamic'],z,...
|
||||||
[oo_.exo_simul ...
|
exo_ss, ...
|
||||||
oo_.exo_det_simul], M_.params, dr.ys, it_);
|
M_.params, dr.ys, 1);
|
||||||
end;
|
end;
|
||||||
if options_.use_dll
|
if options_.use_dll
|
||||||
% In USE_DLL mode, the hessian is in the 3-column sparse representation
|
% In USE_DLL mode, the hessian is in the 3-column sparse representation
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
function [resids, rJ,mult] = dyn_ramsey_static_(x,M,options_,oo,it_)
|
function [steady_state,params,check] = dyn_ramsey_static(x,M,options_,oo)
|
||||||
|
|
||||||
% function [resids, rJ,mult] = dyn_ramsey_static_(x)
|
% function [steady_state,params,check] = dyn_ramsey_static_(x)
|
||||||
% Computes the static first order conditions for optimal policy
|
% Computes the static first order conditions for optimal policy
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
% x: vector of endogenous variables
|
% x: vector of endogenous variables or instruments
|
||||||
%
|
%
|
||||||
% OUTPUTS
|
% OUTPUTS
|
||||||
% resids: residuals of non linear equations
|
% resids: residuals of non linear equations
|
||||||
|
@ -30,13 +30,60 @@ function [resids, rJ,mult] = dyn_ramsey_static_(x,M,options_,oo,it_)
|
||||||
%
|
%
|
||||||
% You should have received a copy of the GNU General Public License
|
% You should have received a copy of the GNU General Public License
|
||||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
global oo_ M_
|
|
||||||
|
|
||||||
|
steady_state = [];
|
||||||
|
params = M.params;
|
||||||
|
check = 0;
|
||||||
|
nl_func = @(x) dyn_ramsey_static_1(x,M,options_,oo);
|
||||||
|
|
||||||
|
if options_.steadystate_flag
|
||||||
|
k_inst = [];
|
||||||
|
instruments = options_.instruments;
|
||||||
|
inst_nbr = size(options_.instruments);
|
||||||
|
for i = 1:inst_nbr
|
||||||
|
k_inst = [k_inst; strmatch(options_.instruments(i,:), ...
|
||||||
|
M.endo_names,'exact')];
|
||||||
|
end
|
||||||
|
ys = oo.steady_state;
|
||||||
|
if inst_nbr == 1
|
||||||
|
inst_val = csolve(nl_func,oo_.steady_state(k_inst),'',options_.solve_tolf,100);
|
||||||
|
else
|
||||||
|
[inst_val,info1] = dynare_solve(nl_func,ys(k_inst),0);
|
||||||
|
end
|
||||||
|
ys(k_inst) = inst_val;
|
||||||
|
[x,params,check] = evaluate_steadystate_file(ys,exo_ss,params,M.fname,options_.steadystate_flag);
|
||||||
|
if size(x,1) < M.endo_nbr
|
||||||
|
if length(M.aux_vars) > 0
|
||||||
|
x = feval([M.fname '_set_auxiliary_variables'],xx,...
|
||||||
|
[oo.exo_steady_state,...
|
||||||
|
oo.exo_det_steady_state],...
|
||||||
|
M.params);
|
||||||
|
else
|
||||||
|
error([M.fname '_steadystate.m doesn''t match the model']);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
[junk,junk,multbar] = dyn_ramsey_static_1(x(k_inst),M,options_,oo_);
|
||||||
|
steady_state = [x(1:M.orig_endo_nbr); multbar];
|
||||||
|
else
|
||||||
|
xx = oo.steady_state(1:M.orig_endo_nbr);
|
||||||
|
[xx,info1] = dynare_solve(nl_func,xx,0);
|
||||||
|
[junk,junk,multbar] = nl_func(xx);
|
||||||
|
steady_state = [xx; multbar];
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function [resids, rJ,mult] = dyn_ramsey_static_1(x,M,options_,oo)
|
||||||
|
resids = [];
|
||||||
|
rJ = [];
|
||||||
|
mult = [];
|
||||||
|
|
||||||
% recovering usefull fields
|
% recovering usefull fields
|
||||||
endo_nbr = M.endo_nbr;
|
endo_nbr = M.endo_nbr;
|
||||||
exo_nbr = M.exo_nbr;
|
exo_nbr = M.exo_nbr;
|
||||||
orig_endo_nbr = M_.orig_endo_nbr;
|
orig_endo_nbr = M.orig_endo_nbr;
|
||||||
orig_eq_nbr = M_.orig_eq_nbr;
|
orig_eq_nbr = M.orig_eq_nbr;
|
||||||
inst_nbr = orig_endo_nbr - orig_eq_nbr;
|
inst_nbr = orig_endo_nbr - orig_eq_nbr;
|
||||||
% indices of Lagrange multipliers
|
% indices of Lagrange multipliers
|
||||||
i_mult = [orig_endo_nbr+(1:orig_eq_nbr)]';
|
i_mult = [orig_endo_nbr+(1:orig_eq_nbr)]';
|
||||||
|
@ -63,41 +110,26 @@ if options_.steadystate_flag
|
||||||
oo.steady_state,...
|
oo.steady_state,...
|
||||||
[oo.exo_steady_state; ...
|
[oo.exo_steady_state; ...
|
||||||
oo.exo_det_steady_state]);
|
oo.exo_det_steady_state]);
|
||||||
if size(x,1) < M.endo_nbr
|
|
||||||
if length(M.aux_vars) > 0
|
|
||||||
x = add_auxiliary_variables_to_steadystate(x,M.aux_vars,...
|
|
||||||
M.fname,...
|
|
||||||
oo.exo_steady_state,...
|
|
||||||
oo.exo_det_steady_state,...
|
|
||||||
M_.params,...
|
|
||||||
options_.bytecode);
|
|
||||||
else
|
|
||||||
error([M.fname '_steadystate.m doesn''t match the model']);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
xx = zeros(endo_nbr,1);
|
|
||||||
xx(1:orig_endo_nbr) = x;
|
|
||||||
|
|
||||||
xx = feval([M_.fname '_set_auxiliary_variables'],xx,...
|
|
||||||
[oo.exo_steady_state,...
|
|
||||||
oo.exo_det_steady_state],...
|
|
||||||
M_.params);
|
|
||||||
|
|
||||||
% x = [x(1:orig_endo_nbr); zeros(orig_eq_nbr,1); x(orig_endo_nbr+1:end)];
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
% setting steady state of auxiliary variables
|
||||||
|
xx = zeros(endo_nbr,1);
|
||||||
|
xx(1:orig_endo_nbr) = x(1:orig_endo_nbr);
|
||||||
|
|
||||||
|
x = feval([M.fname '_set_auxiliary_variables'],xx,...
|
||||||
|
[oo.exo_steady_state,...
|
||||||
|
oo.exo_det_steady_state],...
|
||||||
|
M.params);
|
||||||
|
|
||||||
% value and Jacobian of objective function
|
% value and Jacobian of objective function
|
||||||
ex = zeros(1,M.exo_nbr);
|
ex = zeros(1,M.exo_nbr);
|
||||||
[U,Uy,Uyy] = feval([fname '_objective_static'],xx,ex, M_.params);
|
[U,Uy,Uyy] = feval([fname '_objective_static'],x,ex, M.params);
|
||||||
Uy = Uy';
|
Uy = Uy';
|
||||||
Uyy = reshape(Uyy,endo_nbr,endo_nbr);
|
Uyy = reshape(Uyy,endo_nbr,endo_nbr);
|
||||||
|
|
||||||
% set multipliers to 0 to compute residuals
|
% set multipliers to 0 to compute residuals
|
||||||
it_ = 1;
|
[f,fJ] = feval([fname '_static'],x,[oo.exo_simul oo.exo_det_simul], ...
|
||||||
[f,fJ] = feval([fname '_static'],xx,[oo.exo_simul oo.exo_det_simul], ...
|
M.params);
|
||||||
M_.params);
|
|
||||||
|
|
||||||
aux_eq = [1:orig_endo_nbr orig_endo_nbr+orig_eq_nbr+1:size(fJ,1)];
|
aux_eq = [1:orig_endo_nbr orig_endo_nbr+orig_eq_nbr+1:size(fJ,1)];
|
||||||
A = fJ(aux_eq,orig_endo_nbr+1:end);
|
A = fJ(aux_eq,orig_endo_nbr+1:end);
|
|
@ -66,31 +66,10 @@ if ~isempty(options_.mode_file) && ~options_.mh_posterior_mode_estimation
|
||||||
load(options_.mode_file);
|
load(options_.mode_file);
|
||||||
end
|
end
|
||||||
|
|
||||||
%% Compute the steady state:
|
|
||||||
if ~isempty(estim_params_)
|
if ~isempty(estim_params_)
|
||||||
set_parameters(xparam1);
|
set_parameters(xparam1);
|
||||||
end
|
end
|
||||||
if options_.steadystate_flag% if the *_steadystate.m file is provided.
|
|
||||||
[ys,tchek] = feval([M_.fname '_steadystate'],...
|
|
||||||
[zeros(M_.exo_nbr,1);...
|
|
||||||
oo_.exo_det_steady_state]);
|
|
||||||
if size(ys,1) < M_.endo_nbr
|
|
||||||
if length(M_.aux_vars) > 0
|
|
||||||
ys = add_auxiliary_variables_to_steadystate(ys,M_.aux_vars,...
|
|
||||||
M_.fname,...
|
|
||||||
zeros(M_.exo_nbr,1),...
|
|
||||||
oo_.exo_det_steady_state,...
|
|
||||||
M_.params,...
|
|
||||||
options_.bytecode);
|
|
||||||
else
|
|
||||||
error([M_.fname '_steadystate.m doesn''t match the model']);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
oo_.steady_state = ys;
|
|
||||||
else% if the steady state file is not provided.
|
|
||||||
[dd,info,M_,options_,oo_] = resol(0,M_,options_,oo_);
|
|
||||||
oo_.steady_state = dd.ys; clear('dd');
|
|
||||||
end
|
|
||||||
if all(abs(oo_.steady_state(bayestopt_.mfys))<1e-9)
|
if all(abs(oo_.steady_state(bayestopt_.mfys))<1e-9)
|
||||||
options_.noconstant = 1;
|
options_.noconstant = 1;
|
||||||
else
|
else
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
function [residuals,check1,jacob] = evaluate_static_model(ys,exo_ss,params,M,options)
|
||||||
|
|
||||||
|
% function [ys,info] = evaluate_steady_state(M,options,oo)
|
||||||
|
% Computes the steady state
|
||||||
|
%
|
||||||
|
% INPUTS
|
||||||
|
% ys vector initial values used to compute the steady
|
||||||
|
% state
|
||||||
|
% exo_ss vector exogenous steady state
|
||||||
|
% params vector parameters
|
||||||
|
% M struct model structure
|
||||||
|
% options struct options
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% residuals vector residuals when ys is not
|
||||||
|
% the steady state
|
||||||
|
% check1 scalar error flag
|
||||||
|
% jacob matrix Jacobian of static model
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2001-2011 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
check1 = 0;
|
||||||
|
fh_static = str2func([M.fname '_static']);
|
||||||
|
if options.bytecode
|
||||||
|
[check1, residuals] = bytecode('evaluate','static',ys,...
|
||||||
|
exo_ss, params, ys, 1);
|
||||||
|
mexErrCheck('bytecode', check1);
|
||||||
|
elseif options.block
|
||||||
|
residuals = zeros(M.endo_nbr,1);
|
||||||
|
mfs = M.blocksMFS;
|
||||||
|
for b = 1:size(mfs,1)
|
||||||
|
mfsb = mfs{b};
|
||||||
|
% blocks that can be directly evaluated (mfsb is empty)
|
||||||
|
% have zero residuals by construction
|
||||||
|
if ~isempty(mfsb)
|
||||||
|
residuals(mfsb) = feval(fh_static,b,ys,exo_ss,params);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
residuals = feval(fh_static,ys,exo_ss,params);
|
||||||
|
end
|
|
@ -0,0 +1,154 @@
|
||||||
|
function [ys,params,info] = evaluate_steady_state(ys_init,M,options,oo,steadystate_check_flag)
|
||||||
|
% function [ys,info] = evaluate_steady_state(M,options,oo)
|
||||||
|
% Computes the steady state
|
||||||
|
%
|
||||||
|
% INPUTS
|
||||||
|
% ys_init vector initial values used to compute the steady
|
||||||
|
% state
|
||||||
|
% M struct model structure
|
||||||
|
% options struct options
|
||||||
|
% oo struct output results
|
||||||
|
% steadystate_check_flag boolean if true, check that the
|
||||||
|
% steadystate verifies the
|
||||||
|
% static model
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% ys vector steady state
|
||||||
|
% params vector model parameters possibly
|
||||||
|
% modified by user steadystate
|
||||||
|
% function
|
||||||
|
% info 2x1 vector error codes
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2001-2011 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
info = 0;
|
||||||
|
check = 0;
|
||||||
|
|
||||||
|
steadystate_flag = options.steadystate_flag;
|
||||||
|
params = M.params;
|
||||||
|
exo_ss = [oo.exo_steady_state; oo.exo_det_steady_state];
|
||||||
|
updated_params_flag = 0;
|
||||||
|
fh_static = str2func([M.fname '_static']);
|
||||||
|
|
||||||
|
if length(M.aux_vars) > 0
|
||||||
|
h_set_auxiliary_variables = str2func([M.fname '_set_auxiliary_variables']);
|
||||||
|
ys_init = h_set_auxiliary_variables(ys_init,exo_ss,M.params);
|
||||||
|
end
|
||||||
|
|
||||||
|
if options.ramsey_policy
|
||||||
|
[ys,params] = dyn_ramsey_static(ys_init,M,options,oo);
|
||||||
|
elseif steadystate_flag
|
||||||
|
% explicit steady state file
|
||||||
|
[ys,params1,check] = evaluate_steady_state_file(ys_init,exo_ss,params,M.fname,steadystate_flag);
|
||||||
|
updated_params_flag = max(abs(params1-params)) > 1e-12;
|
||||||
|
if updated_params_flag
|
||||||
|
params = params1;
|
||||||
|
end
|
||||||
|
% adding values for auxiliary variables
|
||||||
|
if length(M.aux_vars) > 0
|
||||||
|
ys = h_set_auxiliary_variables(ys,exo_ss,M.params);
|
||||||
|
end
|
||||||
|
check1 = 0;
|
||||||
|
if steadystate_check_flag
|
||||||
|
% Check whether the steady state obtained from the _steadystate file is a steady state.
|
||||||
|
[residuals,check] = evaluate_static_model(ys,exo_ss,params,M,options);
|
||||||
|
if check
|
||||||
|
info(1) = 19;
|
||||||
|
info(2) = check; % to be improved
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
if max(abs(residuals)) > options.dynatol
|
||||||
|
info(1) = 19;
|
||||||
|
info(2) = residuals'*residuals;
|
||||||
|
return
|
||||||
|
end
|
||||||
|
elseif ~isempty(options.steadystate_partial)
|
||||||
|
ssvar = options.steadystate_partial.ssvar;
|
||||||
|
nov = length(ssvar);
|
||||||
|
indv = zeros(nov,1);
|
||||||
|
for i = 1:nov
|
||||||
|
indv(i) = strmatch(ssvar(i),M.endo_names,'exact');
|
||||||
|
end
|
||||||
|
[ys,check] = dynare_solve('restricted_steadystate',...
|
||||||
|
ys(indv),...
|
||||||
|
options.jacobian_flag, ...
|
||||||
|
exo_ss,indv);
|
||||||
|
end
|
||||||
|
elseif (options.bytecode == 0 && options.block == 0)
|
||||||
|
if options.linear == 0
|
||||||
|
% non linear model
|
||||||
|
[ys,check] = dynare_solve(fh_static,...
|
||||||
|
ys_init,...
|
||||||
|
options.jacobian_flag, ...
|
||||||
|
exo_ss, params);
|
||||||
|
else
|
||||||
|
% linear model
|
||||||
|
[fvec,jacob] = feval(fh_static,ys_init,exo_ss, ...
|
||||||
|
params);
|
||||||
|
if max(abs(fvec)) > 1e-12
|
||||||
|
ys = ys_init-jacob\fvec;
|
||||||
|
else
|
||||||
|
ys = ys_init;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
else
|
||||||
|
% block or bytecode
|
||||||
|
[ys,check] = dynare_solve_block_or_bytecode(ys_init,exo_ss, params);
|
||||||
|
end
|
||||||
|
|
||||||
|
if check
|
||||||
|
if options.steadystate_flag
|
||||||
|
info(1)= 19;
|
||||||
|
resid = check1 ;
|
||||||
|
else
|
||||||
|
info(1)= 20;
|
||||||
|
resid = evaluate_static_model(ys_init,exo_ss,params,M,options);
|
||||||
|
end
|
||||||
|
info(2) = resid'*resid ;
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~isreal(ys)
|
||||||
|
info(1) = 21;
|
||||||
|
info(2) = sum(imag(ys).^2);
|
||||||
|
ys = real(ys);
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~isempty(find(isnan(ys)))
|
||||||
|
info(1) = 22;
|
||||||
|
info(2) = NaN;
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if options.steadystate_flag && updated_params_flag && ~isreal(M.params)
|
||||||
|
info(1) = 23;
|
||||||
|
info(2) = sum(imag(M.params).^2);
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if options.steadystate_flag && updated_params_flag && ~isempty(find(isnan(M.params)))
|
||||||
|
info(1) = 24;
|
||||||
|
info(2) = NaN;
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
function [ys,params1,check] = evaluate_steady_state_file(ys_init,exo_ss,params,fname,steadystate_flag)
|
||||||
|
% function [ys,params1,check] = evaluate_steady_state_file(ys_init,exo_ss,params,steadystate_flag)
|
||||||
|
% Evaluates steady state files
|
||||||
|
%
|
||||||
|
% INPUTS
|
||||||
|
% ys_init vector initial values used to compute the steady
|
||||||
|
% state
|
||||||
|
% exo_ss vector exogenous steady state
|
||||||
|
% params vector parameters
|
||||||
|
% steadystate_check_flag boolean if true, check that the
|
||||||
|
% steadystate verifies the
|
||||||
|
% static model
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% ys vector steady state
|
||||||
|
% params1 vector model parameters possibly
|
||||||
|
% modified by user steadystate
|
||||||
|
% function
|
||||||
|
% check 2x1 vector error codes
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2001-2011 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
if steadystate_flag == 1
|
||||||
|
% old format
|
||||||
|
h_steadystate = str2func([fname '_steadystate']);
|
||||||
|
[ys,check] = h_steadystate(ys_init, exo_ss);
|
||||||
|
params1 = evalin('base','M_.params');
|
||||||
|
else % steadystate_flag == 2
|
||||||
|
% new format
|
||||||
|
h_steadystate = str2func([fname '_steadystate2']);
|
||||||
|
[ys,params1,check] = h_steadystate(ys_init, exo_ss, params);
|
||||||
|
end
|
||||||
|
|
|
@ -60,12 +60,15 @@ options_.threads.kronecker.A_times_B_kronecker_C = 1;
|
||||||
options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = 1;
|
options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = 1;
|
||||||
|
|
||||||
% steady state file
|
% steady state file
|
||||||
if exist([M_.fname '_steadystate.m'],'file')
|
if exist([M_.fname '_steadystate2.m'],'file')
|
||||||
|
options_.steadystate_flag = 2;
|
||||||
|
elseif exist([M_.fname '_steadystate.m'],'file')
|
||||||
options_.steadystate_flag = 1;
|
options_.steadystate_flag = 1;
|
||||||
else
|
else
|
||||||
options_.steadystate_flag = 0;
|
options_.steadystate_flag = 0;
|
||||||
end
|
end
|
||||||
options_.steadystate_partial = [];
|
options_.steadystate_partial = [];
|
||||||
|
options_.steadystate.nocheck = 0;
|
||||||
|
|
||||||
% subset of the estimated deep parameters
|
% subset of the estimated deep parameters
|
||||||
options_.ParamSubSet = 'None';
|
options_.ParamSubSet = 'None';
|
||||||
|
|
|
@ -3,12 +3,12 @@ function DynareResults = initial_estimation_checks(xparam1,DynareDataset,Model,E
|
||||||
% Checks data (complex values, ML evaluation, initial values, BK conditions,..)
|
% Checks data (complex values, ML evaluation, initial values, BK conditions,..)
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
% xparam1: vector of parameters to be estimated
|
% xparam1: vector of parameters to be estimated
|
||||||
% gend: scalar specifying the number of observations
|
% gend: scalar specifying the number of observations
|
||||||
% data: matrix of data
|
% data: matrix of data
|
||||||
%
|
%
|
||||||
% OUTPUTS
|
% OUTPUTS
|
||||||
% none
|
% DynareResults structure of temporary results
|
||||||
%
|
%
|
||||||
% SPECIAL REQUIREMENTS
|
% SPECIAL REQUIREMENTS
|
||||||
% none
|
% none
|
||||||
|
@ -34,56 +34,16 @@ if DynareDataset.info.nvobs>Model.exo_nbr+EstimatedParameters.nvn
|
||||||
error(['initial_estimation_checks:: Estimation can''t take place because there are less shocks than observed variables!'])
|
error(['initial_estimation_checks:: Estimation can''t take place because there are less shocks than observed variables!'])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
% check if steady state solves static model (except if diffuse_filter == 1)
|
||||||
|
[DynareResults.steady_state] = ...
|
||||||
|
evaluate_steady_state(DynareResults.steady_state,Model,DynareOptions,DynareResults,DynareOptions.diffuse_filter==0);
|
||||||
|
|
||||||
if DynareOptions.dsge_var
|
if DynareOptions.dsge_var
|
||||||
[fval,cost_flag,info] = DsgeVarLikelihood(xparam1,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults);
|
[fval,cost_flag,info] = DsgeVarLikelihood(xparam1,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults);
|
||||||
else
|
else
|
||||||
[fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults);
|
[fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults);
|
||||||
end
|
end
|
||||||
|
|
||||||
% when their is an analytical steadystate, check that the values
|
|
||||||
% returned by *_steadystate match with the static model
|
|
||||||
if DynareOptions.steadystate_flag
|
|
||||||
[ys,check] = feval([Model.fname '_steadystate'],...
|
|
||||||
DynareResults.steady_state,...
|
|
||||||
[DynareResults.exo_steady_state; ...
|
|
||||||
DynareResults.exo_det_steady_state]);
|
|
||||||
if size(ys,1) < Model.endo_nbr
|
|
||||||
if length(Model.aux_vars) > 0
|
|
||||||
ys = add_auxiliary_variables_to_steadystate(ys,Model.aux_vars,...
|
|
||||||
Model.fname,...
|
|
||||||
DynareResults.exo_steady_state,...
|
|
||||||
DynareResults.exo_det_steady_state,...
|
|
||||||
Model.params,...
|
|
||||||
DynareOptions.bytecode);
|
|
||||||
else
|
|
||||||
error([Model.fname '_steadystate.m doesn''t match the model']);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
DynareResults.steady_state = ys;
|
|
||||||
% Check if the steady state obtained from the _steadystate file is a
|
|
||||||
% steady state.
|
|
||||||
check1 = 0;
|
|
||||||
if isfield(DynareOptions,'unit_root_vars') && DynareOptions.diffuse_filter == 0
|
|
||||||
if isempty(DynareOptions.unit_root_vars)
|
|
||||||
if ~DynareOptions.bytecode
|
|
||||||
check1 = max(abs(feval([Model.fname '_static'],...
|
|
||||||
DynareResults.steady_state,...
|
|
||||||
[DynareResults.exo_steady_state; ...
|
|
||||||
DynareResults.exo_det_steady_state], Model.params))) > DynareOptions.dynatol ;
|
|
||||||
else
|
|
||||||
[info, res] = bytecode('static','evaluate',DynareResults.steady_state,...
|
|
||||||
[DynareResults.exo_steady_state; ...
|
|
||||||
DynareResults.exo_det_steady_state], Model.params);
|
|
||||||
check1 = max(abs(res)) > DynareOptions.dynatol;
|
|
||||||
end
|
|
||||||
if check1
|
|
||||||
error(['The seadystate values returned by ' Model.fname ...
|
|
||||||
'_steadystate.m don''t solve the static model!' ])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if info(1) > 0
|
if info(1) > 0
|
||||||
disp('Error in computing likelihood for initial parameter values')
|
disp('Error in computing likelihood for initial parameter values')
|
||||||
print_info(info, DynareOptions.noprint)
|
print_info(info, DynareOptions.noprint)
|
||||||
|
|
|
@ -42,54 +42,10 @@ exe =zeros(M_.exo_nbr,1);
|
||||||
|
|
||||||
dr = set_state_space(oo_.dr,M_);
|
dr = set_state_space(oo_.dr,M_);
|
||||||
|
|
||||||
% check if ys is steady state
|
|
||||||
if exist([M_.fname '_steadystate'])
|
|
||||||
[ys,check1] = feval([M_.fname '_steadystate'],oo_.steady_state,...
|
|
||||||
[oo_.exo_steady_state; oo_.exo_det_steady_state]);
|
|
||||||
if size(ys,1) < M_.endo_nbr
|
|
||||||
if length(M_.aux_vars) > 0
|
|
||||||
ys = add_auxiliary_variables_to_steadystate(ys,M_.aux_vars,...
|
|
||||||
M_.fname,...
|
|
||||||
oo_.exo_steady_state,...
|
|
||||||
oo_.exo_det_steady_state,M_.params,...
|
|
||||||
options_.bytecode);
|
|
||||||
else
|
|
||||||
error([M_.fname '_steadystate.m doesn''t match the model']);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
dr.ys = ys;
|
|
||||||
else
|
|
||||||
% testing if ys isn't a steady state or if we aren't computing Ramsey policy
|
|
||||||
fh = str2func([M_.fname '_static']);
|
|
||||||
if max(abs(feval(fh,oo_.steady_state,[oo_.exo_steady_state; oo_.exo_det_steady_state], M_.params))) ...
|
|
||||||
> options_.dynatol && options_.ramsey_policy == 0
|
|
||||||
if options_.linear == 0
|
|
||||||
% nonlinear models
|
|
||||||
[dr.ys,check1] = dynare_solve(fh,dr.ys,options_.jacobian_flag,...
|
|
||||||
[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state], M_.params);
|
|
||||||
else
|
|
||||||
% linear models
|
|
||||||
[fvec,jacob] = feval(fh,oo_.steady_state,[oo_.exo_steady_state;...
|
|
||||||
oo_.exo_det_steady_state], M_.params);
|
|
||||||
dr.ys = oo_.steady_state-jacob\fvec;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
oo_.dr = dr;
|
|
||||||
% $$$ if max(abs(feval(fh, oo_.steady_state, exe, M_.params))) > options_.dynatol
|
|
||||||
% $$$ [oo_.dr.ys, check] = dynare_solve([M_.fname '_static'], oo_.steady_state, 1, exe, M_.params);
|
|
||||||
% $$$ if check
|
|
||||||
% $$$ error('OLR: convergence problem in DYNARE_SOLVE')
|
|
||||||
% $$$ end
|
|
||||||
% $$$ else
|
|
||||||
% $$$ oo_.dr.ys = oo_.steady_state;
|
|
||||||
% $$$ end
|
|
||||||
|
|
||||||
|
|
||||||
np = size(i_params,1);
|
np = size(i_params,1);
|
||||||
t0 = M_.params(i_params);
|
t0 = M_.params(i_params);
|
||||||
inv_order_var = oo_.dr.inv_order_var;
|
inv_order_var = dr.inv_order_var;
|
||||||
|
|
||||||
H0 = 1e-4*eye(np);
|
H0 = 1e-4*eye(np);
|
||||||
crit = 1e-7;
|
crit = 1e-7;
|
||||||
|
|
|
@ -60,11 +60,11 @@ if ~noprint
|
||||||
case 21
|
case 21
|
||||||
error('The steady state is complex.')
|
error('The steady state is complex.')
|
||||||
case 22
|
case 22
|
||||||
error('The steady state contains NaN.')
|
error('The steady state contains NaN or Inf.')
|
||||||
case 23
|
case 23
|
||||||
error('Some updated params are complex.')
|
error('Some updated params are complex.')
|
||||||
case 24
|
case 24
|
||||||
error('Some updated params contain NaN.')
|
error('Some updated params contain NaN or Inf.')
|
||||||
case 30
|
case 30
|
||||||
error('Variance can''t be computed')
|
error('Variance can''t be computed')
|
||||||
case 41
|
case 41
|
||||||
|
|
127
matlab/resol.m
127
matlab/resol.m
|
@ -93,10 +93,6 @@ function [dr,info,M,options,oo] = resol(check_flag,M,options,oo)
|
||||||
% You should have received a copy of the GNU General Public License
|
% You should have received a copy of the GNU General Public License
|
||||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
global it_
|
|
||||||
|
|
||||||
jacobian_flag = 0;
|
|
||||||
|
|
||||||
if isfield(oo,'dr');
|
if isfield(oo,'dr');
|
||||||
dr = oo.dr;
|
dr = oo.dr;
|
||||||
end
|
end
|
||||||
|
@ -110,136 +106,19 @@ if M.exo_nbr == 0
|
||||||
oo.exo_steady_state = [] ;
|
oo.exo_steady_state = [] ;
|
||||||
end
|
end
|
||||||
|
|
||||||
params0 = M.params;
|
[dr.ys,M.params,info] = evaluate_steady_state(oo.steady_state,M,options,oo,0);
|
||||||
|
|
||||||
% check if steady_state_0 (-> oo.steady_state) is steady state
|
if info(1)
|
||||||
tempex = oo.exo_simul;
|
|
||||||
oo.exo_simul = repmat(oo.exo_steady_state',M.maximum_lag+M.maximum_lead+1,1);
|
|
||||||
if M.exo_det_nbr > 0
|
|
||||||
tempexdet = oo.exo_det_simul;
|
|
||||||
oo.exo_det_simul = repmat(oo.exo_det_steady_state',M.maximum_lag+M.maximum_lead+1,1);
|
|
||||||
end
|
|
||||||
steady_state = oo.steady_state;
|
|
||||||
check1 = 0;
|
|
||||||
% testing for steadystate file
|
|
||||||
if (~options.bytecode)
|
|
||||||
fh = [M.fname '_static'];
|
|
||||||
end
|
|
||||||
|
|
||||||
if options.steadystate_flag
|
|
||||||
[steady_state,check1] = feval([M.fname '_steadystate'],steady_state,...
|
|
||||||
[oo.exo_steady_state; ...
|
|
||||||
oo.exo_det_steady_state]);
|
|
||||||
if size(steady_state,1) < M.endo_nbr
|
|
||||||
if length(M.aux_vars) > 0
|
|
||||||
steady_state = add_auxiliary_variables_to_steadystate(steady_state,M.aux_vars,...
|
|
||||||
M.fname,...
|
|
||||||
oo.exo_steady_state,...
|
|
||||||
oo.exo_det_steady_state,...
|
|
||||||
M.params,...
|
|
||||||
options.bytecode);
|
|
||||||
else
|
|
||||||
error([M.fname '_steadystate.m doesn''t match the model']);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
% testing if steady_state_0 (-> oo.steady_state) isn't a steady state or if we aren't computing Ramsey policy
|
|
||||||
if options.ramsey_policy == 0
|
|
||||||
if options.linear == 0
|
|
||||||
% nonlinear models
|
|
||||||
if (options.block == 0 && options.bytecode == 0)
|
|
||||||
if max(abs(feval(fh,steady_state,[oo.exo_steady_state; ...
|
|
||||||
oo.exo_det_steady_state], M.params))) > options.dynatol
|
|
||||||
[steady_state,check1] = dynare_solve(fh,steady_state,options.jacobian_flag,...
|
|
||||||
[oo.exo_steady_state; ...
|
|
||||||
oo.exo_det_steady_state], M.params);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
[steady_state,check1] = dynare_solve_block_or_bytecode(steady_state,...
|
|
||||||
[oo.exo_steady_state; ...
|
|
||||||
oo.exo_det_steady_state], M.params);
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
if (options.block == 0 && options.bytecode == 0)
|
|
||||||
% linear models
|
|
||||||
[fvec,jacob] = feval(fh,steady_state,[oo.exo_steady_state;...
|
|
||||||
oo.exo_det_steady_state], M.params);
|
|
||||||
if max(abs(fvec)) > 1e-12
|
|
||||||
steady_state = steady_state-jacob\fvec;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
[steady_state,check1] = dynare_solve_block_or_bytecode(steady_state,...
|
|
||||||
[oo.exo_steady_state; ...
|
|
||||||
oo.exo_det_steady_state], M.params);
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
% test if M.params_has changed.
|
|
||||||
if options.steadystate_flag
|
|
||||||
updated_params_flag = max(abs(M.params-params0))>1e-12;
|
|
||||||
else
|
|
||||||
updated_params_flag = 0;
|
|
||||||
end
|
|
||||||
|
|
||||||
% testing for problem.
|
|
||||||
dr.ys = steady_state;
|
|
||||||
|
|
||||||
if check1
|
|
||||||
if options.steadystate_flag
|
|
||||||
info(1)= 19;
|
|
||||||
resid = check1 ;
|
|
||||||
else
|
|
||||||
info(1)= 20;
|
|
||||||
resid = feval(fh,oo.steady_state,oo.exo_steady_state, M.params);
|
|
||||||
end
|
|
||||||
info(2) = resid'*resid ;
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if ~isreal(steady_state)
|
|
||||||
info(1) = 21;
|
|
||||||
info(2) = sum(imag(steady_state).^2);
|
|
||||||
steady_state = real(steady_state);
|
|
||||||
dr.ys = steady_state;
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if ~isempty(find(isnan(steady_state)))
|
|
||||||
info(1) = 22;
|
|
||||||
info(2) = NaN;
|
|
||||||
dr.ys = steady_state;
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if options.steadystate_flag && updated_params_flag && ~isreal(M.params)
|
|
||||||
info(1) = 23;
|
|
||||||
info(2) = sum(imag(M.params).^2);
|
|
||||||
dr.ys = steady_state;
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if options.steadystate_flag && updated_params_flag && ~isempty(find(isnan(M.params)))
|
|
||||||
info(1) = 24;
|
|
||||||
info(2) = NaN;
|
|
||||||
dr.ys = steady_state;
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
if options.block
|
if options.block
|
||||||
[dr,info,M,options,oo] = dr_block(dr,check_flag,M,options,oo);
|
[dr,info,M,options,oo] = dr_block(dr,check_flag,M,options,oo);
|
||||||
else
|
else
|
||||||
[dr,info,M,options,oo] = dr1(dr,check_flag,M,options,oo);
|
[dr,info,M,options,oo] = dr1(dr,check_flag,M,options,oo);
|
||||||
end
|
end
|
||||||
|
|
||||||
if info(1)
|
if info(1)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if M.exo_det_nbr > 0
|
|
||||||
oo.exo_det_simul = tempexdet;
|
|
||||||
end
|
|
||||||
oo.exo_simul = tempex;
|
|
||||||
tempex = [];
|
|
|
@ -34,9 +34,6 @@ test_for_deep_parameters_calibration(M_);
|
||||||
|
|
||||||
options_ = set_default_option(options_,'jacobian_flag',1);
|
options_ = set_default_option(options_,'jacobian_flag',1);
|
||||||
options_ = set_default_option(options_,'steadystate_flag',0);
|
options_ = set_default_option(options_,'steadystate_flag',0);
|
||||||
if exist([M_.fname '_steadystate.m'])
|
|
||||||
options_.steadystate_flag = 1;
|
|
||||||
end
|
|
||||||
|
|
||||||
if options_.steadystate_flag && options_.homotopy_mode
|
if options_.steadystate_flag && options_.homotopy_mode
|
||||||
error('STEADY: Can''t use homotopy when providing a steady state external file');
|
error('STEADY: Can''t use homotopy when providing a steady state external file');
|
||||||
|
@ -51,7 +48,11 @@ switch options_.homotopy_mode
|
||||||
homotopy3(options_.homotopy_values, options_.homotopy_steps);
|
homotopy3(options_.homotopy_values, options_.homotopy_steps);
|
||||||
end
|
end
|
||||||
|
|
||||||
steady_;
|
[oo_.steady_state,M_.params,info] = steady_(M_,options_,oo_);
|
||||||
|
|
||||||
|
if info(1)
|
||||||
|
print_info(info,options_.noprint);
|
||||||
|
end
|
||||||
|
|
||||||
disp_steady_state(M_,oo_);
|
disp_steady_state(M_,oo_);
|
||||||
|
|
||||||
|
|
103
matlab/steady_.m
103
matlab/steady_.m
|
@ -1,12 +1,19 @@
|
||||||
function steady_()
|
function [steady_state,params,info] = steady_(M_,options_,oo_)
|
||||||
% function steady_()
|
% function [steady_state,params,info] = steady_(M_,options_,oo_)
|
||||||
% Computes the steady state
|
% Computes the steady state
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
% none
|
% M struct model structure
|
||||||
|
% options struct options
|
||||||
|
% oo struct output results
|
||||||
%
|
%
|
||||||
% OUTPUTS
|
% OUTPUTS
|
||||||
% none
|
% steady_state vector steady state
|
||||||
|
% params vector parameters (may have been
|
||||||
|
% modified by user in
|
||||||
|
% explicit computation of
|
||||||
|
% the steady state)
|
||||||
|
% info 2x1 vector error codes
|
||||||
%
|
%
|
||||||
% SPECIAL REQUIREMENTS
|
% SPECIAL REQUIREMENTS
|
||||||
% none
|
% none
|
||||||
|
@ -28,8 +35,6 @@ function steady_()
|
||||||
% You should have received a copy of the GNU General Public License
|
% You should have received a copy of the GNU General Public License
|
||||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
global M_ oo_ options_
|
|
||||||
|
|
||||||
if options_.solve_algo < 0 || options_.solve_algo > 8
|
if options_.solve_algo < 0 || options_.solve_algo > 8
|
||||||
error('STEADY: solve_algo must be between 0 and 8')
|
error('STEADY: solve_algo must be between 0 and 8')
|
||||||
end
|
end
|
||||||
|
@ -46,88 +51,4 @@ if exist('OCTAVE_VERSION') && options_.solve_algo == 7
|
||||||
error('SIMUL: you can''t use solve_algo = 7 under Octave')
|
error('SIMUL: you can''t use solve_algo = 7 under Octave')
|
||||||
end
|
end
|
||||||
|
|
||||||
if options_.steadystate_flag
|
[steady_state,params,info] = evaluate_steady_state(oo_.steady_state,M_,options_,oo_,~options_.steadystate.nocheck);
|
||||||
[ys,check] = feval([M_.fname '_steadystate'],...
|
|
||||||
oo_.steady_state,...
|
|
||||||
[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state]);
|
|
||||||
if size(ys,1) < M_.endo_nbr
|
|
||||||
if length(M_.aux_vars) > 0
|
|
||||||
ys = add_auxiliary_variables_to_steadystate(ys,M_.aux_vars,...
|
|
||||||
M_.fname,...
|
|
||||||
oo_.exo_steady_state,...
|
|
||||||
oo_.exo_det_steady_state,...
|
|
||||||
M_.params,...
|
|
||||||
options_.bytecode);
|
|
||||||
else
|
|
||||||
error([M_.fname '_steadystate.m doesn''t match the model']);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
oo_.steady_state = ys;
|
|
||||||
% Check if the steady state obtained from the _steadystate file is a steady state.
|
|
||||||
check1 = 0;
|
|
||||||
if isempty(options_.unit_root_vars)
|
|
||||||
if options_.block && ~options_.bytecode
|
|
||||||
check2 = zeros(size(M_.blocksMFS,1),1);
|
|
||||||
for b = 1:size(M_.blocksMFS,1)
|
|
||||||
n = size(M_.blocksMFS{b}, 1);
|
|
||||||
ss = oo_.steady_state;
|
|
||||||
if n
|
|
||||||
check2(b) = max(abs(feval([M_.fname '_static'], b, ss, ...
|
|
||||||
[oo_.exo_steady_state; oo_.exo_det_steady_state], M_.params))) > options_.dynatol;
|
|
||||||
else
|
|
||||||
[r, g1, ssss] = feval([M_.fname '_static'], b, ss, ...
|
|
||||||
[oo_.exo_steady_state; oo_.exo_det_steady_state], M_.params);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
check1 = any(check2);
|
|
||||||
idx = find(abs(ssss-oo_.steady_state)>10*options_.dynatol);
|
|
||||||
if ~isempty(idx)
|
|
||||||
check1 = 1;
|
|
||||||
end
|
|
||||||
elseif options_.bytecode
|
|
||||||
[check1, residuals] = bytecode('evaluate','static',oo_.steady_state,...
|
|
||||||
[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state], M_.params, oo_.steady_state, 1);
|
|
||||||
mexErrCheck('bytecode', check1);
|
|
||||||
check1 = max(abs(residuals)) > options_.dynatol ;
|
|
||||||
else
|
|
||||||
check1 = 0;
|
|
||||||
check1 = max(abs(feval([M_.fname '_static'],...
|
|
||||||
oo_.steady_state,...
|
|
||||||
[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state], M_.params))) > options_.dynatol ;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if check1
|
|
||||||
resid;
|
|
||||||
error(['The steadystate values returned by ' M_.fname ...
|
|
||||||
'_steadystate.m don''t solve the static model!' ])
|
|
||||||
end
|
|
||||||
if ~isempty(options_.steadystate_partial)
|
|
||||||
ssvar = options_.steadystate_partial.ssvar;
|
|
||||||
nov = length(ssvar);
|
|
||||||
indv = zeros(nov,1);
|
|
||||||
for i = 1:nov
|
|
||||||
indv(i) = strmatch(ssvar(i),M_.endo_names,'exact');
|
|
||||||
end
|
|
||||||
[oo_.steady_state,check] = dynare_solve('restricted_steadystate',...
|
|
||||||
oo_.steady_state(indv),...
|
|
||||||
options_.jacobian_flag, ...
|
|
||||||
[oo_.exo_steady_state;oo_.exo_det_steady_state],indv);
|
|
||||||
end
|
|
||||||
elseif (options_.bytecode == 0 && options_.block == 0)
|
|
||||||
[oo_.steady_state,check] = dynare_solve([M_.fname '_static'],...
|
|
||||||
oo_.steady_state,...
|
|
||||||
options_.jacobian_flag, ...
|
|
||||||
[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state], M_.params);
|
|
||||||
else
|
|
||||||
[oo_.steady_state,check] = dynare_solve_block_or_bytecode(oo_.steady_state,...
|
|
||||||
[oo_.exo_steady_state; ...
|
|
||||||
oo_.exo_det_steady_state], M_.params);
|
|
||||||
end
|
|
||||||
|
|
||||||
if check ~= 0
|
|
||||||
error('STEADY: convergence problems')
|
|
||||||
end
|
|
|
@ -584,7 +584,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case eParameter:
|
case eParameter:
|
||||||
if (output_type == oMatlabOutsideModel || output_type == oSteadyStateFile)
|
if (output_type == oMatlabOutsideModel)
|
||||||
output << "M_.params" << "(" << tsid + 1 << ")";
|
output << "M_.params" << "(" << tsid + 1 << ")";
|
||||||
else
|
else
|
||||||
output << "params" << LEFT_ARRAY_SUBSCRIPT(output_type) << tsid + ARRAY_SUBSCRIPT_OFFSET(output_type) << RIGHT_ARRAY_SUBSCRIPT(output_type);
|
output << "params" << LEFT_ARRAY_SUBSCRIPT(output_type) << tsid + ARRAY_SUBSCRIPT_OFFSET(output_type) << RIGHT_ARRAY_SUBSCRIPT(output_type);
|
||||||
|
|
|
@ -103,7 +103,7 @@ SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_polic
|
||||||
if (recursive_order.size() == 0)
|
if (recursive_order.size() == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
string filename = basename + "_steadystate.m";
|
string filename = basename + "_steadystate2.m";
|
||||||
|
|
||||||
ofstream output;
|
ofstream output;
|
||||||
output.open(filename.c_str(), ios::out | ios::binary);
|
output.open(filename.c_str(), ios::out | ios::binary);
|
||||||
|
@ -113,16 +113,11 @@ SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_polic
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
output << "function [ys_, check_] = " << basename << "_steadystate(";
|
output << "function [ys_, params, info] = " << basename << "_steadystate2("
|
||||||
if (ramsey_policy)
|
<< "ys_, exo_, params)" << endl
|
||||||
output << "ys_";
|
<< "% Steady state generated by Dynare preprocessor" << endl
|
||||||
else
|
<< " info = 0;" << endl
|
||||||
output << "ys_orig_";
|
<< " ys_ = zeros(" << symbol_table.endo_nbr() << ",1);" << endl;
|
||||||
output << ", exo_)" << endl
|
|
||||||
<< "% Steady state generated by Dynare preprocessor" << endl;
|
|
||||||
if (!ramsey_policy)
|
|
||||||
output << " ys_=zeros(" << symbol_table.endo_nbr() << ",1);" << endl;
|
|
||||||
output << " global M_" << endl;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < recursive_order.size(); i++)
|
for (size_t i = 0; i < recursive_order.size(); i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,7 +21,14 @@ MODFILES = \
|
||||||
comments.mod \
|
comments.mod \
|
||||||
histval_sto.mod \
|
histval_sto.mod \
|
||||||
histval_det.mod \
|
histval_det.mod \
|
||||||
|
auxiliary_variables/test1.mod \
|
||||||
expectations/expectation.mod \
|
expectations/expectation.mod \
|
||||||
|
expectations/expectation_ss.mod \
|
||||||
|
expectations/expectation_ss_old.mod \
|
||||||
|
steady_state/walsh1_initval.mod \
|
||||||
|
steady_state/walsh1_old_ss.mod \
|
||||||
|
steady_state/walsh1_ssm.mod \
|
||||||
|
steady_state/walsh1_ssm_block.mod \
|
||||||
steady_state_operator/standard.mod \
|
steady_state_operator/standard.mod \
|
||||||
steady_state_operator/use_dll.mod \
|
steady_state_operator/use_dll.mod \
|
||||||
steady_state_operator/block.mod \
|
steady_state_operator/block.mod \
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
var x, y;
|
||||||
|
varexo e;
|
||||||
|
|
||||||
|
model;
|
||||||
|
expectation(-2)(x(+4)*y(+1)) = 1;
|
||||||
|
y = exp(e);
|
||||||
|
end;
|
||||||
|
|
||||||
|
initval;
|
||||||
|
y = 1;
|
||||||
|
x = 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady;
|
|
@ -41,4 +41,4 @@ var u; stderr 0.009;
|
||||||
var e, u = phi*0.009*0.009;
|
var e, u = phi*0.009*0.009;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
stoch_simul;
|
stoch_simul(order=1,irf=0);
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Example 1 from Collard's guide to Dynare
|
||||||
|
var y, c, k, a, h, b;
|
||||||
|
varexo e, u;
|
||||||
|
|
||||||
|
parameters beta, rho, alpha, delta, theta, psi, tau;
|
||||||
|
|
||||||
|
alpha = 0.36;
|
||||||
|
rho = 0.95;
|
||||||
|
tau = 0.025;
|
||||||
|
beta = 0.99;
|
||||||
|
|
||||||
|
delta = 0.025;
|
||||||
|
psi = 0;
|
||||||
|
theta = 2.95;
|
||||||
|
|
||||||
|
phi = 0.1;
|
||||||
|
|
||||||
|
model;
|
||||||
|
c*theta*h^(1+psi)=(expectation(1)((1-alpha)*y)+expectation(-2)((1-alpha)*y))/2;
|
||||||
|
k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))
|
||||||
|
*(exp(b(+1))*alpha*y(+1)+(1-delta)*k));
|
||||||
|
y = exp(a)*(k(-1)^alpha)*(h^(1-alpha));
|
||||||
|
k = exp(b)*(y-c)+(1-delta)*k(-1);
|
||||||
|
a = rho*a(-1)+tau*b(-1) + e;
|
||||||
|
b = tau*a(-1)+rho*b(-1) + u;
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady_state_model;
|
||||||
|
a = 0;
|
||||||
|
b = 0;
|
||||||
|
h = 1/3;
|
||||||
|
k = ((1/beta-(1-delta))/(alpha*h^(1-alpha)))^(1/(alpha-1));
|
||||||
|
y = k^alpha*h^(1-alpha);
|
||||||
|
c = y - delta*k;
|
||||||
|
theta = (1-alpha)*y/(c*h^(1+psi));
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var e; stderr 0.009;
|
||||||
|
var u; stderr 0.009;
|
||||||
|
var e, u = phi*0.009*0.009;
|
||||||
|
end;
|
||||||
|
|
||||||
|
stoch_simul(order=1,irf=0);
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Example 1 from Collard's guide to Dynare
|
||||||
|
var y, c, k, a, h, b;
|
||||||
|
varexo e, u;
|
||||||
|
|
||||||
|
parameters beta, rho, alpha, delta, theta, psi, tau;
|
||||||
|
|
||||||
|
alpha = 0.36;
|
||||||
|
rho = 0.95;
|
||||||
|
tau = 0.025;
|
||||||
|
beta = 0.99;
|
||||||
|
|
||||||
|
delta = 0.025;
|
||||||
|
psi = 0;
|
||||||
|
theta = 2.95;
|
||||||
|
|
||||||
|
phi = 0.1;
|
||||||
|
|
||||||
|
model;
|
||||||
|
c*theta*h^(1+psi)=(expectation(1)((1-alpha)*y)+expectation(-2)((1-alpha)*y))/2;
|
||||||
|
k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))
|
||||||
|
*(exp(b(+1))*alpha*y(+1)+(1-delta)*k));
|
||||||
|
y = exp(a)*(k(-1)^alpha)*(h^(1-alpha));
|
||||||
|
k = exp(b)*(y-c)+(1-delta)*k(-1);
|
||||||
|
a = rho*a(-1)+tau*b(-1) + e;
|
||||||
|
b = tau*a(-1)+rho*b(-1) + u;
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var e; stderr 0.009;
|
||||||
|
var u; stderr 0.009;
|
||||||
|
var e, u = phi*0.009*0.009;
|
||||||
|
end;
|
||||||
|
|
||||||
|
stoch_simul(order=1,irf=0);
|
|
@ -0,0 +1,68 @@
|
||||||
|
var y c k m n R pi z u;
|
||||||
|
varexo e sigma;
|
||||||
|
// sigma stands for phi in the eq 2.37 p.69
|
||||||
|
|
||||||
|
parameters alpha beta delta gamm phi1 eta a b rho phi2 Psi thetass;
|
||||||
|
//phi1 stands for capital phi in eq.2.68 and 2.69
|
||||||
|
//phi2 stands for lowercase phi in eq. 2.66
|
||||||
|
|
||||||
|
change_type(var) Psi;
|
||||||
|
change_type(parameters) n;
|
||||||
|
|
||||||
|
alpha = 0.36;
|
||||||
|
beta = 0.989;
|
||||||
|
gamm = 0.5;
|
||||||
|
delta = 0.019;
|
||||||
|
phi1 = 2;
|
||||||
|
phi2 = 0;
|
||||||
|
eta = 1;
|
||||||
|
a = 0.95;
|
||||||
|
b = 2.56;
|
||||||
|
rho = 0.95;
|
||||||
|
//Psi = 1.47630583;
|
||||||
|
thetass = 1.0125;
|
||||||
|
|
||||||
|
model;
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = (a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*(1-a)*exp(m)^(-b)+beta*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b)/(1+pi(+1));
|
||||||
|
|
||||||
|
Psi*(1-exp(n))^(-eta)/(a*exp(c)^(-b)*(a*exp(c)^(1-b) + (1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))) = (1-alpha)*exp(y)/exp(n);
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = beta*exp(R(+1))*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b);
|
||||||
|
|
||||||
|
exp(R) = alpha*exp(y)/exp(k(-1)) + 1-delta;
|
||||||
|
|
||||||
|
exp(k) = (1-delta)*exp(k(-1))+exp(y)-exp(c);
|
||||||
|
|
||||||
|
exp(y) = exp(z)*exp(k(-1))^alpha*exp(n)^(1-alpha);
|
||||||
|
|
||||||
|
exp(m) = exp(m(-1))*(u+thetass)/(1+pi);
|
||||||
|
|
||||||
|
z = rho*z(-1) + e;
|
||||||
|
|
||||||
|
u = gamm*u(-1) + phi2*z(-1) + sigma;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var e; stderr 0.007;
|
||||||
|
var sigma;stderr 0.0089;
|
||||||
|
end;
|
||||||
|
|
||||||
|
n=log(1/3);
|
||||||
|
|
||||||
|
initval;
|
||||||
|
y = 0.2;
|
||||||
|
c = 0.03;
|
||||||
|
k = 2.7;
|
||||||
|
m = 0.3;
|
||||||
|
Psi = 1.5;
|
||||||
|
R = 0.01;
|
||||||
|
pi = 0.01;
|
||||||
|
z = 0;
|
||||||
|
u = 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
steady;
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
var y c k m n R pi z u;
|
||||||
|
varexo e sigma;
|
||||||
|
// sigma stands for phi in the eq 2.37 p.69
|
||||||
|
|
||||||
|
parameters alpha beta delta gamm phi1 eta a b rho phi2 Psi thetass;
|
||||||
|
//phi1 stands for capital phi in eq.2.68 and 2.69
|
||||||
|
//phi2 stands for lowercase phi in eq. 2.66
|
||||||
|
|
||||||
|
alpha = 0.36;
|
||||||
|
beta = 0.989;
|
||||||
|
gamm = 0.5;
|
||||||
|
delta = 0.019;
|
||||||
|
phi1 = 2;
|
||||||
|
phi2 = 0;
|
||||||
|
eta = 1;
|
||||||
|
a = 0.95;
|
||||||
|
b = 2.56;
|
||||||
|
rho = 0.95;
|
||||||
|
Psi = 1.47630583;
|
||||||
|
thetass = 1.0125;
|
||||||
|
|
||||||
|
model;
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = (a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*(1-a)*exp(m)^(-b)+beta*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b)/(1+pi(+1));
|
||||||
|
|
||||||
|
Psi*(1-exp(n))^(-eta)/(a*exp(c)^(-b)*(a*exp(c)^(1-b) + (1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))) = (1-alpha)*exp(y)/exp(n);
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = beta*exp(R(+1))*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b);
|
||||||
|
|
||||||
|
exp(R) = alpha*exp(y)/exp(k(-1)) + 1-delta;
|
||||||
|
|
||||||
|
exp(k) = (1-delta)*exp(k(-1))+exp(y)-exp(c);
|
||||||
|
|
||||||
|
exp(y) = exp(z)*exp(k(-1))^alpha*exp(n)^(1-alpha);
|
||||||
|
|
||||||
|
exp(m) = exp(m(-1))*(u+thetass)/(1+pi);
|
||||||
|
|
||||||
|
z = rho*z(-1) + e;
|
||||||
|
|
||||||
|
u = gamm*u(-1) + phi2*z(-1) + sigma;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var e; stderr 0.007;
|
||||||
|
var sigma;stderr 0.0089;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
steady;
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
var y c k m n R pi z u;
|
||||||
|
varexo e sigma;
|
||||||
|
// sigma stands for phi in the eq 2.37 p.69
|
||||||
|
|
||||||
|
parameters alpha beta delta gamm phi1 eta a b rho phi2 Psi thetass;
|
||||||
|
//phi1 stands for capital phi in eq.2.68 and 2.69
|
||||||
|
//phi2 stands for lowercase phi in eq. 2.66
|
||||||
|
|
||||||
|
alpha = 0.36;
|
||||||
|
beta = 0.989;
|
||||||
|
gamm = 0.5;
|
||||||
|
delta = 0.019;
|
||||||
|
phi1 = 2;
|
||||||
|
phi2 = 0;
|
||||||
|
eta = 1;
|
||||||
|
a = 0.95;
|
||||||
|
b = 2.56;
|
||||||
|
rho = 0.95;
|
||||||
|
Psi = 1.47630583;
|
||||||
|
thetass = 1.0125;
|
||||||
|
|
||||||
|
model;
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = (a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*(1-a)*exp(m)^(-b)+beta*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b)/(1+pi(+1));
|
||||||
|
|
||||||
|
Psi*(1-exp(n))^(-eta)/(a*exp(c)^(-b)*(a*exp(c)^(1-b) + (1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))) = (1-alpha)*exp(y)/exp(n);
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = beta*exp(R(+1))*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b);
|
||||||
|
|
||||||
|
exp(R) = alpha*exp(y)/exp(k(-1)) + 1-delta;
|
||||||
|
|
||||||
|
exp(k) = (1-delta)*exp(k(-1))+exp(y)-exp(c);
|
||||||
|
|
||||||
|
exp(y) = exp(z)*exp(k(-1))^alpha*exp(n)^(1-alpha);
|
||||||
|
|
||||||
|
exp(m) = exp(m(-1))*(u+thetass)/(1+pi);
|
||||||
|
|
||||||
|
z = rho*z(-1) + e;
|
||||||
|
|
||||||
|
u = gamm*u(-1) + phi2*z(-1) + sigma;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var e; stderr 0.007;
|
||||||
|
var sigma;stderr 0.0089;
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady_state_model;
|
||||||
|
// solving in levels
|
||||||
|
// calibrating n = 1/3 and recovering the value of Psi
|
||||||
|
// adapting solution Walsh (2003) p. 84
|
||||||
|
pi = thetass-1;
|
||||||
|
en = 1/3;
|
||||||
|
eR = 1/beta;
|
||||||
|
y_k = (1/alpha)*(1/beta-1+delta);
|
||||||
|
ek = en*y_k^(-1/(1-alpha));
|
||||||
|
ec = ek*(y_k-delta);
|
||||||
|
em = ec*(a/(1-a))^(-1/b)*((thetass-beta)/thetass)^(-1/b);
|
||||||
|
ey = ek*y_k;
|
||||||
|
Xss = a*ec^(1-b)*(1+(a/(1-a))^(-1/b)*((thetass-beta)/thetass)^((b-1)/b));
|
||||||
|
Psi = (1-alpha)*(ey/en)*Xss^((b-phi1)/(1-b))*a*ec^(-b)*(1-en)^eta;
|
||||||
|
n = log(en);
|
||||||
|
k = log(ek);
|
||||||
|
m = log(em);
|
||||||
|
c = log(ec);
|
||||||
|
y = log(ey);
|
||||||
|
R = log(eR);
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady;
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
var y c k m n R pi z u;
|
||||||
|
varexo e sigma;
|
||||||
|
// sigma stands for phi in the eq 2.37 p.69
|
||||||
|
|
||||||
|
parameters alpha beta delta gamm phi1 eta a b rho phi2 Psi thetass;
|
||||||
|
//phi1 stands for capital phi in eq.2.68 and 2.69
|
||||||
|
//phi2 stands for lowercase phi in eq. 2.66
|
||||||
|
|
||||||
|
alpha = 0.36;
|
||||||
|
beta = 0.989;
|
||||||
|
gamm = 0.5;
|
||||||
|
delta = 0.019;
|
||||||
|
phi1 = 2;
|
||||||
|
phi2 = 0;
|
||||||
|
eta = 1;
|
||||||
|
a = 0.95;
|
||||||
|
b = 2.56;
|
||||||
|
rho = 0.95;
|
||||||
|
Psi = 1.47630583;
|
||||||
|
thetass = 1.0125;
|
||||||
|
|
||||||
|
model(block);
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = (a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*(1-a)*exp(m)^(-b)+beta*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b)/(1+pi(+1));
|
||||||
|
|
||||||
|
Psi*(1-exp(n))^(-eta)/(a*exp(c)^(-b)*(a*exp(c)^(1-b) + (1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))) = (1-alpha)*exp(y)/exp(n);
|
||||||
|
|
||||||
|
(a*exp(c)^(1-b)+(1-a)*exp(m)^(1-b))^((b-phi1)/(1-b))*a*exp(c)^(-b) = beta*exp(R(+1))*(a*exp(c(+1))^(1-b)+(1-a)*exp(m(+1))^(1-b))^((b-phi1)/(1-b))*a*exp(c(+1))^(-b);
|
||||||
|
|
||||||
|
exp(R) = alpha*exp(y)/exp(k(-1)) + 1-delta;
|
||||||
|
|
||||||
|
exp(k) = (1-delta)*exp(k(-1))+exp(y)-exp(c);
|
||||||
|
|
||||||
|
exp(y) = exp(z)*exp(k(-1))^alpha*exp(n)^(1-alpha);
|
||||||
|
|
||||||
|
exp(m) = exp(m(-1))*(u+thetass)/(1+pi);
|
||||||
|
|
||||||
|
z = rho*z(-1) + e;
|
||||||
|
|
||||||
|
u = gamm*u(-1) + phi2*z(-1) + sigma;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var e; stderr 0.007;
|
||||||
|
var sigma;stderr 0.0089;
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady_state_model;
|
||||||
|
// solving in levels
|
||||||
|
// calibrating n = 1/3 and recovering the value of Psi
|
||||||
|
// adapting solution Walsh (2003) p. 84
|
||||||
|
pi = thetass-1;
|
||||||
|
en = 1/3;
|
||||||
|
eR = 1/beta;
|
||||||
|
y_k = (1/alpha)*(1/beta-1+delta);
|
||||||
|
ek = en*y_k^(-1/(1-alpha));
|
||||||
|
ec = ek*(y_k-delta);
|
||||||
|
em = ec*(a/(1-a))^(-1/b)*((thetass-beta)/thetass)^(-1/b);
|
||||||
|
ey = ek*y_k;
|
||||||
|
Xss = a*ec^(1-b)*(1+(a/(1-a))^(-1/b)*((thetass-beta)/thetass)^((b-1)/b));
|
||||||
|
Psi = (1-alpha)*(ey/en)*Xss^((b-phi1)/(1-b))*a*ec^(-b)*(1-en)^eta;
|
||||||
|
n = log(en);
|
||||||
|
k = log(ek);
|
||||||
|
m = log(em);
|
||||||
|
c = log(ec);
|
||||||
|
y = log(ey);
|
||||||
|
R = log(eR);
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady;
|
||||||
|
|
Loading…
Reference in New Issue