<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Blog</title>
  <link href="https://0xC000005.github.io/blog/"/>
  <link rel="self" href="https://0xC000005.github.io/blog/feed.xml"/>
  <id>https://0xC000005.github.io/blog/</id>
  <updated>2026-06-10T00:00:00Z</updated>
  <author><name>Blog</name></author>
  <entry>
    <title>Typesetting test</title>
    <link href="https://0xC000005.github.io/blog/typesetting-test.html"/>
    <id>https://0xC000005.github.io/blog/typesetting-test.html</id>
    <updated>2026-06-10T00:00:00Z</updated>
    <content type="html">&lt;p&gt;Inline math
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;π&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;e^{i\pi} + 1 = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
and display math:&lt;/p&gt;
&lt;p&gt;&lt;math display=&quot;block&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;←&lt;/mo&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;′&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;
V(s) \leftarrow V(s) + \alpha \left[ r + \gamma V(s&amp;#39;) - V(s) \right]
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;Temporal-difference learning converges under standard step-size
conditions &lt;span class=&quot;citation&quot; data-cites=&quot;sutton1988td&quot;&gt;(&lt;a
href=&quot;#ref-sutton1988td&quot; role=&quot;doc-biblioref&quot;&gt;Sutton 1988,
16&lt;/a&gt;)&lt;/span&gt;.&lt;a href=&quot;#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;
role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div id=&quot;refs&quot; class=&quot;references csl-bib-body hanging-indent&quot;
role=&quot;list&quot;&gt;
&lt;div id=&quot;ref-sutton1988td&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Sutton, Richard S. 1988. &lt;span&gt;“Learning to Predict by the Methods of
Temporal Differences.”&lt;/span&gt; &lt;em&gt;Machine Learning&lt;/em&gt; 3 (1): 9–44. &lt;a
href=&quot;https://doi.org/10.1007/BF00115009&quot;&gt;https://doi.org/10.1007/BF00115009&lt;/a&gt;.
&lt;/div&gt;
&lt;/div&gt;
&lt;section id=&quot;footnotes&quot; class=&quot;footnotes footnotes-end-of-document&quot;
role=&quot;doc-endnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;A footnote, for completeness.&lt;a href=&quot;#fnref1&quot;
class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content>
  </entry>
  <entry>
    <title>One American put, four solvers</title>
    <link href="https://0xC000005.github.io/blog/american-put-four-solvers.html"/>
    <id>https://0xC000005.github.io/blog/american-put-four-solvers.html</id>
    <updated>2026-06-10T00:00:00Z</updated>
    <content type="html">&lt;p&gt;Take one unremarkable American put: spot 100, strike 100, one year to
expiry, 5% rates, no dividends, 20% volatility. Price it four ways that
share no code and barely share vocabulary — a binomial tree,
Longstaff–Schwartz Monte Carlo, a Crank–Nicolson finite-difference
solver, and the Dynamic Chebyshev method &lt;span class=&quot;citation&quot;
data-cites=&quot;glau2019dynamic&quot;&gt;(&lt;a href=&quot;#ref-glau2019dynamic&quot;
role=&quot;doc-biblioref&quot;&gt;Glau et al. 2019&lt;/a&gt;)&lt;/span&gt; that the
ChebyshevSharp library ships as a case study. They all print 6.088.&lt;/p&gt;
&lt;p&gt;Two questions made me write this post.&lt;/p&gt;
&lt;p&gt;First, a puzzle of asymmetry: three of those methods handle early
exercise with a trivial pointwise &lt;code&gt;max&lt;/code&gt;. The fourth needs a
nested iterative solver — policy iteration — &lt;em&gt;inside every time
step&lt;/em&gt;, just to apply the same constraint. Why does the same
financial feature cost nothing in three methods and an inner loop in the
fourth? Working through a Waterloo master’s essay on exactly this
machinery &lt;span class=&quot;citation&quot; data-cites=&quot;asare2013&quot;&gt;(&lt;a
href=&quot;#ref-asare2013&quot; role=&quot;doc-biblioref&quot;&gt;Asare 2013&lt;/a&gt;)&lt;/span&gt;
finally made the answer click, and it’s worth writing down.&lt;/p&gt;
&lt;p&gt;Second, a vulnerability I wanted to measure rather than assume:
Dynamic Chebyshev leans on knowing the one-step transition density
&lt;em&gt;exactly&lt;/em&gt; (under Black–Scholes, log-returns are Gaussian, so an
8-point Gauss–Hermite rule nails the continuation integral). Local
volatility takes that away. Does the method break? I built the
experiment, and the answer surprised me twice.&lt;/p&gt;
&lt;h2 id=&quot;one-equation-four-representations&quot;&gt;One equation, four
representations&lt;/h2&gt;
&lt;p&gt;Every method here solves the same backward recursion. At each
exercise opportunity,&lt;/p&gt;
&lt;p&gt;&lt;math display=&quot;block&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;max&lt;/mo&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;exercise&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mspace width=&quot;0.278em&quot;&gt;&lt;/mspace&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;hold&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;V(S) = \max\big(Q(S,\text{exercise}),\; Q(S,\text{hold})\big),&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;where
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;exercise&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;Q(S,\text{exercise})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
is the payoff — known, always, for free — and
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;hold&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;Q(S,\text{hold})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
is the discounted expectation of the next-step value. The methods differ
in exactly one place: &lt;strong&gt;how they represent and compute
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;⋅&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;hold&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;Q(\cdot,\text{hold})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The cleanest way I know to see all four at once: the exact one-step
operator is
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;mi&gt;ℒ&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;e^{\Delta\tau \mathcal{L}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
where
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ℒ&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac displaystyle=&quot;false&quot;&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;msup&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\mathcal{L}V = \tfrac{1}{2}\sigma^2 S^2 V_{SS} + rSV_S - rV&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
is the Black–Scholes generator. Feynman–Kac says applying the discounted
expectation over one step &lt;em&gt;is&lt;/em&gt; applying this operator. Every
method approximates it:&lt;/p&gt;
&lt;table&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33%&quot; /&gt;
&lt;col style=&quot;width: 33%&quot; /&gt;
&lt;col style=&quot;width: 33%&quot; /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Approximation of
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;mi&gt;ℒ&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;e^{\Delta\tau \mathcal{L}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/th&gt;
&lt;th&gt;Character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic Chebyshev&lt;/td&gt;
&lt;td&gt;exact — integrate against the transition density
(Gauss–Hermite)&lt;/td&gt;
&lt;td&gt;explicit, no solve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Longstaff–Schwartz&lt;/td&gt;
&lt;td&gt;statistical — regress sampled future values&lt;/td&gt;
&lt;td&gt;explicit, no solve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicit FD&lt;/td&gt;
&lt;td&gt;&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;I + \Delta\tau L_h&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
— a multiply&lt;/td&gt;
&lt;td&gt;explicit, CFL-limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implicit FD&lt;/td&gt;
&lt;td&gt;&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;msup&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;(I - \Delta\tau L_h)^{-1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
— a &lt;strong&gt;divide&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;a linear solve per step&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That last row is the entire mystery of “implicit” in one cell.
Dividing by a matrix &lt;em&gt;means&lt;/em&gt; solving a linear system. You can see
why anyone would pay for it in the scalar toy problem
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mi&gt;/&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;dV/dt = -\lambda V&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;:
the explicit step multiplies by
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;(1-\lambda\Delta t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
which explodes once
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;/&lt;/mi&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\Delta t &amp;gt; 2/\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;;
the implicit step divides by
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;(1+\lambda\Delta t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
which lies in
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;(0,1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
for &lt;em&gt;any&lt;/em&gt; step size — it inherits the boundedness of the true
factor
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;e^{-\lambda\Delta t}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;.
On a fine spatial grid,
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/msub&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;L_h&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
has huge eigenvalues
(&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;∼&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;msup&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mi&gt;/&lt;/mi&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sim \sigma^2 S^2/\Delta S^2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;),
the explicit ceiling collapses, and implicit stepping is how you stride
instead of inch.&lt;/p&gt;
&lt;h2 id=&quot;the-obstacle-and-where-policy-iteration-actually-comes-from&quot;&gt;The
obstacle, and where policy iteration actually comes from&lt;/h2&gt;
&lt;p&gt;American exercise adds a floor:
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;≥&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;*&lt;/mo&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;V \ge V^*&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
everywhere, where
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;*&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;max&lt;/mo&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;K&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;V^* = \max(K-S, 0)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;.
In continuous time the value solves a &lt;em&gt;linear complementarity
problem&lt;/em&gt; — equivalently an obstacle problem, equivalently the
continuous-time Bellman equation for optimal stopping; three fields, one
object:&lt;/p&gt;
&lt;p&gt;&lt;math display=&quot;block&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;min&lt;/mo&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;ℒ&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mspace width=&quot;0.278em&quot;&gt;&lt;/mspace&gt;&lt;mspace width=&quot;0.278em&quot;&gt;&lt;/mspace&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;*&lt;/mo&gt;&lt;/msup&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mi&gt;.&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\min\big(V_\tau - \mathcal{L}V,\;\; V - V^*\big) = 0.&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;Read it as a greedy max in residual form: at every point, both
“action residuals” are nonnegative and the &lt;em&gt;smaller&lt;/em&gt; one is zero
— either the PDE holds (you’re holding) or you’re pinned to the payoff
(you’re exercising).&lt;/p&gt;
&lt;p&gt;Now watch what happens when each method enforces the floor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;⋅&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;hold&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;Q(\cdot,\text{hold})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
is a known function&lt;/strong&gt; — Chebyshev’s quadrature of the
already-computed next step, Longstaff–Schwartz’s fitted regression &lt;span
class=&quot;citation&quot; data-cites=&quot;longstaff2001&quot;&gt;(&lt;a
href=&quot;#ref-longstaff2001&quot; role=&quot;doc-biblioref&quot;&gt;Longstaff and Schwartz
2001&lt;/a&gt;)&lt;/span&gt;, explicit FD’s matrix-vector product — then the
comparison is between two numbers you already have, at each node
independently. The floor costs one pointwise &lt;code&gt;max&lt;/code&gt;. Done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;⋅&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;hold&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;Q(\cdot,\text{hold})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
is the output of an implicit solve&lt;/strong&gt;, the constraint gets
entangled with the unknowns it constrains. Which rows of the linear
system should read “PDE holds” and which should read “pinned to payoff”
depends on where exercise is optimal — &lt;em&gt;which is determined by the
solution of that very system&lt;/em&gt;. You cannot evaluate the max because
one of its inputs depends on the answer. The standard way to break a
circularity like this is guess–solve–check:&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;&lt;strong&gt;Guess&lt;/strong&gt; the exercise region (a yes/no per node — the
&lt;em&gt;policy&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solve&lt;/strong&gt; the tridiagonal system with exercise rows
pinned and hold rows on the PDE (&lt;em&gt;policy evaluation&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-ask&lt;/strong&gt; at each node whether the other action now
wins; flip the violators (&lt;em&gt;greedy improvement&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Repeat until no node flips. Finite termination: finitely many
regions, monotone improvement.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That loop &lt;em&gt;is&lt;/em&gt; Howard’s policy iteration, the same algorithm
from every reinforcement-learning textbook, run over a spatial grid
inside each time step &lt;span class=&quot;citation&quot;
data-cites=&quot;huang2012combined&quot;&gt;(&lt;a href=&quot;#ref-huang2012combined&quot;
role=&quot;doc-biblioref&quot;&gt;Huang et al. 2012&lt;/a&gt;)&lt;/span&gt;. The dictionary is
exact: grid nodes are states, exercise/hold is the binary action, the
exercise region is the policy, the tridiagonal solve is policy
evaluation, the flip is greedy improvement.&lt;/p&gt;
&lt;p&gt;And here’s the control experiment that pins down the cause: the
&lt;em&gt;European&lt;/em&gt; put under implicit FD has the &lt;strong&gt;identical
coupled system&lt;/strong&gt; — and needs exactly zero iterations, one solve
per step. The coupling never forces iteration. The obstacle on top of
the coupling does. Three methods avoid the loop not because they’re
clever about the obstacle, but because their
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;hold&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;Q(\text{hold})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
comes pre-computed from the known future, so the obstacle never touches
an unknown.&lt;/p&gt;
&lt;h2
id=&quot;direct-control-vs-penalty-and-reproducing-a-2013-thesis-in-c&quot;&gt;Direct
control vs penalty — and reproducing a 2013 thesis in C&lt;/h2&gt;
&lt;p&gt;The Asare essay compares the two principled ways to put the floor
&lt;em&gt;inside&lt;/em&gt; the implicit solve. Both sit on the same
finite-difference discretization (positive-coefficient differencing —
central where it keeps the off-diagonals nonnegative, upwind otherwise —
which guarantees convergence to the viscosity solution; Crank–Nicolson
with two fully-implicit startup steps &lt;span class=&quot;citation&quot;
data-cites=&quot;rannacher1984&quot;&gt;(&lt;a href=&quot;#ref-rannacher1984&quot;
role=&quot;doc-biblioref&quot;&gt;Rannacher 1984&lt;/a&gt;)&lt;/span&gt; to damp the payoff-kink
oscillation):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Direct control&lt;/strong&gt; writes the LCP as a supremum over an
explicit binary control:
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mo&gt;max&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;φ&lt;/mi&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot; form=&quot;prefix&quot;&gt;{&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot; form=&quot;postfix&quot;&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;prefix&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;mspace width=&quot;0.167em&quot;&gt;&lt;/mspace&gt;&lt;mi&gt;φ&lt;/mi&gt;&lt;mspace width=&quot;0.167em&quot;&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;*&lt;/mo&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;φ&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;ℒ&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;postfix&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\max_{\varphi\in\{0,1\}}\big[\Omega\,\varphi\,(V - V^*) - (1-\varphi)(V_\tau - \mathcal{L}V)\big] = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;.
Exercise rows are pinned exactly; the scheme solves the &lt;em&gt;exact&lt;/em&gt;
discrete LCP. The price of exactness is the scaling factor
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\Omega&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
(units 1/time): too small and policy iteration stops converging in
floating point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Penalty&lt;/strong&gt; &lt;span class=&quot;citation&quot;
data-cites=&quot;forsyth2002&quot;&gt;(&lt;a href=&quot;#ref-forsyth2002&quot;
role=&quot;doc-biblioref&quot;&gt;Forsyth and Vetzal 2002&lt;/a&gt;)&lt;/span&gt; replaces the
hard floor with a stiff spring:
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;ℒ&lt;/mi&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac displaystyle=&quot;false&quot;&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;/mfrac&gt;&lt;mo&gt;max&lt;/mo&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;*&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;V_\tau - \mathcal{L}V = \tfrac{1}{\varepsilon}\max(V^* - V, 0)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;.
Solves an &lt;em&gt;approximation&lt;/em&gt; with
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(\varepsilon)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
penalization error, but starts each step closer to the optimum.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I reimplemented the whole scheme in ~370 lines of dependency-free C#
(both handlers behind one enum, Thomas solver, sinh-clustered grid) and
validated it on a ladder where each rung isolates one component:
European mode first (no obstacle — discretization alone lands
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1.2&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;1.2\times10^{-4}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
from the analytic value), then the obstacle (within
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1.7&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;1.7\times10^{-3}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
of QLNet’s independent FD engine), then the handlers against each other
(direct control and penalty agree to
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;9&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;3\times10^{-9}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
— they really do solve the same LCP), then
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\Omega&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;-invariance
(changing
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\Omega&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
by 10× moves the solution by exactly 0.0). Against the essay’s own
published convergence anchor (a quarter-year put at 2% rates), my solver
converges to 3.768257 vs the published 3.76831209 — agreement to
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;5.5&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;5.5\times10^{-5}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
across thirteen years, two languages, and two grids.&lt;/p&gt;
&lt;p&gt;The part that delighted me: the published &lt;em&gt;iteration
mechanics&lt;/em&gt; reproduce exactly. Direct control burns its worst-case
iterations in the very first time step — 18 of them, marching the
candidate boundary node-by-node out from the strike — while penalty’s
better starting guess needs at most 6; after that first step the two run
neck-and-neck (totals 872 vs 887 over 400 steps, about 2.2 per step).
The deeper reason penalty pulls ahead under grid refinement is known
&lt;span class=&quot;citation&quot; data-cites=&quot;reisinger2012&quot;&gt;(&lt;a
href=&quot;#ref-reisinger2012&quot; role=&quot;doc-biblioref&quot;&gt;Reisinger and Witte
2012&lt;/a&gt;)&lt;/span&gt;: direct control is inherently discrete, while the
penalty iteration discretizes a semismooth Newton method on the
&lt;em&gt;continuous&lt;/em&gt; variational inequality, so it has a well-defined
limit as the mesh vanishes.&lt;/p&gt;
&lt;h2 id=&quot;the-experiment-take-away-the-density&quot;&gt;The experiment: take away
the density&lt;/h2&gt;
&lt;p&gt;Everything so far is the map. Here’s the measurement.&lt;/p&gt;
&lt;p&gt;Under Black–Scholes, Dynamic Chebyshev’s per-step continuation
integral is exact because one-step log-returns are Gaussian. Local
volatility —
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sigma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
a function of the spot — destroys that: there is no closed-form one-step
law to integrate against. This is precisely the regime where the PDE
route doesn’t even flinch
(&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sigma(S_i)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
just lands in the matrix coefficients) and where Longstaff–Schwartz
keeps working because it only ever needed simulated paths. The
interesting question is what happens to the integral-form method.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The model.&lt;/strong&gt; A CEV-style surface
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.20&lt;/mn&gt;&lt;mspace width=&quot;0.167em&quot;&gt;&lt;/mspace&gt;&lt;msup&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;/&lt;/mi&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sigma(S) = 0.20\,(S/100)^{\beta-1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
clamped to
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;[&lt;/mo&gt;&lt;mn&gt;0.05&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;0.80&lt;/mn&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;[0.05, 0.80]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
with
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
as the knob:
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
&lt;em&gt;is&lt;/em&gt; geometric Brownian motion (every pricer must reproduce the
constant-vol anchors — a built-in wiring check),
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta = 0.5&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
is a moderate smile,
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
a steep one
(&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sigma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
doubles to 0.40 by
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;S=50&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The truth bundle.&lt;/strong&gt; With no closed form, validation
&lt;em&gt;is&lt;/em&gt; cross-method agreement across independent families. At
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta = 0.5&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
four pricers from three method families agree within about
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;10^{-3}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pricer&lt;/th&gt;
&lt;th&gt;American put value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hand-rolled FD, direct control&lt;/td&gt;
&lt;td&gt;6.063757&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hand-rolled FD, penalty&lt;/td&gt;
&lt;td&gt;6.063757 (Δ
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;9&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;3\times10^{-9}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QLNet local-vol FD engine&lt;/td&gt;
&lt;td&gt;6.062995&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Longstaff–Schwartz, Euler paths (200k×100, ±0.017)&lt;/td&gt;
&lt;td&gt;6.062937&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two validation lessons cost me real debugging time and deserve a
public service announcement. One: &lt;em&gt;the volatility surface grid is
part of the model spec&lt;/em&gt; — QLNet consumes σ sampled on a strike grid
and interpolates, and densifying that grid from 61 to 121 strikes moved
its price by
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2.7&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2.7\times10^{-3}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
which would masquerade as method error if you didn’t know to look. Two:
&lt;em&gt;sign heuristics are worthless under local vol&lt;/em&gt; — I confidently
predicted “more volatility in the in-the-money region makes the put
pricier” and was wrong: the higher ITM vol makes &lt;em&gt;continuation&lt;/em&gt;
more valuable, pushes the exercise boundary down (79.68 vs 80.87 at
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta=1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
read off the FD solver’s policy indicator), and the American came out
slightly &lt;em&gt;cheaper&lt;/em&gt; than flat. Validate by agreement, never by
intuition about signs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The kernel swap.&lt;/strong&gt; To run Dynamic Chebyshev at all
under local vol, I gave it the same one-step approximation the Monte
Carlo uses: freeze σ at the current state over the step,&lt;/p&gt;
&lt;p&gt;&lt;math display=&quot;block&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;′&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac displaystyle=&quot;false&quot;&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;msup&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo minsize=&quot;1.2&quot; maxsize=&quot;1.2&quot; stretchy=&quot;false&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msqrt&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msqrt&gt;&lt;mspace width=&quot;0.167em&quot;&gt;&lt;/mspace&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;msqrt&gt;&lt;mrow&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/msqrt&gt;&lt;mspace width=&quot;0.278em&quot;&gt;&lt;/mspace&gt;&lt;msub&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mspace width=&quot;2.0em&quot;&gt;&lt;/mspace&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;log&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;x&amp;#39; = x + \big(r - q - \tfrac{1}{2}\sigma(x)^2\big)\Delta t + \sqrt{2}\,\sigma(x)\sqrt{\Delta t}\;h_m, \qquad x = \log S,&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;an Euler scheme of weak order one, plugged into the same 8-point
Gauss–Hermite rule. The hypothesis writes itself: this injects an
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(\Delta t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
bias &lt;em&gt;into the kernel&lt;/em&gt;, where no amount of Chebyshev resolution
can reach it. The spectral machinery should converge beautifully — to
the wrong answer. The fingerprint to look for: error &lt;strong&gt;plateaus in
nodes&lt;/strong&gt; at fixed steps, &lt;strong&gt;decays in steps&lt;/strong&gt; at fixed
nodes.&lt;/p&gt;
&lt;h2 id=&quot;what-the-measurement-actually-said&quot;&gt;What the measurement
actually said&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Surprise #1: on the moderate smile, the feared bias is buried
under the method’s own noise floor.&lt;/strong&gt; European leg (no early
exercise — the cleanest read), 80 time steps, sweeping Chebyshev nodes,
each bias measured against a fine FD reference using the &lt;em&gt;identical
analytic σ&lt;/em&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;nodes&lt;/th&gt;
&lt;th&gt;β=1 bias (kernel exact)&lt;/th&gt;
&lt;th&gt;β=0.5 bias (Euler kernel)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;+0.0849&lt;/td&gt;
&lt;td&gt;+0.0305&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;+0.0044&lt;/td&gt;
&lt;td&gt;+0.0045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;161&lt;/td&gt;
&lt;td&gt;−0.00074&lt;/td&gt;
&lt;td&gt;−0.00019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;321&lt;/td&gt;
&lt;td&gt;−0.00086&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−0.00024&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Read the bottom row. With the kernel &lt;em&gt;exact&lt;/em&gt;
(&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta=1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;),
the method converges to an error of
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;8.6&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;-8.6\times10^{-4}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
— that’s its intrinsic floor: Gauss–Hermite truncation, domain clamping,
the terminal payoff kink, and interpolation error compounding across 80
chained steps. With the &lt;em&gt;frozen&lt;/em&gt; kernel
(&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta=0.5&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;),
the converged error is
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;2.4&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;-2.4\times10^{-4}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
— &lt;strong&gt;smaller than the floor&lt;/strong&gt;. The structural bias is real,
but at this smile and step count it’s invisible below the noise the
method already carries.&lt;/p&gt;
&lt;p&gt;The American leg agrees: its error is dominated by the ordinary
Bermudan-vs-continuous gap (−0.034 at 20 exercise dates shrinking to
−0.0019 at 320, the usual
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;Δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(\Delta t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;),
exactly like any discrete-exercise method, kernel be damned. And the
Greeks — the thing the library exists to compute well — came through the
kernel swap essentially untouched: chain-rule Gamma 0.023230 vs the FD
grid’s 0.023225, agreement at
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;5\times10^{-6}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;,
with Delta matching to
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2.3&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2.3\times10^{-4}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surprise #2: the fingerprint is real — you just need a steep
enough smile to see it.&lt;/strong&gt; Same measurement on the
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\beta=0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
surface, where σ varies fast enough that freezing it over a step
actually loses information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plateau in nodes:&lt;/strong&gt; at 80 steps, the bias is +0.00126
at 161 nodes and +0.00130 at 321 nodes. Node-converged, and stuck — the
offset that no spectral resolution removes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decay in steps:&lt;/strong&gt; +0.0071 at 20 steps → +0.0013 at 80
→ +0.0005 at 320.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is precisely the predicted signature: the error lives in the
kernel, not the interpolant. Both predictions of the structural-bias
story are confirmed — and both magnitudes are small enough that the
story is “graceful degradation,” not failure.&lt;/p&gt;
&lt;h2 id=&quot;so-what-does-the-pde-route-actually-buy&quot;&gt;So what does the PDE
route actually buy?&lt;/h2&gt;
&lt;p&gt;Not headline accuracy on this problem — the four-way table above
shows everyone agreeing at the millicent level once each method is given
its due. The honest scorecard:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The FD/LCP route (direct control or penalty) wins
on:&lt;/strong&gt; models with no tractable transition density &lt;em&gt;by
construction&lt;/em&gt; (zero kernel bias at any steepness — its coefficients
just &lt;em&gt;are&lt;/em&gt;
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sigma(S,t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;);
genuinely continuous exercise; provable convergence to the viscosity
solution (which starts to matter when the problem becomes a real
nonlinear HJB — uncertain volatility, controls richer than stop/go,
where the penalty trick doesn’t even apply and policy iteration is the
only game &lt;span class=&quot;citation&quot; data-cites=&quot;huang2012combined&quot;&gt;(&lt;a
href=&quot;#ref-huang2012combined&quot; role=&quot;doc-biblioref&quot;&gt;Huang et al.
2012&lt;/a&gt;)&lt;/span&gt;); and the exercise boundary
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;τ&lt;/mi&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;B(\tau)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
for free, as the interface of the policy indicator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The integral form (Dynamic Chebyshev) wins on:&lt;/strong&gt; the
offline/online split — you build once and then evaluate price &lt;em&gt;and
analytic Greeks&lt;/em&gt; anywhere, instantly, instead of re-solving per
contract; spectral accuracy when the inputs are smooth; and, as measured
here, robustness well outside its comfort zone — an off-the-shelf
weak-order-one kernel kept prices at the method floor for a moderate
smile and preserved Gamma to five decimal places.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Longstaff–Schwartz wins on:&lt;/strong&gt; dimensions, and on never
having asked for a density in the first place.&lt;/p&gt;
&lt;p&gt;The asymmetry from the opening resolves into one sentence: &lt;em&gt;the
integral form computes
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;prefix&quot;&gt;(&lt;/mo&gt;&lt;mtext mathvariant=&quot;normal&quot;&gt;hold&lt;/mtext&gt;&lt;mo stretchy=&quot;true&quot; form=&quot;postfix&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;Q(\text{hold})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
first and decides second; the implicit differential form must decide and
solve simultaneously — and policy iteration is simply what “deciding
while solving” costs.&lt;/em&gt; Once I could see that, the thesis stopped
reading as exotic numerics and started reading as the same Bellman
backup I’d already implemented twice, wearing PDE clothing.&lt;/p&gt;
&lt;h2 id=&quot;reproducibility&quot;&gt;Reproducibility&lt;/h2&gt;
&lt;p&gt;Everything above regenerates from four small console probes (C#/.NET
10), each with PASS/FAIL gates and one command: a QLNet 1.13.1 local-vol
smoke test (its &lt;code&gt;FixedLocalVolSurface&lt;/code&gt; injection path
reproduces the constant-vol engine to
&lt;math display=&quot;inline&quot; xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;9&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;−&lt;/mi&gt;&lt;mn&gt;14&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;9\times10^{-14}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;
on a flat surface), the Euler-path Longstaff–Schwartz cross-check, the
~370-line direct-control/penalty solver with its nine-rung validation
ladder, and the Dynamic Chebyshev kernel measurement, which links
against &lt;a
href=&quot;https://github.com/0xC000005/ChebyshevSharp&quot;&gt;ChebyshevSharp&lt;/a&gt;
itself. Total runtime for every number in this post: well under a
minute.&lt;/p&gt;
&lt;h2 class=&quot;unnumbered&quot; id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;div id=&quot;refs&quot; class=&quot;references csl-bib-body hanging-indent&quot;
role=&quot;list&quot;&gt;
&lt;div id=&quot;ref-asare2013&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Asare, Ama Peprah. 2013. &lt;span&gt;“The Direct Control and Penalty Methods
for &lt;span&gt;American&lt;/span&gt; Put Options.”&lt;/span&gt; MMath essay, University
of Waterloo. &lt;a
href=&quot;https://uwaterloo.ca/computational-mathematics/sites/default/files/uploads/documents/ama_peprah_asare_0.pdf&quot;&gt;https://uwaterloo.ca/computational-mathematics/sites/default/files/uploads/documents/ama_peprah_asare_0.pdf&lt;/a&gt;.
&lt;/div&gt;
&lt;div id=&quot;ref-forsyth2002&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Forsyth, Peter A., and Kenneth R. Vetzal. 2002. &lt;span&gt;“Quadratic
Convergence for Valuing &lt;span&gt;American&lt;/span&gt; Options Using a Penalty
Method.”&lt;/span&gt; &lt;em&gt;SIAM Journal on Scientific Computing&lt;/em&gt; 23 (6):
2095–122. &lt;a
href=&quot;https://doi.org/10.1137/S1064827500382324&quot;&gt;https://doi.org/10.1137/S1064827500382324&lt;/a&gt;.
&lt;/div&gt;
&lt;div id=&quot;ref-glau2019dynamic&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Glau, Kathrin, Mirco Mahlstedt, and Christian Pötz. 2019. &lt;span&gt;“A New
Approach for &lt;span&gt;American&lt;/span&gt; Option Pricing: The Dynamic
&lt;span&gt;Chebyshev&lt;/span&gt; Method.”&lt;/span&gt; &lt;em&gt;SIAM Journal on Scientific
Computing&lt;/em&gt; 41 (1): B153–80. &lt;a
href=&quot;https://doi.org/10.1137/18M1193001&quot;&gt;https://doi.org/10.1137/18M1193001&lt;/a&gt;.
&lt;/div&gt;
&lt;div id=&quot;ref-huang2012combined&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Huang, Y., Peter A. Forsyth, and George Labahn. 2012. &lt;span&gt;“Combined
Fixed Point and Policy Iteration for
&lt;span&gt;Hamilton&lt;/span&gt;-&lt;span&gt;Jacobi&lt;/span&gt;-&lt;span&gt;Bellman&lt;/span&gt; Equations
in Finance.”&lt;/span&gt; &lt;em&gt;SIAM Journal on Numerical Analysis&lt;/em&gt; 50 (4):
1861–82. &lt;a
href=&quot;https://doi.org/10.1137/100812641&quot;&gt;https://doi.org/10.1137/100812641&lt;/a&gt;.
&lt;/div&gt;
&lt;div id=&quot;ref-longstaff2001&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Longstaff, Francis A., and Eduardo S. Schwartz. 2001. &lt;span&gt;“Valuing
&lt;span&gt;American&lt;/span&gt; Options by Simulation: A Simple Least-Squares
Approach.”&lt;/span&gt; &lt;em&gt;The Review of Financial Studies&lt;/em&gt; 14 (1):
113–47. &lt;a
href=&quot;https://doi.org/10.1093/rfs/14.1.113&quot;&gt;https://doi.org/10.1093/rfs/14.1.113&lt;/a&gt;.
&lt;/div&gt;
&lt;div id=&quot;ref-rannacher1984&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Rannacher, Rolf. 1984. &lt;span&gt;“Finite Element Solution of Diffusion
Problems with Irregular Data.”&lt;/span&gt; &lt;em&gt;Numerische Mathematik&lt;/em&gt; 43
(2): 309–27. &lt;a
href=&quot;https://doi.org/10.1007/BF01390130&quot;&gt;https://doi.org/10.1007/BF01390130&lt;/a&gt;.
&lt;/div&gt;
&lt;div id=&quot;ref-reisinger2012&quot; class=&quot;csl-entry&quot; role=&quot;listitem&quot;&gt;
Reisinger, Christoph, and Jan Hendrik Witte. 2012. &lt;span&gt;“On the Use of
Policy Iteration as an Easy Way of Pricing &lt;span&gt;American&lt;/span&gt;
Options.”&lt;/span&gt; &lt;em&gt;SIAM Journal on Financial Mathematics&lt;/em&gt; 3 (1):
459–78. &lt;a
href=&quot;https://doi.org/10.1137/110823328&quot;&gt;https://doi.org/10.1137/110823328&lt;/a&gt;.
&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
</feed>
