M3.1 水流加亂流:SDE 是加了噪聲的 ODE
同一條河,多了亂流
回到 M2.0 的那條河,但這次看得更仔細。水面有一個穩定的主流,每秒把東西往下游帶 0.5 公尺;水面也有亂流——無數細小的渦旋,每一瞬間隨機地把葉子往左或往右推一點,推的方向與前一瞬間無關。
你在橋下放一片葉子。一分鐘後它在哪?
主流會把葉子帶往下游,隨機擾動卻讓相同起點的葉子走出不同的路。要怎麼把這兩種移動放進同一條規則? 上一篇的 random walk 已經給了噪聲的尺度:時間 內的增量是 大小;主流的位移則是 大小。
課堂提問Q1
翻成數學。「主流」與「亂流」各是什麼物件?「一分鐘後的位置」是什麼——一個數、還是一個分佈?把 ODE 改成含亂流的版本,該怎麼寫?
先想一想,再展開看整理後的答案
課堂上通常先寫 ,然後卡在「噪聲怎麼寫」。上一篇已經告訴我們答案:Brownian motion 沒有速度(),所以不能寫成 的形式,只能寫增量。
先把 ODE 改寫成增量:在一小段時間 內,。亂流在這段時間內的推力是 Brownian motion 的增量 ,乘上一個強度 。合起來:
把 的這個關係記成
這叫 SDE(stochastic differential equation)。 是 drift, 是 diffusion coefficient。它的解是一個隨時間變動的 random process;每次給定 Brownian noise 的 realization,就得到一條 random trajectory。 則是其中一個時刻的隨機變數,它的 distribution 不是整條 process 本身。
一條路變成一把扇子
對固定主流 、固定強度 ,一百條路會像扇子散開:中心是 ,標準差是 。這個特例很適合先理解兩項的角色,但一般 drift 會影響散開程度;例如往中央拉回的 drift,可以讓 variance 不再持續增加。
一般情況不能把解直接拆成「ODE 解加 Brownian motion」。因為隨機偏移後,葉子讀到的 drift 也會改變;,通常不等於 。
圖:固定 drift 與固定 diffusion 的特例,中心平移、標準差按 增加。
讀法、模擬、以及為什麼是
先用一小步理解。 假設係數滿足適當的存在、唯一與收斂條件,SDE 在小步長下可以近似為
這是 Euler–Maruyama approximation,不是有限步的精確等式。嚴格的 Itô SDE 由積分定義: [1, 3]。本篇先用增量理解這個式子,收斂的條件留到本單元最後。
Euler–Maruyama 法。 把讀法直接寫成迴圈:
它是 M2.3 的 Euler 法加一項噪聲; 時就退回 Euler。
為什麼是 。 三行檢查。走到 需要 步,噪聲項的總和是 ,independent Gaussian 相加、variance 相加(M1.0):
與 無關——把步長切細,亂流的總效果不變,這是模擬應有的性質。若寫成 ,總 variance 是 ,步長越細亂流越小,模擬結果會隨你選的 改變——這不是一個合法的模型。
一個能對答案的例子。 (等速主流)、 常數:把讀法從 加到 ,,後面那個和是 ,所以
、、:均值 30 公尺、標準差 公尺。這就是「晃一點」的大小。
展開細節這門課不用 Itô 積分,代價是什麼
上面的讀法有一個隱藏的選擇:噪聲強度 g 在每一步用的是步「起點」的值。當 g 只依賴 t,起點、中點或終點的 g 在 h → 0 時沒有差別。當 g 依賴 x(例如亂流在河中央比岸邊強),差別就出現了:用起點的 g(xₙ) 對應 Itô 的定義,用中點對應 Stratonovich 的定義,兩者的極限是不同的過程,差一個 ½ g ∂ₓg 的 drift。這門課只處理 g = g(t) 的情形,所以不需要區分;遇到 g(x) 時要另外學 Itô 引理 [1, 3]。另一個代價是我們沒有證明「h → 0 時分佈收斂」——這是本 class 最後一篇(M3.4)與 [4] 的內容。
直覺的骨架對了,數字補上了
起點問題的答案:一分鐘後葉子在下游約 30 公尺處,左右偏差的標準差約 2.3 公尺——95% 的葉子落在 公尺內。直覺的「晃一點」沒錯,但它說不出 2.3 這個數字從哪來:來自 ,也就是 M3.0 的 規律。
這個判斷依賴的假設:亂流的推力是 Brownian 增量——每一瞬間 independent、Gaussian、variance 與時間成正比。以及 不依賴位置。真實的河兩者都不完全成立:渦旋有大小,推力在一個渦旋的時間尺度內是相關的(那會像上一篇的 ,把有效的 放大);河中央的亂流比岸邊強( 依賴 ,進入展開框裡說的 Itô 領域)。理論告訴你這兩件事會往哪個方向偏;偏多少,要靠實作。
模擬一次,再用錯誤的尺度模擬一次
import numpy as np
rng = np.random.default_rng(0)
def em(f, g, x0, T, h, trials=20000, noise_scale='sqrt'):
x = np.full(trials, x0); N = int(round(T/h))
for n in range(N):
eps = rng.standard_normal(trials)
step = np.sqrt(h) if noise_scale == 'sqrt' else h # 正確 vs 錯誤的尺度
x = x + h*f(x) + g*step*eps
return x
for h in [1.0, 0.1, 0.01]:
ok = em(lambda x: 0.5, 0.3, 0.0, 60.0, h)
bad = em(lambda x: 0.5, 0.3, 0.0, 60.0, h, noise_scale='h')
print(h, round(ok.mean(),2), round(ok.std(),2), '| h-scaled std:', round(bad.std(),3))
# 均值 30.0、標準差 2.32,與 h 無關;用 h 當尺度時標準差 2.3 → 0.73 → 0.23,隨 h 消失
用 的結果與本例的 Gaussian 理論相符;改用 ,累積變異數則隨步長縮小而消失。若改成 stationary AR(1) 擾動、固定 ,離散增量就不是 independent Brownian increments。在適當極限下,它仍可能得到 Brownian 模型,但有效變異數會多出 的因子,不能原封不動沿用原來的 ;若相關時間本身也隨 h 改變,更需重新分析。
檢查理解
參考文獻
- Särkkä, S., Solin, A. Applied Stochastic Differential Equations. Cambridge University Press, 2019.(第 2–4 章:SDE 的直覺讀法、Itô 與 Stratonovich 的差別、Euler–Maruyama。)
- Higham, D. J. An Algorithmic Introduction to Numerical Simulation of Stochastic Differential Equations. SIAM Review 43(3), 2001.(用十幾行 MATLAB 建立 Brownian motion 與 Euler–Maruyama 的教學經典。)
- Øksendal, B. Stochastic Differential Equations: An Introduction with Applications. Springer, 6th ed., 2003.(第 3–5 章:Itô 積分與 SDE 的嚴格定義——本課程刻意略過的部分。)
- Kloeden, P. E., Platen, E. Numerical Solution of Stochastic Differential Equations. Springer, 1992.(第 9–10 章:Euler–Maruyama 的收斂性。)