The steady_state_model block¶
The steady_state_model; block gives an analytical steady state for
the model — one assignment per endogenous variable, expressing it as a
function of the parameters and the exogenous values:
steady_state_model;
A = 1 + e/theta;
K = (alpha*A/(rho+delta))^(1/(1-alpha));
Y = A * K^alpha;
C = Y - delta*K;
end;
The left-hand side of each assignment must be the name of a declared endogenous variable (state, jump, or algebraic). The right-hand side may reference parameters, exogenous variables, and any endogenous variable already assigned above it in the block.
The block must cover every endogenous variable; a missing assignment
raises an IR error. An initial_guess block (see Initial conditions: initval and initial_guess)
may be added as a Newton seed when the steady state has multiple
solutions, but it does not replace the analytical block.
Numerical fallback¶
When no steady_state_model block is present, the steady state is
computed numerically (Newton on the residual with all time derivatives
set to zero). For most non-trivial models the analytical block is both
faster and more robust, and is what the shipped examples use.
How the steady state is used¶
The computed steady state serves three purposes:
As the terminal anchor of every jump variable in each segment: the solver enforces
jump(t_end) = SS(jump)so that the continuous-time saddle path is selected.As the initial guess for Newton (tiled across the grid).
As the value of the
steady_state(var)callable insideinitval(see Initial conditions: initval and initial_guess).
The steady state used at each of those places is computed at the
exogenous values active for that segment / time, except where overridden
explicitly with e={…} (see Initial conditions: initval and initial_guess).