Lee la teoría y luego intenta codificar. Pero tienes suerte, porque yo estaba ansioso por desarrollar e implementar el algoritmo de disparo hacia adelante a mí mismo y por lo tanto proporcionarla.
Crecimiento óptimo
(Véase Ben Moll para más detalles).
Modelo de crecimiento óptimo en tiempo continuo lee \begin{align} &\max_c\int^\infty_0 e^{-\rho t}u(c)dt\\ \text{s.t.}~~~& \dot k = f(k) - \delta k - c\\ &c\in[0,f(k)]\\ &k(0) = k_0 \end{align} donde \begin{align} f(k)&=Ak^\alpha\\ u(c)&=\frac{c^{1-\sigma}}{1-\sigma}. \end{align} A partir de las condiciones de primer orden derivamos un sistema de ecuaciones diferenciales \begin{align} \dot k &= f(k) - \delta k - c\\ \dot c &= \frac{c}{\sigma}(f'(k) - \delta - \rho) \end{align}
Puntos fijos dados en \begin{align} \dot k &= 0 \quad \Longrightarrow\quad \tilde k = \left(\frac{\alpha A}{\delta+\rho}\right)^\frac{1}{1-\alpha}\\[2mm] \dot c &= 0 \quad \Longrightarrow\quad \tilde c = f(\tilde k) -\delta \tilde k \end{align}
Dado que el sistema es estable en el punto de silla de montar, sólo hay una trayectoria que converge al estado estacionario único. Las existencias iniciales están dadas y, por tanto, son óptimas $k^*(0) = k_0$ . Nuestro objetivo es resolver $c^*(0)$ .
La idea de disparar es adivinar $c(0)$ y luego iterar en el tiempo. Si las trayectorias temporales conducen al estado estacionario hemos terminado, de lo contrario tenemos que intentar una conjetura diferente. En primer lugar tenemos que discretizar las ecuaciones diferenciales. (El ordenador trabaja con pasos discretos. Sin embargo, si te gusta trabajar con las ecuaciones diferenciales, prueba el solucionador de valores límite de Matlab. bvp4c()
. Esto resulta bastante fácil. Como no tenemos ni idea de lo que hace el solucionador, nos gustaría resolver las ecuaciones "manualmente"). La diferencia directa de alguna función $\dot x$ se define como \begin{align} \dot x(t) :\approx \frac{x(t+1)-x(t)}{\Delta t} \end{align}
que da \begin{align} k(t+1) &= \Delta t(f(k(t)) - \delta k(t) - c(t)) + k(t)\\[2mm] c(t+1) &= \Delta t\frac{c(t)}{\sigma}(f'(k(t)) - \delta - \rho) + c(t). \end{align}
Dado que la probabilidad de acertar $c^*(0)$ tiende a cero, necesitamos aplicar un algoritmo que converja hacia el valor verdadero.
Disparos
El siguiente fragmento de código está escrito en Matlab y presenta la idea principal.
c_lo = 0;
c_hi = A*k(1)^a;
i = 0;
dist_k = tol + 1;
dist_c = tol + 1;
while (i < I) & (dist_k > tol | dist_c > tol);
c(1) = (c_lo + c_hi)/2;
for t = 1:T-1;
k(t+1) = del_t*(A*k(t)^a - d*k(t) - c(t)) + k(t);
c(t+1) = del_t*c(t)/s*(a*A*k(t)^(a-1) - p - d) + c(t);
if c(t+1) > A*k(t+1)^a
c(t+1) = A*k(t+1)^a;
elseif c(t+1) < 0
c(t+1) = 0;
end
end
if k(T) > k_ss & c(T) < c_ss
c_lo = c(1);
elseif k(T) < k_ss & c(T) < c_ss
c_hi = c(1);
elseif k(T) < k_ss & c(T) > c_ss
c_hi = c(1);
end
dist_k = abs(k(T) - k(T-1));
dist_c = abs(c(T) - c(T-1));
i = i + 1;
end
- Por falta de tiempo no puedo dar una explicación detallada. Espero que se explique por sí sola. Puede que responda a preguntas concretas que demuestren cierto esfuerzo.
Problema del valor límite
Como he mencionado anteriormente podemos resolver fácilmente el sistema aplicando el solucionador de problemas de valores límite de Matlab bvp4c
. Utilización de $\tilde c = c(T)$ como condición terminal tenemos dos EDOs y dos condiciones de contorno.
% differential equations with y(1) = k, y(2) = c
dy = @(t,y) [A*y(1)^a - d*y(1) - y(2); ... % dk/dt;
y(2)/s*(a*y(1)^(a-1) - p - d)]; % dc/dt
% boundary conditions
bc = @(y0,yT) [y0(1) - k0; % initial condition
yT(2) - c_ss]; % terminal condition
solinit = bvpinit(linspace(0,T,10), [k0 c0]); % initital guess
sol = bvp4c(dy, bc, solinit); % call solver
t = linspace(0,T)'; % time axis
y = deval(sol,t)'; % call solution values
k = y(:,1); % transform variables
c = y(:,2); % transform variables