跳轉到

1827 年花粉之舞:Brown 布朗運動懸案#

倫敦 Soho 區,一位植物學家在顯微鏡下看見了不該動的東西。這不是命案,卻是一樁困擾物理學六十年的懸案。死者沒有,兇手看不見,目擊者只有一粒花粉。

欄位 內容
發生時間 1827 年夏,植物學家 Robert Brown 觀察 Clarkia 花粉期間
地點 倫敦,Brown 自宅書房兼實驗室,顯微鏡載玻片上的一滴水
報案人 Robert Brown(1773–1858),蘇格蘭植物學家,大英博物館植物部主任
偵探 Brown 本人(初步勘查);後續接手的 Einstein(1905)、Perrin(1909)、Wiener(1923)
兇器 看不見的分子撞擊,即水分子的熱運動,粒徑約 \(10^{-6}\) 米量級的花粉被反覆衝撞
結論 懸案:排除生命力與水流假說,確認為無生命微粒的自發抖動,成因留白六十年,待分子運動論收網

案發現場#

1827 年的倫敦,顯微鏡還是紳士的玩具,也是科學的前線。

Brown 正在研究植物受精機制。他把 Clarkia pulchella 的花粉粒放在水滴中,想看清花粉管的形態。放大約三百倍後,異狀出現了。

花粉內部噴出的微小顆粒在水中劇烈抖動,走位毫無章法。前進、後退、急轉、停頓,像醉漢走路,又像被無形的手指彈來彈去。

Brown 的第一直覺是生命。他心想,莫非這是花粉的精子在游泳。身為植物學家,這個猜想合情合理。

於是他擴大了搜索範圍。這是本案最漂亮的一手勘查。

他磨碎了無生命物質:玻璃粉、玄武岩粉、花崗岩粉、甚至一塊來自金字塔的石頭碎屑、斯芬克斯雕像上敲下的碎片。只要磨得夠細,丟進水裡,全都會跳舞。

案發現場的 key 事實就此固定下來。

第一,舞者不限於花粉。無生命粉末一樣會動,生命假說當場排除。

第二,抖動永不停歇。觀察數小時不衰減,不像是殘留的攪動或蒸發對流。

第三,粒徑越小,舞步越狂野。粗顆粒沉穩,細顆粒瘋狂,呈現明顯的尺寸效應。

第四,水流、震動、光照、溫度梯度都不能解釋。Brown 試過靜置、隔震、換液體,抖動依舊。

Brown 在 1828 年發表了兩篇論文,老實記錄了這一切,並坦承不知道原因。他把謎題封存在檔案袋裡,貼上「成因不明」的封條。

這一封,就是將近六十年。

偵查過程#

本案的偵查分三波。前兩波是排除法,第三波是六十年後的科學鑑識。

第一波:Brown 的排除法#

Brown 像老練的刑警,先列出所有嫌疑人,再逐一釋放。

嫌疑人 偵查手段 結果
花粉的生命力 研磨無生命礦物與玻璃粉末對照 無生命粉末一樣抖動,嫌疑排除
水的蒸發與對流 密封載玻片、靜置長時間觀察 抖動不停止,對流說不成立
載玻片震動 隔震檯面、不同地點重複實驗 各處皆可見,震動說排除
光照加熱 改變光源強度與照射角度 舞步型態不變,光熱說排除
粒子間相互吸引 稀釋懸浮液至粒子相距甚遠 單顆粒子仍獨舞,交互說排除

排除到最後,只剩一個不敢寫下名字的嫌疑人:水本身在動。

但 1827 年的物理學還沒有分子運動論的逮捕令。Brown 只能結案於現象,把動機欄留白。

第二波:六十年的流言與誤判#

懸案期間,各種理論在走廊裡低語。

有人說是毛細作用,有人說是電作用,有人說是顯微鏡的像差。1860 年代,Christian Wiener 等人猜測分子撞擊是兇手,但拿不出定量證據。

真正的轉機來自熱學。1860 至 1870 年代,Maxwell 與 Boltzmann 建立了氣體分子運動論,算出了分子速度分佈。Sydney 的法國物理學家 Gouy 在 1888 年做了精細觀察,確認布朗運動與溫度有關,溫度越高舞步越快。

這條線索至關重要。溫度越高,分子動能越大,撞擊越猛。若兇手真是分子,那麼抖動強度應該正比於絕對溫度 \(T\) ,反比於液體黏滯係數 \(\\eta\) 與粒徑 \(a\) 。

可是沒有人能把這句話寫成可以驗證的數字。懸案依然掛在牆上。

第三波:Einstein 的鑑識報告(伏筆)#

1905 年,專利局三等技師 Albert Einstein 接手了這樁冷案。他沒有顯微鏡,只有一支筆。

他的推理起點是統計力學:懸浮粒子與液體分子處於熱平衡,能量均分應該成立。粒子的平均動能應為 \(kT / 2\) 的量級,其中 \(k\) 為波茲曼常數。

接著他把隨機撞擊的累積效應寫成擴散方程。設 \(t\) 時刻粒子位置分佈為 \(p(x,t)\) ,擴散係數為 \(D\) ,則有

\[ \\partial_t p = D \\partial_{xx} p \]

其基本解為高斯分佈,變異數隨時間線性成長。均方位移滿足

\[ E[x^2] = 2 D t \]

而 \(D\) 由流體力學決定,即 Stokes–Einstein 關係

\[ D = kT / 6 \\pi \\eta a \]

這三行式子就是逮捕令。Brown 看見的醉步,原來是大量獨立小撞擊的中央極限定理現形。每一步不可預測,但平方位移的平均值精準可算。

Einstein 在論文末尾喊話:實驗家們,去量 \(D\) ,去量 \(E[x^2]\) ,若符合,就是原子的直接證據。

三年後 Langevin 給出另一條路,1909 年 Perrin 親手量到,1923 年 Wiener 蓋上數學鋼印。這些都是後話,本案在此只埋下伏筆。

結案報告#

1827 年案件本身,以「現象確認、成因未明」結案。但它的歷史判決極重。

第一,它終結了生命力解釋。Brown 用無生命粉末的對照實驗,證明抖動不需要生命。這是科學方法的一次示範:對照組比顯微鏡更銳利。

第二,它保存了關鍵證據。粒徑效應、永不停歇、溫度相關,這三條線索完整到六十年後可以直接拿去驗證擴散理論,沒有重勘現場的必要。

第三,它標定了原子論的決戰場。Ostwald 與 Mach 的唯能論者可以否認原子,但他們否認不了一滴水裡跳舞的粉末。只要有人能定量預言舞步,原子就從假說變成事實。

Brown 本人沒有看到破案。他 1858 年去世,帶著植物學家的榮譽,卻不知道自己留下的最大遺產是一樁物理懸案。

探案的規矩是:先看見,才能解釋。Brown 是那個看見的人。他的功績不在於解答,而在於把問題描述得如此乾淨,讓六十年後的偵探可以直接開庭。

下一案檔案:1900 年巴黎,一位數學家在股市裡看見了同樣的醉步。

證據與工具#

核心證據有三件,全部來自 Brown 的原始觀察與後人的定量化。

其一為尺寸效應。粒徑 \(a\) 越小,抖動越劇烈,預示了 \(D\) 與 \(a\) 成反比。這是 Stokes 阻力 \(6 \\pi \\eta a\) 留下的指紋。

其二為時間標度。短時間看似折線,長時間位移的平方平均正比於時間 \(t\) ,而非 \(t^2\) 。彈道運動給出 \(t^2\) ,隨機漫步給出 \(t\) ,兩者涇渭分明。

其三為溫度指紋。Gouy 觀察到升溫加劇抖動,對應公式中 \(D\) 正比於 \(T\) 。溫度成了分子的測謊器。

工具 用途 出處
複式顯微鏡(約三百倍) 目擊抖動現象 Brown 1827
對照實驗法(有生命 vs 無生命粉末) 排除生命力假說 Brown 1828
分子運動論與能量均分 提出撞擊假說 Maxwell、Boltzmann、Gouy
擴散方程與均方位移 \(E[x^2] = 2 D t\) 定量逮捕令 Einstein 1905(伏筆)
沉降平衡與 \(N_A\) 測定 物證落實 Perrin 1909(後續)
Wiener 測度與二次變差 \([W]_t = t\) 數學鋼印 Wiener 1923(後續)

辦案備註:本案對應數值實驗為二維均方位移約 \(4 D t\) ,詳見 _code 目錄中 1827 年程式。讀者可改變粒徑 \(a\) 與溫度 \(T\) ,親眼看見舞步隨 \(D\) 放大縮小。

補充:程式實作#

對應程式#

1827-brownian_msd.py

理論呼應#

本文核心理論為均方位移滿足 \(E[x^2] = 2 D t\) ,二維疊加後為 \(E[r^2] = 4 D t\) 。 程式以二維隨機漫步模擬大量軌跡,直接統計平方位移的系綜平均值。 擴散係數由流體力學決定,即 \(D = kT / 6 \pi \eta a\) ,粒徑與溫度改變會直接改變斜率。 實測斜率逼近 \(4 D\) ,正是彈道 \(t^2\) 與隨機漫步 \(t\) 差異的最佳見證。

執行方式#

python3 _code/1827-brownian_msd.py

實測輸出#

N=20000 n_paths=2000 D=1.0 dt=1.0 t_mid=10000
expected_MSD=4Dt=40000.000000
sample_MSD=39279.429596 se=881.795174
rel_err=0.018014 (tol 0.05)
VERIFY 1827-brownian_msd PASS msd=39279.4296 expected=40000.0000 rel_err=1.8014%

讀者實驗#

試將 \(D\) 由 \(1.0\) 改為 \(2.0\) ,觀察樣本均方位移是否約變為兩倍。

完整程式如下:

# 對應 wiki:1827 年 Brown 運動 / 隨機漫步與擴散(MSD = 4Dt 二維)
# 說明:二維隨機漫步,每維增量 ~ N(0, 2D·dt),D=1, dt=1;
# 理論 MSD(t) = 4Dt。取中段 t_mid=N//2 驗證,避免起點暫態與終點單一樣本偏差。
# 僅用 numpy,固定種子,不畫圖只印數字。
import numpy as np

SEED = 1827
D = 1.0
DT = 1.0
N = 20000
N_PATHS = 2000
T_MID = N // 2  # 中段
BATCH = 200  # 分批產生,控制記憶體

rng = np.random.default_rng(SEED)
sigma_1d = float(np.sqrt(2.0 * D * DT))

sum_r2 = 0.0
sum_r2_sq = 0.0
for start in range(0, N_PATHS, BATCH):
    b = min(BATCH, N_PATHS - start)
    dx = rng.normal(0.0, sigma_1d, size=(b, T_MID))
    dy = rng.normal(0.0, sigma_1d, size=(b, T_MID))
    x = dx.sum(axis=1)
    y = dy.sum(axis=1)
    r2 = x * x + y * y
    sum_r2 += float(r2.sum())
    sum_r2_sq += float((r2 ** 2).sum())

msd = sum_r2 / N_PATHS
expected = 4.0 * D * (T_MID * DT)
rel_err = abs(msd - expected) / expected
var_r2 = sum_r2_sq / N_PATHS - msd ** 2
se = float(np.sqrt(max(var_r2, 0.0) / N_PATHS))

print(f"N={N} n_paths={N_PATHS} D={D} dt={DT} t_mid={T_MID}")
print(f"expected_MSD=4Dt={expected:.6f}")
print(f"sample_MSD={msd:.6f} se={se:.6f}")
print(f"rel_err={rel_err:.6f} (tol 0.05)")

assert rel_err < 0.05, f"MSD rel_err {rel_err} >= 5%"
print(f"VERIFY 1827-brownian_msd PASS msd={msd:.4f} expected={expected:.4f} rel_err={rel_err:.4%}")