MTC Chapter 8 — Valuation on a Fixed Architecture¶
Part III · Week 7 · Seed 20260801
The gated listing free-boundary problem. Closed form throughout: $\beta=\sqrt3$, free boundary $k^*\approx 94.6$, with smooth pasting onto the action region.
In [1]:
import sys, os
sys.path.insert(0, r"/home/claude/mtc/mtc-course/downloads/engine_lib")
sys.path.insert(0, r"/home/claude/mtc/nbbuild")
from mtcplot import apply_style, MTC_RED, BRASS, SLATE, MTC_RED_LITE, MTC_RED_DARK
import matplotlib.pyplot as plt
import numpy as np
apply_style()
The value function and the free boundary¶
Below $k^*$ the private firm holds an option; at $k^*$ the value pastes smoothly onto the list-now payoff.
In [2]:
from engines import mtc_engine_ch08 as e
vc = e.value_curve(k_min=20, k_max=160, n=200)
fig, ax = plt.subplots()
ax.plot(vc["k"], vc["V_P"], color=MTC_RED, lw=2.4, label="$V_P(k)$ (value function)")
ax.plot(vc["k"], vc["private_perp"], color=SLATE, ls="--", lw=1.4, label="private perpetuity $0.75k$")
ax.plot(vc["k"], vc["list_now"], color=BRASS, ls=":", lw=1.8, label="list now")
ax.axvline(vc["k_star"], color=MTC_RED_DARK, lw=1.4)
ax.text(vc["k_star"]+2, 40, f"$k^* \\approx {vc['k_star']:.1f}$", color=MTC_RED_DARK, fontweight="bold")
ax.set_xlabel("capital state $k$"); ax.set_ylabel("value")
ax.set_title(f"Gated listing: beta = {vc['beta']:.3f}, smooth pasting at $k^*$")
ax.legend()
plt.tight_layout(); plt.show()
print("beta =", vc["beta"], " k* =", vc["k_star"])
beta = 1.732050807568877 k* = 94.64101615137757
Gate pressure¶
A gate above $k^*$ binds; the smooth-pasting defect is positive.
In [3]:
thetas = np.linspace(50, 160, 100)
gp = [e.gate_pressure(t) for t in thetas]
fig, ax = plt.subplots()
ax.plot(thetas, gp, color=MTC_RED, lw=2.2)
ax.axvline(e.free_boundary(), color=BRASS, ls="--"); ax.text(e.free_boundary()+2, max(gp)*0.5, "$k^*$", color=BRASS, fontweight="bold")
ax.set_xlabel("gate threshold $\\theta$"); ax.set_ylabel("gate pressure")
ax.set_title("Gate pressure: zero when slack, positive when binding")
plt.tight_layout(); plt.show()
Validation¶
Every number above is reproduced by the seeded engine; the checks below must all pass.
In [4]:
from engines import mtc_engine_ch08 as _e
v = _e.validation_checks(); v.pop("_values", None)
for k, val in v.items():
print(f" {k}: {val}")
assert v["ALL_PASS"], "validation failed"
print("\nALL_PASS — matches notebook + workbook + API")
V1_beta_sqrt3: True V2_beta_approx_1p732: True V3_k_star_94p6: True V4_k_star_exact_form: True V5_gain_zero_at_40: True V6_slack_gate_zero_pressure: True V7_binding_gate_positive_pressure: True V8_smooth_paste_continuity: True ALL_PASS: True ALL_PASS — matches notebook + workbook + API