diff --git a/examples/NK_baseline.mod b/examples/NK_baseline.mod index fde80648a7d6d51b3a70841570b819dfacb29ce3..1775508a18c3a9ecb6e299d1252d953dacb8617d 100644 --- a/examples/NK_baseline.mod +++ b/examples/NK_baseline.mod @@ -15,7 +15,14 @@ * equations. Moreover, it makes use of a steady state file to i) set * parameters that depend on other parameters that are potentially estimated * and ii) solve a nonlinear equation using a numerical solver to find the steady - * state of labor. + * state of labor. It provides an example on how the steady state file can be used + * to circumvent some of the limitation of Dynare mod-file by accessing an external + * file that allows calling general Matlab routines. These capacities will mostly be + * interesting for power users. If one just wants to provide analytical steady state + * values and update parameters, the steady_state_model-block allows an easy and convenient + * alternative. It even allows calling numerical solvers like fsolve. For an example, see + * example3.mod + * * The model is written in the beginning of period stock notation. To make the model * conform with Dynare's end of period stock notation, we use the * predetermined_variables-command. diff --git a/examples/NK_baseline_steadystate.m b/examples/NK_baseline_steadystate.m index d1c159f5e5734b6da22ca2a9e6cad72e5476bd7c..1ec7aa0552a25d9f6104f087acc15b6d0905f2f4 100644 --- a/examples/NK_baseline_steadystate.m +++ b/examples/NK_baseline_steadystate.m @@ -1,14 +1,27 @@ -function [ys,check] = NK_baseline_steadystate(ys,exe) -global M_ lgy_ - -if isfield(M_,'param_nbr') == 1 +function [ys,check] = NK_baseline_steadystate(ys,exo) +% function [ys,check] = NK_baseline_steadystate(ys,exo) +% computes the steady state for the NK_baseline.mod and uses a numerical +% solver to do so +% Inputs: +% - ys [vector] vector of initial values for the steady state of +% the endogenous variables +% - exo [vector] vector of values for the exogenous variables +% +% Output: +% - ys [vector] vector of steady state values fpr the the endogenous variables +% - check [scalar] set to 0 if steady state computation worked and to +% 1 of not (allows to impos restriction on parameters) + +global M_ + +% read out parameters to access them with their name NumberOfParameters = M_.param_nbr; -for i = 1:NumberOfParameters - paramname = deblank(M_.param_names(i,:)); - eval([ paramname ' = M_.params(' int2str(i) ');']); +for ii = 1:NumberOfParameters + paramname = deblank(M_.param_names(ii,:)); + eval([ paramname ' = M_.params(' int2str(ii) ');']); end +% initialize indicator check = 0; -end %% Enter model equations here @@ -32,6 +45,11 @@ Lambdax=mu_z; %set the parameter gammma1 gammma1=mu_z*mu_I/betta-(1-delta); +if gammma1<0 % parameter violates restriction; Preventing this cannot be implemented via prior restriction as it is a composite of different parameters and the valid prior region has unknown form + check=1; %set failure indicator + return; %return without updating steady states +end + r=1*gammma1; R=1+(PI*mu_z/betta-1); @@ -49,9 +67,17 @@ vp=(1-thetap)/(1-thetap*PI^((1-chi)*epsilon))*PIstar^(-epsilon); vw=(1-thetaw)/(1-thetaw*PI^((1-chiw)*eta)*mu_z^eta)*PIstarw^(-eta); tempvaromega=alppha/(1-alppha)*w/r*mu_z*mu_I; -ld=fsolve(@(ld)(1-betta*thetaw*mu_z^(eta-1)*PI^(-(1-chiw)*(1-eta)))/(1-betta*thetaw*mu_z^(eta*(1+gammma))*PI^(eta*(1-chiw)*(1+gammma)))... +[ld,fval,exitflag]=fsolve(@(ld)(1-betta*thetaw*mu_z^(eta-1)*PI^(-(1-chiw)*(1-eta)))/(1-betta*thetaw*mu_z^(eta*(1+gammma))*PI^(eta*(1-chiw)*(1+gammma)))... -(eta-1)/eta*wstar/(varpsi*PIstarw^(-eta*gammma)*ld^gammma)*((1-h*mu_z^(-1))^(-1)-betta*h*(mu_z-h)^(-1))*... ((mu_A*mu_z^(-1)*vp^(-1)*tempvaromega^alppha-tempvaromega*(1-(1-delta)*(mu_z*mu_I)^(-1)))*ld-vp^(-1)*Phi)^(-1),0.25,options); +if exitflag <1 + %indicate the SS computation was not sucessful; this would also be detected by Dynare + %setting the indicator here shows how to use this functionality to + %filter out parameter draws + check=1; %set failure indicator + return; %return without updating steady states +end + l=vw*ld; k=tempvaromega*ld; @@ -68,27 +94,12 @@ g2=epsilon/(epsilon-1)*g1; %% end own model equations - -for iter = 1:length(M_.params) +for iter = 1:length(M_.params) %update parameters set in the file eval([ 'M_.params(' num2str(iter) ') = ' M_.param_names(iter,:) ';' ]) end -if isfield(M_,'param_nbr') == 1 - -if isfield(M_,'orig_endo_nbr') == 1 -NumberOfEndogenousVariables = M_.orig_endo_nbr; -else -NumberOfEndogenousVariables = M_.endo_nbr; -end -ys = zeros(NumberOfEndogenousVariables,1); -for i = 1:NumberOfEndogenousVariables - varname = deblank(M_.endo_names(i,:)); - eval(['ys(' int2str(i) ') = ' varname ';']); -end -else -ys=zeros(length(lgy_),1); -for i = 1:length(lgy_) - ys(i) = eval(lgy_(i,:)); -end -check = 0; +NumberOfEndogenousVariables = M_.orig_endo_nbr; %auxiliary variables are set automatically +for ii = 1:NumberOfEndogenousVariables + varname = deblank(M_.endo_names(ii,:)); + eval(['ys(' int2str(ii) ') = ' varname ';']); end