1889 Arrhenius 活化能#
案發現場#
化學家早就知道溫度是反應速率的總開關:肉在高溫腐敗快、低溫冷藏保鮮;反應速率隨溫度上升而驚人地加快——溫度每升高 10 度,速率大約翻倍。但「大約翻倍」背後的數學規律是什麼?為什麼只是幾十度的溫差,就能讓速率差上幾十倍甚至幾百倍?
1884 年,范特荷甫根據熱力學(正逆反應平衡常數的溫度依賴性,見 1884-Ostwald催化與平衡.md)提出了一個經驗式,暗示速率常數的溫度關係應該是指數形式的:
但這只是從平衡關係反推的影子, \(A\) 是什麼?物理意義何在?沒有人知道。剛以電離解離說揚名(也飽受攻擊)的阿瑞尼士(Svante Arrhenius, 1859–1927)在 1889 年破解了這個案子,並創造了化學中最重要的概念之一:活化能。
偵查過程#
阿瑞尼士的靈感來自一個大膽的假設:分子之間必須先「越過一道能障」才能反應。反應物分子並非碰撞就反應,只有那些能量高於某個臨界值 \(E_a\) (活化能)的「活躍分子」才能成功反應。而分子能量的分布遵循馬克士威-波茲曼分布——能量超過 \(E_a\) 的分子比例正比於:
這個指數因子就是速率常數中溫度依賴性的來源。於是誕生了化學中最著名的方程——阿瑞尼士方程:
其中 \(k\) 是速率常數, \(A\) 是指前因子(頻率因子,代表碰撞頻率與空間取向), \(E_a\) 是活化能(J/mol), \(R\) 是氣體常數。
數學推導:直線化與活化能的求法。 對方程取對數:
若以 \(\ln k\) 對 \(1/T\) 作圖,得到一條直線!斜率是 \(-E_a/R\) 、截距是 \(\ln A\) 。這是實驗化學家求活化能的標準方法——只要測幾個溫度下的速率常數,作圖取斜率,活化能就現形了。兩個溫度間還有簡潔的公式:
驗證的關鍵實驗。 阿瑞尼士用蔗糖轉化(轉化酶催化)、乙酸乙酯皂化等反應的數據檢驗: \(\ln k\) 對 \(1/T\) 的圖確實是漂亮的直線,典型活化能約 50–100 kJ/mol。代入計算也吻合「每升 10 度速率翻倍」的經驗規律:若 \(E_a = 50\) kJ/mol,從 300 K 升到 310 K:
與催化劑的統一。 活化能概念也完美解釋了奥斯特瓦德的催化理論:催化劑提供了一條「繞過高山」的低能障路徑,降低 \(E_a\) (見 1884-Ostwald催化與平衡.md)。由於 \(E_a\) 在指數上,即使只降低 20 kJ/mol,速率也能提升數百倍。
結案報告#
1903 年阿瑞尼士獲諾貝爾化學獎(同 1887-Arrhenius電解解離.md)。阿瑞尼士方程成為化學動力學的基石,其遺產包括:
- 反應速率理論:1930 年代的過渡狀態理論(Eyring)將 \(A\) 與熵聯繫起來, \(k = (k_B T/h) e^{-\Delta G^\ddagger/RT}\) ,但指數形式的核心思想不變。
- 工業與生活:食品保鮮、藥物有效期( shelf-life)、催化劑設計、引擎燃燒、半導體製程中的擴散,全部用阿瑞尼士方程建模。
- 地球科學:阿瑞尼士本人還是最早計算「溫室效應」的科學家——他算出大氣 \(\mathrm{CO_2}\) 翻倍會使地球升溫數度,這正是今日氣候變遷研究的源頭。
- 生物化學:酶催化反應同樣遵循阿瑞尼士行為,酶的本領就是把 \(E_a\) 降到極低。
證據與工具#
# 用阿瑞尼士方程擬合實驗數據:求活化能 Ea 與指前因子 A
import numpy as np
import matplotlib.pyplot as plt
# 假設的實驗數據:某反應在不同溫度下的速率常數 k
T = np.array([273, 288, 298, 303, 313, 328, 338]) # K
k = np.array([0.078, 0.26, 0.55, 0.95, 1.8, 4.8, 9.5]) # 1/s
x = 1 / T
y = np.log(k)
slope, intercept = np.polyfit(x, y, 1) # 線性擬合 ln k = ln A - Ea/R * (1/T)
R = 8.314 # J/(mol·K)
Ea = -slope * R
A = np.exp(intercept)
print(f"活化能 Ea = {Ea/1000:.1f} kJ/mol")
print(f"指前因子 A = {A:.3g} 1/s")
# 驗證「每升 10 度速率約翻倍」
k1, k2 = A*np.exp(-Ea/(R*298)), A*np.exp(-Ea/(R*308))
print(f"298→308 K 速率比 = {k2/k1:.2f}")
# 繪圖:阿瑞尼士圖(直線是理論預言的鐵證)
plt.scatter(x, y, label="實驗數據")
plt.plot(x, slope*x + intercept, "r--",
label=f"擬合: Ea = {Ea/1000:.1f} kJ/mol")
plt.xlabel("1/T (1/K)")
plt.ylabel("ln k")
plt.title("阿瑞尼士圖:ln k 對 1/T 為直線")
plt.legend(); plt.show()
# 額外:畫出指數式的 k(T) 曲線
Tf = np.linspace(270, 350, 200)
plt.plot(Tf, A*np.exp(-Ea/(R*Tf)))
plt.xlabel("T (K)"); plt.ylabel("k (1/s)")
plt.title("速率常數隨溫度呈指數增長"); plt.show()