1834 Hamilton 正則方程#
案發現場#
1834 年,愛爾蘭天文學家、數學家 William Rowan Hamilton(1805–1865)發表論文《論力學中的一般方法》(On a General Method in Dynamics)。這篇論文的表面目的是研究行星軌道,實際上卻完成了一件驚天動地的統一:把光學與力學寫進同一套數學框架。
懸案始於 Lagrange 力學的一個「不完美」。Lagrange 已經把牛頓力學改寫成
其中 \(L = T - V\) 是 Lagrangian(動能減位能), \(q_i\) 是廣義座標。這套方程很美,但有兩個「瑕疵」:
- 它是 \(n\) 個二階 ODE——二階方程不如一階方程好處理、好理解;
- 方程同時混雜了 \(q\) 與 \(\dot q\) ,兩者地位不對稱,幾何圖像模糊。
當時還有一個更深層的謎:光線的傳播與行星的運動,為什麼看起來這麼像? 光有 Fermat 原理(光走時間最短的路徑),力學有 Maupertuis 原理(粒子走「作用量」最小的路徑)。兩者都是「極值原理」,形式上驚人地相似。這是巧合,還是有更深的統一?
Hamilton 從年輕時就迷上了這個謎。他 1827 年以 22 歲之齡提出「特徵函數」理論統一光學,1834–1835 年再把同一套思想搬進力學。
偵查過程#
第一步:從 Lagrangian 出發——Legendre 變換#
Hamilton 的第一個靈感:換變數。Lagrange 方程裡 \(q\) 與 \(\dot q\) 的地位不對稱,原因在於 Lagrangian 是 \(\dot q\) 的函數而非動量的函數。Hamilton 提議把速度 \(\dot q\) 換成動量 \(p\) :
這個變數替換就是 Legendre 變換。幾何上,它把函數 \(L(\dot q)\) 換成其「對偶函數」:定義
其中 \(\dot q\) 要用 \(p\) 反解出來(由 \(p = \partial L/\partial \dot q\) )。這個新函數 \(H\) 就是Hamiltonian。對最常見的情形,動能是速度的二次型,此時 \(H = T + V\) ——動能加位能,即總能量。
驗證一下最簡單的例子:一維自由粒子, \(L = \frac{1}{2}m\dot q^2\) 。動量 \(p = m\dot q\) ,反解 \(\dot q = p/m\) ,於是
正是 \(\frac{1}{2}mv^2\) (以 \(p\) 表示),即動能。✓
第二步:推導正則方程#
現在把 Lagrange 方程翻譯到新變數 \((q, p)\) 。設 \(H(q, p)\) 由 Legendre 變換而來,對 \(p_i\) 求偏導:
最後一項由 \(p_j = \partial L/\partial\dot q_j\) 恰好與前一項相消(Chain rule 的配合),剩下
再對 \(q_i\) 求偏導(固定 \(p\) ,即 \(\dot q\) 隨 \(q\) 變化的部分也相消):
而 Lagrange 方程說 \(\dfrac{d}{dt}\dfrac{\partial L}{\partial \dot q_i} = \dfrac{\partial L}{\partial q_i}\) ,即 \(\dot p_i = \dfrac{\partial L}{\partial q_i}\) 。代入得
合起來就是Hamilton 正則方程:
\(n\) 個二階方程搖身一變,成了 \(2n\) 個一階方程——而且形式完美對稱: \(q\) 往 \(H\) 對 \(p\) 的方向走, \(p\) 往 \(H\) 對 \(q\) 的反方向走。
第三步:驗證——諧振子#
一維諧振子: \(H = \dfrac{p^2}{2m} + \dfrac{1}{2}kq^2\) 。正則方程:
兩式組合: \(\ddot q = \dot p / m = -\dfrac{k}{m}q\) ,回到熟悉的 \(\ddot q + \omega^2 q = 0\) ( \(\omega^2 = k/m\) ),解為 \(q = A\cos(\omega t) + B\sin(\omega t)\) 。✓ 與 Lagrange、牛頓力學完全一致。
第四步:相空間與守恆量#
正則方程的幾何革命: \((q, p)\) 組成的 \(2n\) 維空間稱為相空間(phase space)。系統的演化是相空間中的一條曲線(相軌道)。而能量守恆在此變得顯而易見:沿解計算 \(H\) 對時間的全導數,
兩項恰好相消——** \(H\) 沿軌道恆定**。若 \(H = T + V\) ,這正是能量守恆。守恆律不再是物理觀察,而是方程結構的直接推論。
第五步:光學與力學的統一#
Hamilton 更深層的偵查成果:他在光學中定義的「特徵函數」 \(S\) (光程),在力學中也有對應物。Fermat 原理說光走 \(\delta\int n\,ds = 0\) 的路徑;Maupertuis 原理說粒子走 \(\delta\int p\,ds = 0\) 的路徑。兩者的數學結構完全相同——只是把折射率 \(n\) 換成動量 \(p\) 。這個統一最終導出 Hamilton-Jacobi 方程(參見 1838-Jacobi與Hamilton-Jacobi方程.md),而在一百年後,它更成為量子力學(Schrödinger 方程與 WKB 近似)的先聲。
結案報告#
Hamilton 解開了光學與力學的統一之謎:兩者都是「變分原理 + 特徵函數」的結構。他把力學改寫為 \(2n\) 個一階正則方程,並發明了相空間。
遺產:
- 相空間與統計力學:Boltzmann 與 Gibbs 的統計力學完全建立在相空間之上;Liouville 的「相體積不變定理」(參見 1841-Liouville可積性之謎.md)是正則方程的直接推論。
- Hamilton-Jacobi 理論:Jacobi 完善的 HJ 方程是可積系統與量子力學的橋樑。
- 混沌理論:Poincaré 研究三體問題時用的正是正則方程與相空間幾何(參見 1886-Poincare三體問題.md);Hamilton 系統的保守性導致了 KAM 定理與混沌的研究。
- 辛幾何:正則方程背後的幾何結構(辛形式)在二十世紀發展成辛幾何,成為現代數學的重要分支。
- 量子力學:正則量子化就是「把 \(q, p\) 換成算符並保持對易關係 \([q,p] = i\hbar\) 」,直接繼承了 Hamilton 的框架。
證據與工具#
# Hamilton 正則方程數值驗證:諧振子與能量守恆
import numpy as np
from scipy.integrate import solve_ivp
def harmonic_hamiltonian(t, z):
"""諧振子 H = p^2/2m + k q^2/2,正則方程 q' = p/m, p' = -k q"""
q, p = z
m, k = 1.0, 4.0
return [p/m, -k*q]
def energy(z):
"""計算 H(總能量)"""
q, p = z
m, k = 1.0, 4.0
return p**2/(2*m) + k*q**2/2
# 數值求解正則方程
sol = solve_ivp(harmonic_hamiltonian, [0, 10], [1.0, 0.0], max_step=0.01)
q, p = sol.y
E = [energy([qq, pp]) for qq, pp in zip(q, p)]
print("能量守恆檢驗:H 起始 =", E[0], " 終點 =", E[-1], " 波動 =", max(E)-min(E))
# 驗證解析解 q = cos(2t)(omega = sqrt(k/m) = 2)
q_exact = np.cos(2*sol.t)
print("數值解 vs 解析解最大誤差:", np.max(np.abs(q - q_exact)))
# Legendre 變換驗證:L = 0.5*m*v^2 -> H = p^2/(2m)
m, v = 2.0, 3.0
L = 0.5*m*v**2
p_ = m*v # p = dL/dv
H = p_*v - L # H = pv - L
print("Legendre 變換:H =", H, " 應等於 p^2/(2m) =", p_**2/(2*m))
# 相空間圖:諧振子的橢圓軌道(能量守恆的幾何呈現)
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
plt.plot(q, p, lw=1)
plt.xlabel("q"); plt.ylabel("p")
plt.title("諧振子相軌道:H = 常數的橢圓")
plt.savefig("hamilton_phase.png", dpi=100)
print("已存圖 hamilton_phase.png")
# 雙擺的混沌前身:用正則方程看非線性系統的敏感依賴
def double_well(t, z):
"""雙阱位勢 V = q^4/4 - q^2/2 的正則方程"""
q, p = z
return [p, -(q**3 - q)]
s1 = solve_ivp(double_well, [0, 20], [0.01, 0.0], max_step=0.01)
s2 = solve_ivp(double_well, [0, 20], [0.01001, 0.0], max_step=0.01) # 初值差 1e-5
d = np.abs(s1.y[0] - s2.y[0])
print(f"雙阱系統:初值差 1e-5,20 秒後軌道差 = {d[-1]:.4f}(非線性系統敏感依賴)")