1908 年六行神探:Langevin 方程閃電破案#
Einstein 用了十幾頁推導擴散,Langevin 只用了六行。1908 年春天,法國物理學家 Paul Langevin 在課堂上即興寫下一條牛頓方程,加了一個看不見的噪聲,全場譁然。這是歷史上第一條隨機微分方程。
| 欄位 | 內容 |
|---|---|
| 發生時間 | 1908 年,論文 Sur la théorie du mouvement brownien 僅六頁,核心推導只六行 |
| 地點 | 巴黎法蘭西學院,Langevin 講授布朗運動的課堂與 Comptes Rendus 期刊 |
| 報案人 | Paul Langevin(1872–1946),Curie 的學生,社會主義者,物理教學名家 |
| 偵探 | Langevin 本人;後續 Ornstein 與 Uhlenbeck(1930)補上速度相關完整解 |
| 兇器 | 阻尼加噪聲 \(m \\dot v = -\\gamma v + \\xi\) ,白噪聲 \(\\xi\) 均值零,強度由溫度鎖定 |
| 結論 | 六行還原 Einstein 均方位移,OU 過程雛形誕生,漲落–耗散的另一條大道打通 |
案發現場#
1908 年的巴黎物理學界,Einstein 的擴散理論已經發表三年,但許多人覺得它太統計、太迂迴。
Einstein 的路線是:先猜位移分佈,再展成擴散方程,再解高斯,再算均方位移。邏輯無懈可擊,物理圖像卻隔了一層:粒子到底每一秒受到什麼力。
Langevin 想把牛頓請回現場。他的直覺是:布朗粒子每一瞬間都受兩種力。一是黏滯阻力,與速度反向,正比於 \(\\gamma v\) 。二是水分子的瘋狂撞擊,時正時負,平均為零,記為 \(\\xi(t)\) 。
案發現場於是有了一條看似胡鬧的牛頓方程。胡鬧之處在於, \(\\xi(t)\) 每一刻都是隨機的,方程的解不再是一條軌跡,而是一束軌跡。牛頓的決定論在此分叉了。
但 Langevin 說,決定論分叉,平均值不分叉。只要對噪聲取平均,軌跡束的統計量依然服從乾淨的微分方程。這一念之轉,就是隨機微分方程的誕生。
偵查過程#
Langevin 的六行推導是科學史上最短的破案之一。本節完整重現,並補上現代符號的註解。
六行推導#
設粒子質量為 \(m\) ,速度為 \(v\) ,位置為 \(x\) 。方程為
其中 \(\\xi(t)\) 為白噪聲,滿足 \(E[\\xi] = 0\) 且與位置無關。這是 OU 過程的速度版雛形。
推導開始。方程兩邊同乘 \(x\) ,再取系綜平均。利用 \(x \\dot v = d(xv)/dt - v^2\) ,可得
Langevin 論證交叉項 \(E[x \\xi] = 0\) ,因為撞擊方向與當前位置無關,正負抵消。又由能量均分, \(m E[v^2] = kT\) ,其中 \(k\) 為波茲曼常數, \(T\) 為溫度。
於是 \(y = E[xv]\) 滿足一階線性方程
解得 \(y(t)\) 指數趨向 \(kT / \\gamma\) 。注意到 \(y = E[xv] = (1/2) dE[x^2]/dt\) ,積分一次即得長期行為
與 Einstein 的 \(E[x^2] = 2 D t\) 對照,立刻讀出 \(D = kT / \\gamma\) 。若代入 Stokes 阻力 \(\\gamma = 6 \\pi \\eta a\) ,則與 Stokes–Einstein 關係完全一致。六行,收網。
| 步驟 | 操作 | 物理意義 |
|---|---|---|
| 第一步 | 寫下 \(m \\dot v = -\\gamma v + \\xi\) | 牛頓方程加噪聲,阻尼與漲落並列 |
| 第二步 | 同乘 \(x\) 再取平均 | 從隨機軌跡轉向統計矩,消滅噪聲細節 |
| 第三步 | 用 \(E[x \\xi] = 0\) 化簡 | 撞擊與位置不相關,正負抵消 |
| 第四步 | 代入均分 \(m E[v^2] = kT\) | 熱平衡鎖定動能,溫度入場 |
| 第五步 | 解 \(y = E[xv]\) 的弛豫方程 | 短期指數過渡,長期趨於常數 |
| 第六步 | 積分得 \(E[x^2] \\approx 2 D t\) | 還原 Einstein 預言,讀出 \(D\) |
OU 過程的雛形#
Langevin 只算了位置的均方位移,沒有解出速度的完整相關函數。1930 年 Ornstein 與 Uhlenbeck 補上了這一塊。
速度方程的解為指數加權的噪聲積分,速度自相關呈指數衰減
特徵時間為 \(m / \\gamma\) ,即布朗粒子的動量記憶時間。遠大於此時間看位置,得到擴散。遠小於此時間看速度,看到彈道。這一座橋,連接了牛頓與 Einstein。
今日所謂 Ornstein–Uhlenbeck 過程,正是速度版 Langevin 方程的數學化身,也是利率 Vasicek 模型、神經元漏電積分模型的共同祖先。
結案報告#
Langevin 方程的歷史判決有三條。
第一,它證明 Einstein 是對的,而且是從另一條路證明的。擴散路線走系綜分佈,Langevin 路線走單粒子受力,兩者在 \(D = kT / \\gamma\) 會合。兩條獨立口供指向同一兇手,案子就鐵了。
第二,它發明了隨機微分方程的寫法。把確定性漂移 \(-\\gamma v\) 與隨機驅動 \(\\xi\) 並列,後來成了所有 SDE 的模板:漂移項加擴散項, \(dx = a dt + b dW\) 。Itô 積分就是要讓這個寫法嚴格化。
第三,它埋下了漲落–耗散定理。阻尼 \(\\gamma\) 越大,運動越遲鈍,但噪聲也必須越強,否則能量均分被破壞。耗散與漲落被溫度 \(T\) 鎖死,這個思想在 1950 年代開花為 Callen–Welton 定理,在金融裡開花為風險與波動的對偶。
Langevin 本人沒有追成嚴格化。他是物理學家,覺得平均操作天經地義。數學家看了直搖頭: \(\\xi(t)\) 到底是什麼函數。這個問題留給 Wiener 與 Itô,留給 1923 年與 1942 年的後續檔案。
探案格言:最短的路往往最難找。Einstein 繞了遠路,Langevin 走了捷徑,但捷徑需要更大的勇氣,因為它假裝噪聲可以直接寫進牛頓方程。
證據與工具#
| 證物 | 數學形式 | 偵查意義 |
|---|---|---|
| Langevin 方程 | \(m \\dot v = -\\gamma v + \\xi\) | 第一條 SDE,阻尼加白噪聲 |
| 交叉項消失 | \(E[x \\xi] = 0\) | 位置與瞬時撞擊不相關,推導鑰匙 |
| 能量均分 | \(m E[v^2] = kT\) | 熱平衡約束,引入溫度 |
| 均方位移 | \(E[x^2] \\approx 2 D t\) | 長期擴散,與 Einstein 會合 |
| 速度相關 | \(E[v(t)v(s)] \\propto \\exp(-\\gamma \\lvert t-s \\rvert / m)\) | OU 雛形,動量記憶時間 \(m / \\gamma\) |
| Stokes 對應 | \(\\gamma = 6 \\pi \\eta a\) | 還原 \(D = kT / 6 \\pi \\eta a\) |
辦案備註:數值實驗可用 Euler–Maruyama 離散 Langevin 方程,統計平穩速度變異數應為 \(kT / m\) ,位置均方位移斜率應為 \(2 D\) 。對應程式見 _code 目錄中 1908 年 Langevin OU 程式,內含指數相關與 \(\\sigma^2 / 2 \\theta\) 平穩變異數驗證。
補充:程式實作#
對應程式#
理論呼應#
本文起點為 Langevin 方程 \(m \\dot v = -\\gamma v + \\xi\) ,阻尼與白噪聲並列。 長期位置均方位移滿足 \(E[x^2] \\approx 2 D t\) ,與 Einstein 預言會合於 \(D = kT / \\gamma\) 。 速度自相關呈指數衰減,記憶時間為 \(m / \\gamma\) ,平穩速度變異數為 \(kT / m\) 。 程式以精確離散驗證平穩變異數為 \(\\sigma^2 / 2 \\theta\) ,正是漲落與耗散被溫度鎖死的體現。
執行方式#
python3 _code/1908-langevin_ou.py
實測輸出#
OU theta=1.5 sigma=0.8 dt=0.01 N=300000 burn=20000
target_var=0.213333 sample_var=0.204652 rel_err=0.040692 (tol 0.05)
sample_mean=0.009298 (tol |mean|<0.03)
VERIFY 1908-langevin_ou PASS var=0.2047 target=0.2133 mean=0.00930
讀者實驗#
試將 \(\\sigma\) 由 \(0.8\) 改為 \(1.0\) ,觀察平穩變異數是否約按平方比放大。
完整程式如下:
# 對應 wiki:1908 年 Langevin 方程 / Ornstein-Uhlenbeck 過程(漲落-耗散)
# 說明:OU dX = -theta*X*dt + sigma*dW,theta=1.5, sigma=0.8;
# 採精確離散 X_{n+1} = e^{-theta dt} X_n + sqrt(sigma^2/(2theta)(1-e^{-2theta dt})) Z;
# 平穩變異數 sigma^2/(2theta),均值 0。驗證變異數誤差 < 5% 且均值 ~= 0。
# 僅用 numpy,固定種子,不畫圖只印數字。
import numpy as np
SEED = 1908
THETA = 1.5
SIGMA = 0.8
DT = 0.01
N = 300_000
BURN = 20_000
rng = np.random.default_rng(SEED)
a = float(np.exp(-THETA * DT))
target_var = SIGMA ** 2 / (2.0 * THETA)
step_var = target_var * (1.0 - float(np.exp(-2.0 * THETA * DT)))
step_sd = float(np.sqrt(step_var))
Z = rng.standard_normal(N)
x = np.empty(N, dtype=np.float64)
v = 0.0
for n in range(N):
v = a * v + step_sd * float(Z[n])
x[n] = v
seg = x[BURN:]
m = float(seg.mean())
vhat = float(seg.var(ddof=0))
rel_err = abs(vhat - target_var) / target_var
print(f"OU theta={THETA} sigma={SIGMA} dt={DT} N={N} burn={BURN}")
print(f"target_var={target_var:.6f} sample_var={vhat:.6f} rel_err={rel_err:.6f} (tol 0.05)")
print(f"sample_mean={m:.6f} (tol |mean|<0.03)")
assert rel_err < 0.05, f"OU var rel_err {rel_err} >= 5%"
assert abs(m) < 0.03, f"OU mean {m} not ~= 0"
print(f"VERIFY 1908-langevin_ou PASS var={vhat:.4f} target={target_var:.4f} mean={m:.5f}")