Skip to content

Commit 29b5e23

Browse files
jstacHumphreyYangclaude
authored
Fix timing inconsistencies and code bugs (#753)
In cons_smooth.md and tax_smooth.md: - Fix budget constraint computation: missing factor of R in np.linalg.inv(A) @ b (should be @ (R * b)). - Fix plot functions referencing global cs_model/tax_model instead of the model argument, which would silently ignore the model parameter if the function is called with a different model. In cagan_ree.md: - Fix off-by-one timing in μ_seq construction and continuation paths. - Add π_seq_2 boundary adjustment at T1-1 for regime continuity. - Fix swapped Smooth/Jumpy labels in the p-plot (now reads as $m_{T_1}$ to match the m-plot variants). - Add note that γ* = 1 is assumed in solve(). Extracted from #587 (HumphreyYang) onto current main. Co-authored-by: Humphrey Yang <u6474961@anu.edu.au> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 06c00cb commit 29b5e23

3 files changed

Lines changed: 24 additions & 21 deletions

File tree

lectures/cagan_ree.md

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ jupytext:
44
extension: .md
55
format_name: myst
66
format_version: 0.13
7-
jupytext_version: 1.16.1
7+
jupytext_version: 1.17.1
88
kernelspec:
99
display_name: Python 3 (ipykernel)
1010
language: python
@@ -267,6 +267,7 @@ def solve(model, T):
267267
A1 = np.eye(T+1, T+1) - δ * np.eye(T+1, T+1, k=1)
268268
A2 = np.eye(T+1, T+1) - np.eye(T+1, T+1, k=-1)
269269
270+
# Assume γ* = 1
270271
b1 = (1-δ) * μ_seq + np.concatenate([np.zeros(T), [δ * π_end]])
271272
b2 = μ_seq + np.concatenate([[m0], np.zeros(T)])
272273
@@ -326,7 +327,7 @@ T1 = 60
326327
μ_star = 0
327328
T = 80
328329
329-
μ_seq_1 = np.append(μ0*np.ones(T1+1), μ_star*np.ones(T-T1))
330+
μ_seq_1 = np.append(μ0*np.ones(T1), μ_star*np.ones(T-T1+1))
330331
331332
cm = create_cagan_model(μ_seq=μ_seq_1)
332333
@@ -494,32 +495,34 @@ cm1 = create_cagan_model(μ_seq=μ_seq_2_path1)
494495
π_seq_2_path1, m_seq_2_path1, p_seq_2_path1 = solve(cm1, T)
495496
496497
# continuation path
497-
μ_seq_2_cont = μ_star * np.ones(T-T1)
498+
μ_seq_2_cont = μ_star * np.ones(T-T1+1)
498499
499-
cm2 = create_cagan_model(m0=m_seq_2_path1[T1+1],
500+
cm2 = create_cagan_model(m0=m_seq_2_path1[T1],
500501
μ_seq=μ_seq_2_cont)
501-
π_seq_2_cont, m_seq_2_cont1, p_seq_2_cont1 = solve(cm2, T-1-T1)
502+
π_seq_2_cont, m_seq_2_cont1, p_seq_2_cont1 = solve(cm2, T-T1)
502503
503504
504505
# regime 1 - simply glue π_seq, μ_seq
505-
μ_seq_2 = np.concatenate((μ_seq_2_path1[:T1+1],
506+
μ_seq_2 = np.concatenate((μ_seq_2_path1[:T1],
506507
μ_seq_2_cont))
507-
π_seq_2 = np.concatenate((π_seq_2_path1[:T1+1],
508+
π_seq_2 = np.concatenate((π_seq_2_path1[:T1],
508509
π_seq_2_cont))
509-
m_seq_2_regime1 = np.concatenate((m_seq_2_path1[:T1+1],
510+
m_seq_2_regime1 = np.concatenate((m_seq_2_path1[:T1],
510511
m_seq_2_cont1))
511-
p_seq_2_regime1 = np.concatenate((p_seq_2_path1[:T1+1],
512+
p_seq_2_regime1 = np.concatenate((p_seq_2_path1[:T1],
512513
p_seq_2_cont1))
513514
515+
π_seq_2[T1-1] = p_seq_2_regime1[T1] - p_seq_2_regime1[T1-1]
516+
514517
# regime 2 - reset m_T1
515-
m_T1 = (m_seq_2_path1[T1] + μ0) + cm2.α*(μ0 - μ_star)
518+
m_T1 = (m_seq_2_path1[T1-1] + μ0) + cm2.α*(μ0 - μ_star)
516519
517520
cm3 = create_cagan_model(m0=m_T1, μ_seq=μ_seq_2_cont)
518-
π_seq_2_cont2, m_seq_2_cont2, p_seq_2_cont2 = solve(cm3, T-1-T1)
521+
π_seq_2_cont2, m_seq_2_cont2, p_seq_2_cont2 = solve(cm3, T-T1)
519522
520-
m_seq_2_regime2 = np.concatenate((m_seq_2_path1[:T1+1],
523+
m_seq_2_regime2 = np.concatenate((m_seq_2_path1[:T1],
521524
m_seq_2_cont2))
522-
p_seq_2_regime2 = np.concatenate((p_seq_2_path1[:T1+1],
525+
p_seq_2_regime2 = np.concatenate((p_seq_2_path1[:T1],
523526
p_seq_2_cont2))
524527
```
525528
@@ -540,8 +543,8 @@ plot_configs = [
540543
{'data': [(T_seq, m_seq_2_regime1, 'Smooth $m_{T_1}$'),
541544
(T_seq, m_seq_2_regime2, 'Jumpy $m_{T_1}$')],
542545
'ylabel': r'$m$'},
543-
{'data': [(T_seq, p_seq_2_regime1, 'Smooth $p_{T_1}$'),
544-
(T_seq, p_seq_2_regime2, 'Jumpy $p_{T_1}$')],
546+
{'data': [(T_seq, p_seq_2_regime1, 'Jumpy $m_{T_1}$'),
547+
(T_seq, p_seq_2_regime2, 'Smooth $m_{T_1}$')],
545548
'ylabel': r'$p$'}
546549
]
547550

lectures/cons_smooth.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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.1
88
kernelspec:
99
display_name: Python 3 (ipykernel)
1010
language: python
@@ -279,7 +279,7 @@ def compute_optimal(model, a0, y_seq):
279279
b = y_seq - c_seq
280280
b[0] = b[0] + a0
281281
282-
a_seq = np.linalg.inv(A) @ b
282+
a_seq = np.linalg.inv(A) @ (R * b)
283283
a_seq = np.concatenate([[a0], a_seq])
284284
285285
return c_seq, a_seq, h0
@@ -361,7 +361,7 @@ def plot_cs(model, # consumption-smoothing model
361361
c_seq, a_seq, h0 = compute_optimal(model, a0, y_seq)
362362
363363
# Sequence length
364-
T = cs_model.T
364+
T = model.T
365365
366366
fig, axes = plt.subplots(1, 2, figsize=(12,5))
367367

lectures/tax_smooth.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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.1
88
kernelspec:
99
display_name: Python 3 (ipykernel)
1010
language: python
@@ -283,7 +283,7 @@ def compute_optimal(model, B0, G_seq):
283283
A = np.diag(-R*np.ones(S), k=-1) + np.eye(S+1)
284284
b = G_seq - T_seq
285285
b[0] = b[0] + B0
286-
B_seq = np.linalg.inv(A) @ b
286+
B_seq = np.linalg.inv(A) @ (R * b)
287287
B_seq = np.concatenate([[B0], B_seq])
288288
289289
return T_seq, B_seq, h0
@@ -368,7 +368,7 @@ def plot_ts(model, # tax-smoothing model
368368
T_seq, B_seq, h0 = compute_optimal(model, B0, G_seq)
369369
370370
# Sequence length
371-
S = tax_model.S
371+
S = model.S
372372
373373
fig, axes = plt.subplots(1, 2, figsize=(12,5))
374374

0 commit comments

Comments
 (0)