1909 年稱量原子案:Perrin 實驗收網實錄#
理論家已經寫下逮捕令,現在需要有人親手抓住原子。巴黎索邦大學的 Jean Perrin 花了三年,數乳膠球、量沉降、算常數,把看不見的阿佛加厥數了出來。唯能論當場倒地。
| 欄位 | 內容 |
|---|---|
| 發生時間 | 1908 至 1911 年連續實驗,1909 年首批 \(N_A\) 定值,1913 年結集成《原子》 |
| 地點 | 巴黎索邦大學物理化學實驗室;乳膠球懸浮液載玻片與顯微鏡追蹤台 |
| 報案人 | Jean Perrin(1870–1942),實驗物理學家, Opinion 領袖,後任巴黎大學教授 |
| 偵探 | Perrin 及其學生 Chaudesaigues、Dabrowski;理論後援為 Einstein 與 Smoluchowski |
| 兇器 | 沉降平衡分佈與均方位移,乳膠球半徑約 \(10^{-7}\) 米,多路測定 \(N_A\) |
| 結論 | \(N_A\) 多路一致約 \(6\) 至 \(7 \\times 10^{23}\) ,原子實在確立,1926 年 Nobel 獎,唯能論終結 |
案發現場#
1909 年的科學法庭,氣氛緊繃。
Einstein 在 1905 年寫下預言,Smoluchowski 在 1906 年獨立佐證,Langevin 在 1908 年給出捷徑。但 Ostwald 的唯能論者仍不認罪:公式漂亮不代表原子存在,說不定擴散只是連續介質的某種波動。
法庭需要物證。不是一條,是多條,來自不同方向,指向同一個數字。那個數字就是阿佛加厥常數 \(N_A\) ,每莫耳的粒子數。
Perrin 接下了這個任務。他的武器是藤黃與乳膠球:粒徑均勻、密度已知、可在水中形成穩定懸浮液的微小球體。顯微鏡下,它們就是放大版的 Brown 花粉,舞步清晰可辨。
案發現場有兩個機位。機位一對準垂直方向,看沉降平衡:重力把球往下拉,擴散把球往上推,平衡後的濃度隨高度指數衰減。機位二對準水平方向,看布朗抖動:追蹤單顆球的投影位移,統計均方位移。
兩個機位,同一批球,同一個 \(N_A\) 。若兩路數字一致,唯能論無處可逃。
偵查過程#
Perrin 的偵查是實驗教科書,每一步都可重複、可量化。
第一路:沉降平衡稱原子#
考慮質量為 \(m\) 、有效重量已扣除浮力、半徑為 \(a\) 的球。在高度 \(h\) 處,數密度為 \(n(h)\) 。重力勢能為 \(m g h\) ,熱能為 \(kT\) ,平衡分佈為指數
取對數,斜率即含 \(k\) 。由於 \(k = R / N_A\) ,量出斜率、已知 \(m\) 、 \(g\) 、 \(T\) 、 \(R\) ,即可解出 \(N_A\) 。
Perrin 製備了粒徑高度均一的乳膠球,用離心與沉澱反覆篩選,確保 \(m\) 一致。再以顯微鏡分層計數,每層數百顆,累積數千筆。這是人力密集的笨功夫,也是最硬的證據。
他測得多組高度的濃度比,結果如下示意。
| 高度差 | 濃度比 \(n / n_0\) | 反推 \(N_A\) (示意量級) |
|---|---|---|
| \(10\) 微米 | \(0.75\) | \(6.8 \\times 10^{23}\) |
| \(20\) 微米 | \(0.56\) | \(6.9 \\times 10^{23}\) |
| \(30\) 微米 | \(0.42\) | \(7.0 \\times 10^{23}\) |
| \(40\) 微米 | \(0.32\) | \(6.7 \\times 10^{23}\) |
四組高度,一個常數。指數律成立, \(N_A\) 穩定。這是第一條鎖鏈。
第二路:均方位移再稱一次#
Perrin 的第二機位直接驗證 Einstein 的均方位移。他讓學生 Chaudesaigues 每隔固定時間記錄球的位置,描出折線軌跡,再統計位移平方。
設水平一維位移為 \(x\) ,時間間隔為 \(t\) ,則理論預言 \(E[x^2] = 2 D t\) ,而 \(D = kT / 6 \\pi \\eta a\) 。量出 \(E[x^2]\) 對 \(t\) 的斜率,即得 \(D\) ,再得 \(k\) ,再得 \(N_A\) 。
| 時間間隔 \(t\) | 實測均方位移(示意) | 反推 \(D\) |
|---|---|---|
| \(30\) 秒 | \(7.5\) 平方微米 | \(0.125\) 平方微米每秒 |
| \(60\) 秒 | \(15.1\) 平方微米 | \(0.126\) 平方微米每秒 |
| \(120\) 秒 | \(30.4\) 平方微米 | \(0.127\) 平方微米每秒 |
斜率恆定,正比於 \(t\) ,不是 \(t^2\) 。Einstein 的簽名出現了。由此算出的 \(N_A\) 與沉降法一致,約為 \(7 \\times 10^{23}\) 量級。這是第二條鎖鏈。
第三路:多方會審#
Perrin 沒有停手。他又做了轉動布朗運動、臨界乳光漲落、放射性衰變等多路測定,全部指向同一個 \(N_A\) 。
| 測定路線 | 物理現象 | 所得 \(N_A\) 量級 |
|---|---|---|
| 沉降平衡 | \(n = n_0 \\exp(-mgh / kT)\) | \(6\) 至 \(7 \\times 10^{23}\) |
| 平動擴散 | \(E[x^2] = 2 D t\) | \(6\) 至 \(7 \\times 10^{23}\) |
| 轉動擴散 | 取向漲落的均方轉角 | 同量級一致 |
| 臨界乳光 | 密度漲落散射 | 同量級一致 |
| 放射 α 計數 | 氦生成速率 | 同量級一致 |
五路人馬,同一嫌犯。這在科學史上極罕見:一個常數被五種不相干的現象鎖定。Perrin 在 1913 年出版《原子》,等於把五份口供裝訂成起訴書。
結案報告#
法庭的反應是戲劇性的。
Ostwald,這位唯能論的掌門人,在 1909 年公開承認原子存在。他說,Perrin 的實驗讓否認原子變得不誠實。這是科學論戰中最體面的投降之一。
Mach 至死不從,但影響力迅速萎縮。Boltzmann 的冤案平反了,可惜他已於 1906 年離世,未能親見收網。Perrin 在書中專門致敬 Boltzmann,算是遲來的正義。
Perrin 本人於 1926 年獲 Nobel 物理獎,理由正是沉降平衡與原子實在。同年獲獎脈絡還映照著 Einstein 的光電效應與量子論,屬於物理學的加冕年代。
本案的遺產有三。第一,確立了漲落可測量的典範:從噪聲中讀常數,後來的密立根油滴、Johnson 噪聲測 \(k\) 、LIGO 讀引力波,都是同一個套路。第二,確立了多路一致的證據標準:單一實驗可疑,五路會審定罪。第三,終結了十九世紀的連續統執念,物質的顆粒性從此成為物理地基,化學的分子式、固體的晶格、電子的電荷,全站上了原子肩膀。
探案結語:Brown 看見了舞,Einstein 寫下了譜,Perrin 數清了舞者的人數。案子到此,全案終結。
證據與工具#
| 證物 | 數學形式 | 用途 |
|---|---|---|
| 沉降指數律 | \(n = n_0 \\exp(-m g h / kT)\) | 由濃度梯度反推 \(k\) 與 \(N_A\) |
| 均方位移 | \(E[x^2] = 2 D t\) | 由軌跡統計反推 \(D\) 與 \(N_A\) |
| Stokes–Einstein | \(D = kT / 6 \\pi \\eta a\) | 連接兩路測量的橋樑 |
| 阿佛加厥常數 | \(N_A = R / k\) | 終極證物,多路一致 |
| 單分散乳膠球 | 半徑均一約 \(10^{-7}\) 米 | 確保 \(m\) 與 \(a\) 已知,實驗鑰匙 |
辦案備註:讀者可模擬沉降平衡的指數分佈,改變 \(m\) 、 \(T\) 觀察斜率變化;或模擬二維軌跡驗證 \(4 D t\) 。對應程式見 _code 目錄中 1905 年擴散程式與 1909 年精神相通,另可自寫高度直方圖擬合 \(\\exp(-mgh / kT)\) 反推 \(N_A\) 。
補充:程式實作#
對應程式#
本節對應程式為 1905-einstein_diffusion.py ,該程式與 1905 篇共用,此處從 Perrin 角度解讀:以短時滯均方位移斜率復刻 Perrin 第二路測量。
理論呼應#
本文第二路測量的核心是 \(E[x^2] = 2 D t\) ,量出斜率即得擴散係數 \(D\) 。 由 Stokes–Einstein 關係 \(D = kT / 6 \pi \eta a\) 可解出 \(k\) ,再由 \(N_A = R / k\) 稱出原子數。 程式讓 OU 過程跑至平穩後取小時間滯驗證斜率逼近 \(2 D\) ,正是數位版的顯微鏡追蹤統計。 若沉降平衡與擴散兩路斜率指向同一 \(N_A\) ,即重演 Perrin 的多路會審邏輯。
執行方式#
python3 _code/1905-einstein_diffusion.py
實測輸出#
本次實測輸出如下:tau1=0.0100 MSD1=0.009833 ,tau2=0.0300 MSD2=0.029193 ,slope=0.967985 ,理論目標 target_2D=1.000000 ,相對誤差 rel_err=0.032015 ,通過 8% 誤差帶,結尾印出 VERIFY 1905-einstein_diffusion PASS slope=0.9680 target=1.0000 rel_err=3.2015% 。
讀者實驗#
將 \(D\) 由 0.5 改為 1.0 後重跑,觀察斜率目標是否變為 2.0 並仍通過 8% 誤差帶。
完整程式如下:
# 對應 wiki:1905 年 Einstein 擴散(MSD = 2Dt)與 Ornstein-Uhlenbeck 過程
# 說明:一維 OU dx = -gamma*x*dt + sqrt(2D)*dW,gamma=2, D=0.5;
# 平穩變異數 D/gamma;短時滯下 MSD(tau) ~= 2D*tau(Einstein 擴散)。
# 以精確離散跑至平穩,取小 tau1/tau2 的 MSD 斜率驗證 ~= 2D,誤差 < 8%。
# 僅用 numpy,固定種子,不畫圖只印數字。
import numpy as np
SEED = 1905
GAMMA = 2.0
D = 0.5
DT = 0.001
N = 300_000 # 總步數 (T=300),夠長以達平穩並壓低 MC 誤差
BURN = 50_000 # 前段丟棄
K1 = 10 # tau1 = 0.01
K2 = 30 # tau2 = 0.03
rng = np.random.default_rng(SEED)
a = float(np.exp(-GAMMA * DT))
q = float((D / GAMMA) * (1.0 - np.exp(-2.0 * GAMMA * DT)))
s = float(np.sqrt(q))
Z = rng.standard_normal(N)
xs = np.empty(N, dtype=np.float64)
x = 0.0
for n in range(N):
x = a * x + s * float(Z[n])
xs[n] = x
seg = xs[BURN:]
tau1 = K1 * DT
tau2 = K2 * DT
msd1 = float(np.mean((seg[K1:] - seg[:-K1]) ** 2))
msd2 = float(np.mean((seg[K2:] - seg[:-K2]) ** 2))
slope = (msd2 - msd1) / (tau2 - tau1)
target = 2.0 * D
rel_err = abs(slope - target) / target
print(f"OU gamma={GAMMA} D={D} dt={DT} N={N} burn={BURN}")
print(f"tau1={tau1:.4f} MSD1={msd1:.6f} tau2={tau2:.4f} MSD2={msd2:.6f}")
print(f"slope={slope:.6f} target_2D={target:.6f}")
print(f"rel_err={rel_err:.6f} (tol 0.08)")
assert rel_err < 0.08, f"Einstein slope rel_err {rel_err} >= 8%"
print(f"VERIFY 1905-einstein_diffusion PASS slope={slope:.4f} target={target:.4f} rel_err={rel_err:.4%}")