GitHub

@@ -4,7 +4,7 @@ jupytext:

44

extension: .md

55

format_name: myst

66

format_version: 0.13

7-

jupytext_version: 1.16.4

7+

jupytext_version: 1.17.2

88

kernelspec:

99

display_name: Python 3 (ipykernel)

1010

language: python

@@ -62,6 +62,13 @@ The lecture uses important ideas including

6262

long but finite-horizon economies.

6363

- A **stable manifold** and a **phase plane**

646465+

In addition to what's in Anaconda, this lecture will need the following libraries:

66+67+

```{code-cell} ipython

68+

:tags: [hide-output]

69+

!pip install quantecon

70+

```

71+6572

Let's start with some standard imports:

66736774

```{code-cell} ipython3

@@ -614,7 +621,7 @@ tolerance bounds), we stop.

614621

def bisection(pp, c0, k0, T=10, tol=1e-4, max_iter=500, k_ter=0, verbose=True):

615622616623

# initial boundaries for guess c0

617-

c0_upper = pp.f(k0)

624+

c0_upper = pp.f(k0) + (1 - pp.δ) * k0

618625

c0_lower = 0

619626620627

i = 0

@@ -648,7 +655,7 @@ def plot_paths(pp, c0, k0, T_arr, k_ter=0, k_ss=None, axs=None):

648655649656

if axs is None:

650657

fix, axs = plt.subplots(1, 3, figsize=(16, 4))

651-

ylabels = ['$c_t$', '$k_t$', '$\mu_t$']

658+

ylabels = ['$c_t$', '$k_t$', r'$\mu_t$']

652659

titles = ['Consumption', 'Capital', 'Lagrange Multiplier']

653660654661

c_paths = []

@@ -801,6 +808,76 @@ A rule of thumb for the planner is

801808

The planner accomplishes this by adjusting the saving rate $\frac{f(K_t) - C_t}{f(K_t)}$

802809

over time.

803810811+

```{exercise}

812+

:label: ck1_ex1

813+814+

The turnpike property is independent of the initial condition

815+

$K_0$ provided that $T$ is sufficiently large.

816+817+

Expand the `plot_paths` function so that it plots trajectories for multiple initial points using `k0s = [k_ss*2, k_ss*3, k_ss/3]`.

818+

```

819+820+

```{solution-start} ck1_ex1

821+

:class: dropdown

822+

```

823+824+

Here is one solution

825+826+

```{code-cell} ipython3

827+

def plot_multiple_paths(pp, c0, k0s, T_arr, k_ter=0, k_ss=None, axs=None):

828+

if axs is None:

829+

fig, axs = plt.subplots(1, 3, figsize=(16, 4))

830+831+

ylabels = ['$c_t$', '$k_t$', r'$\mu_t$']

832+

titles = ['Consumption', 'Capital', 'Lagrange Multiplier']

833+834+

colors = plt.cm.viridis(np.linspace(0, 1, len(k0s)))

835+836+

all_c_paths = []

837+

all_k_paths = []

838+839+

for i, k0 in enumerate(k0s):

840+

k0_c_paths = []

841+

k0_k_paths = []

842+843+

for T in T_arr:

844+

c_vec, k_vec = bisection(pp, c0, k0, T, k_ter=k_ter, verbose=False)

845+

k0_c_paths.append(c_vec)

846+

k0_k_paths.append(k_vec)

847+848+

μ_vec = pp.u_prime(c_vec)

849+

paths = [c_vec, k_vec, μ_vec]

850+851+

for j in range(3):

852+

axs[j].plot(paths[j], color=colors[i],

853+

label=f'$k_0 = {k0:.2f}$' if j == 0 and T == T_arr[0] else "", alpha=0.7)

854+

axs[j].set(xlabel='t', ylabel=ylabels[j], title=titles[j])

855+856+

if k_ss is not None and i == 0 and T == T_arr[0]:

857+

axs[1].axhline(k_ss, c='k', ls='--', lw=1)

858+859+

axs[1].axvline(T+1, c='k', ls='--', lw=1)

860+

axs[1].scatter(T+1, paths[1][-1], s=80, color=colors[i])

861+862+

all_c_paths.append(k0_c_paths)

863+

all_k_paths.append(k0_k_paths)

864+865+

# Add legend if multiple initial points

866+

if len(k0s) > 1:

867+

axs[0].legend()

868+869+

return all_c_paths, all_k_paths

870+

```

871+872+

```{code-cell} ipython3

873+

_ = plot_multiple_paths(pp, 0.3, [k_ss*2, k_ss*3, k_ss/3], [250, 150, 75, 50], k_ss=k_ss)

874+

```

875+876+

We see that the turnpike property holds for various initial values of $K_0$.

877+878+

```{solution-end}

879+

```

880+804881

Let's calculate and plot the saving rate.

805882806883

```{code-cell} ipython3

@@ -1075,15 +1152,15 @@ studied in {doc}`Cass-Koopmans Competitive Equilibrium <cass_koopmans_2>` is a f

10751152

### Exercise

1076115310771154

```{exercise}

1078-

:label: ck1_ex1

1155+

:label: ck1_ex2

1079115610801157

- Plot the optimal consumption, capital, and saving paths when the

10811158

initial capital level begins at 1.5 times the steady state level

10821159

as we shoot towards the steady state at $T=130$.

10831160

- Why does the saving rate respond as it does?

10841161

```

108511621086-

```{solution-start} ck1_ex1

1163+

```{solution-start} ck1_ex2

10871164

:class: dropdown

10881165

```

10891166

Read the original on github.com ↗