Follow-up to #1040, which replaced the circular observational-equivalence check in lectures/lq_robust_bewley.md with a genuine one (each type's robust LQ problem solved separately, rules compared to the benchmark). The verification itself is sound; reviewing it turned up three small things worth tidying in a later pass. A separate whole-lecture style pass is planned and is deliberately out of scope here.
Line numbers refer to the file as merged from #1040.
1. Thin max_iter margin in solve_rslq near the breakdown point
The risk-sensitive Riccati iteration contracts at rate $\beta\zeta(\sigma)$, which goes to 1 at the breakdown point $\underline\sigma$ (this is the same fact the lecture uses to explain the breakdown point: $\beta\zeta(\underline\sigma) = 1$). The cross-section population grid starts at 0.99 * σ_lo, where $\beta\zeta = 0.99947$, and at that point the solver needs about 42,600 iterations against a max_iter of 50,000 (it fails at 40,000 and passes at 45,000). At 0.999 * σ_lo it needs more than 200,000.
This is deterministic, so CI will not flake, but anyone nudging the grid closer to $\underline\sigma$ gets a RuntimeError from the solver. Options:
- raise
max_iter to something like 500_000 (the whole lecture executes in about 5 seconds, so the cost is negligible), or
- start the population grid at
0.95 * σ_lo, or
- both, plus a one-line comment in
solve_rslq or at the grid definition explaining that convergence slows as $\beta\zeta \to 1$, which turns a hidden constraint into a small piece of pedagogy the lecture already has the language for.
Relevant lines: the solve_rslq definition (about line 328) and σ_pop = np.linspace(0.99 * σ_lo, 0.0, 12) (about line 485).
2. Uniqueness wording left behind after part 2 of the proposition was weakened
#1040 correctly restated part 2 of prop-rbew-types as existence rather than uniqueness ("$R = \beta^{-1}$ is an equilibrium gross interest rate"), and the proof now says so explicitly ("what we have shown is that this rate reproduces itself as an equilibrium for any $\Phi$, not that no other rate could"). Three other places still read as uniqueness:
| Location |
Current text |
| Overview bullet (about line 47) |
"how the equilibrium interest rate $R = \beta^{-1}$ and all aggregate and cross-section dynamics therefore coincide" |
| Concluding remarks (about line 522) |
"The equilibrium interest rate $R = \beta^{-1}$, the aggregate dynamics, and the linear growth ... are all inherited unchanged" |
Solution to rbew_ex2 part 2 (about line 653) |
"The type distribution never enters, so it cannot affect the equilibrium rate." |
These should be brought into line with the proposition so that the hedge in part 2 reads as deliberate. Something like "the benchmark interest rate $R = \beta^{-1}$ still clears the market, whatever the distribution of types" works in all three spots.
3. "first decimal place" understates the falsification result
After the off-locus test (about line 402) the text says "A one percent departure from the locus moves the rule in the first decimal place". The table it describes shows deviations of 0.26, 0.45 and 1.7 (and 0.27, 0.47, 1.0 on the other side), so the most robust type moves in the ones place, not the first decimal. "by an amount of order 0.1 to 1" matches the table as printed.
Verification notes
All three points were checked by executing the merged code locally: the iteration counts in item 1 come from calling the lecture's own solve_rslq with max_iter set to 40,000 / 45,000 / 50,000 at 0.99 * σ_lo, and the deviations in item 3 are the values the lecture prints.
Follow-up to #1040, which replaced the circular observational-equivalence check in
lectures/lq_robust_bewley.mdwith a genuine one (each type's robust LQ problem solved separately, rules compared to the benchmark). The verification itself is sound; reviewing it turned up three small things worth tidying in a later pass. A separate whole-lecture style pass is planned and is deliberately out of scope here.Line numbers refer to the file as merged from #1040.
1. Thin
max_itermargin insolve_rslqnear the breakdown pointThe risk-sensitive Riccati iteration contracts at rate$\beta\zeta(\sigma)$ , which goes to 1 at the breakdown point $\underline\sigma$ (this is the same fact the lecture uses to explain the breakdown point: $\beta\zeta(\underline\sigma) = 1$ ). The cross-section population grid starts at $\beta\zeta = 0.99947$ , and at that point the solver needs about 42,600 iterations against a
0.99 * σ_lo, wheremax_iterof 50,000 (it fails at 40,000 and passes at 45,000). At0.999 * σ_loit needs more than 200,000.This is deterministic, so CI will not flake, but anyone nudging the grid closer to$\underline\sigma$ gets a
RuntimeErrorfrom the solver. Options:max_iterto something like500_000(the whole lecture executes in about 5 seconds, so the cost is negligible), or0.95 * σ_lo, orsolve_rslqor at the grid definition explaining that convergence slows asRelevant lines: the
solve_rslqdefinition (about line 328) andσ_pop = np.linspace(0.99 * σ_lo, 0.0, 12)(about line 485).2. Uniqueness wording left behind after part 2 of the proposition was weakened
#1040 correctly restated part 2 of$\Phi$ , not that no other rate could"). Three other places still read as uniqueness:
prop-rbew-typesas existence rather than uniqueness ("$R = \beta^{-1}$ is an equilibrium gross interest rate"), and the proof now says so explicitly ("what we have shown is that this rate reproduces itself as an equilibrium for anyrbew_ex2part 2 (about line 653)These should be brought into line with the proposition so that the hedge in part 2 reads as deliberate. Something like "the benchmark interest rate$R = \beta^{-1}$ still clears the market, whatever the distribution of types" works in all three spots.
3. "first decimal place" understates the falsification result
After the off-locus test (about line 402) the text says "A one percent departure from the locus moves the rule in the first decimal place". The table it describes shows deviations of 0.26, 0.45 and 1.7 (and 0.27, 0.47, 1.0 on the other side), so the most robust type moves in the ones place, not the first decimal. "by an amount of order 0.1 to 1" matches the table as printed.
Verification notes
All three points were checked by executing the merged code locally: the iteration counts in item 1 come from calling the lecture's own
solve_rslqwithmax_iterset to 40,000 / 45,000 / 50,000 at0.99 * σ_lo, and the deviations in item 3 are the values the lecture prints.