1884 Ostwald 催化與平衡#
案發現場#
十九世紀下半葉,化學家已經知道某些物質能「神奇地」加速反應,而自己卻不消耗——這類物質被柏齊利烏斯(Berzelius)於 1835 年命名為「催化劑」(catalyst)。但催化劑到底做了什麼?它是提供了「神祕的振動」,還是改變了反應的平衡?如果催化劑能移動平衡,那永動機豈不是有希望了?
同時,另一個問題也在困擾工業化學家:化學反應在密閉系統中會停在平衡點,平衡的位置由什麼決定?溫度、壓力、濃度改變時,平衡會往哪邊移動?合成氨、接觸法製硫酸等新興工業迫切需要答案。里加理工學院(後遷至萊比錫)的奥斯特瓦德(Wilhelm Ostwald, 1853–1932)接下了這兩個案子——他相信化學應該建立在能量關係之上,而吉布斯與范特荷甫的能量學正是他的武器。
偵查過程#
奥斯特瓦德的推理從一個基本原理開始:催化劑不可能移動平衡。理由極其簡單,卻是邏輯上的絕殺:
若催化劑能移動平衡,就能製造永動機。 假設某催化劑讓正反應更「偏向」產物方向,那麼在同一容器中,正反應釋放的能量會比逆反應消耗的多,多出來的淨能量可以不斷地被提取——這直接違反熱力學第二定律。因此催化劑只能改變「到達平衡的速度」,不能改變「平衡本身」:
速率常數同倍率放大,平衡常數保持不變:
用現代語言說:催化劑降低了活化能位障,但正逆反應的位障被降低「同樣的量」(見 1889-Arrhenius活化能.md)。
第二個偵查目標:平衡移動的方向。 1884 年,法國化學家勒夏特列(Henri Le Chatelier)獨立提出了以他命名的原理,奥斯特瓦德則用能量學給出了更深刻的表述:
用數學說:對反應 \(\sum_i \nu_i A_i = 0\) ,平衡常數與濃度商的關係決定移動方向:
其中 \(a_i\) 是活量(activity)。溫度的影響由凡特荷甫方程給出:
吸熱反應( \(\Delta H > 0\) )升溫時 \(K\) 增大,平衡向產物移動——這正是勒夏特列原理的定量版本。
奥斯特瓦德的關鍵實驗是在酸鹼催化與酯化反應上:他測量了乙酸的電離平衡(這也啟發了他的學生阿瑞尼士,見 1887-Arrhenius電解解離.md),並證明催化劑的效率與其電離度相關。1887 年他創辦《物理化學學報》(Zeitschrift für physikalische Chemie),一手建立了「物理化學」這門學科。
結案報告#
奥斯特瓦德因催化理論與化學平衡研究獲 1909 年諾貝爾化學獎。他的遺產體現在三個方向:
- 工業化學之基:合成氨的 Haber-Bosch 法(高壓、催化劑、控制溫度在平衡與速率的最佳折衷)正是勒夏特列原理與催化理論的應用;接觸法製硫酸的 \(\mathrm{V_2O_5}\) 催化劑也是。
- 物理化學學科化:他培養了阿瑞尼士、能斯特等一代大師,萊比錫成為物理化學聖地。
- 能量學的勝利:他翻譯吉布斯的《非均質物質的平衡》,讓被埋沒二十年的吉布斯理論重見天日(見 1876-Gibbs化學熱力學.md)。
「催化劑不改變平衡」這條原理至今仍是化學工業設計的第一守則。
證據與工具#
# 驗證:催化劑同倍率放大正逆反應速率,平衡常數不變
import numpy as np
import matplotlib.pyplot as plt
# 例:NO2 <-> N2O4 型二聚反應的濃度商隨時間變化
K = 4.0 # 平衡常數(無催化劑)
alpha = 10.0 # 催化劑將 k 同倍率放大 10 倍
k_fwd, k_rev = 1.0, K / 1.0 # 速率常數
t = np.linspace(0, 8, 300)
def conc(t, k1, k2):
# 一階可逆反應 A -> B 的解析解,初始全為 A
return 1 / (1 + k2 / k1) * (1 - np.exp(-(k1 + k2) * t))
x_no_cat = conc(t, k_fwd, k_rev) # 無催化劑
x_cat = conc(t, alpha * k_fwd, alpha * k_rev) # 有催化劑
# 平衡濃度與平衡常數檢驗
K_eff_no = x_no_cat[-1] / (1 - x_no_cat[-1])
K_eff_cat = x_cat[-1] / (1 - x_cat[-1])
print(f"無催化劑平衡常數: {K_eff_no:.3f}")
print(f"有催化劑平衡常數: {K_eff_cat:.3f} → 相同,催化劑不影響平衡")
plt.plot(t, x_no_cat, label="無催化劑")
plt.plot(t, x_cat, "--", label="有催化劑(快 10 倍)")
plt.axhline(x_cat[-1], color="gray", ls=":")
plt.xlabel("時間 (任意單位)"); plt.ylabel("轉化率 x")
plt.title("催化劑加速到達平衡,但平衡位置不變")
plt.legend(); plt.show()