07.2 Christoffel 符號與協變導數#
本節目標#
- 理解為什麼需要「聯絡」:對向量場微分時,基底本身也在變。
- 推導協變導數 \(\nabla_j v^i = \partial_j v^i + \Gamma^i_{jk} v^k\) 的直覺與公式來源。
- 掌握 Christoffel 符號與度量的關係式 \(\Gamma^i_{jk} = \frac12 g^{il}(\partial_j g_{lk} + \partial_k g_{jl} - \partial_l g_{jk})\) 。
- 用 SymPy 對極座標平面與球面完整計算所有 Christoffel 符號,列出非零者。
- 實驗視覺化 \(\Gamma^\theta_{r\theta} = 1/r\) :看「基底旋轉」如何被係數捕捉。
直覺:求導時,尺和量角器也在動#
在平面的直角座標裡, \(\partial_i \mathbf{v}\) 是小學級別的操作:對每個分量求偏導。但一換到曲面或彎曲座標,事情立刻變了。
回憶 07.1:向量寫成 \(\mathbf{v} = v^i \mathbf{e}_i\) 。對座標 \(j\) 求導:
第二項是麻煩來源:基底向量 \(\mathbf{e}_i\) 依賴位置(例如極座標的 \(\mathbf{e}_\theta\) 隨 \(\theta\) 轉方向、隨 \(r\) 變長度)。在直角座標中 \(\mathbf{e}_x, \mathbf{e}_y\) 處處相同,第二項為零,所以我們從來沒感覺到它;但它在曲面與彎曲座標中始終存在,忽略它就會算出依座標而異的假導數。
第二項可以展開: \(\partial \mathbf{e}_i / \partial x^j\) 仍是向量,沿基底分解:
係數 \(\Gamma^k_{ji}\) 就是 Christoffel 符號(聯絡係數)——它記錄「當你沿 \(x^j\) 走一步,基底 \(\mathbf{e}_i\) 相對於座標方向轉了、縮了多少」。它是座標資訊的忠實會計。
協變導數:把基底變化補回去#
把分解代入,定義真正的(座標不變的)導數:
整理成標準記號,協變導數:
兩段各管一件事: \(\partial_j v^i\) 是「分量的變化率」, \(\Gamma^i_{jk} v^k\) 是「基底的變化率經由 \(\mathbf{v}\) 本身造成、需要補償的部分」。兩者合成後才是座標不變的幾何量。
關鍵性質:
驗證方式:將 \(\nabla_j v^i\) 在座標變換下的行為算出來——額外的 \(\Gamma\) 項恰好把 \(\partial_j v^i\) 中「不按張量法則變」的部分吃掉。這也是「協變」名稱的由來:下標 \(j\) 像協變指標那樣變換。
Christoffel 符號由度量決定#
到目前為止 \(\Gamma\) 只被定義為「基底變化率的分解係數」,還需一條可以用 SymPy 計算的公式。若我們要求聯絡與度量相容(沿任何路徑做平行移動時長度與內積不變,這是 07.3 的主題), \(\Gamma\) 就被唯一確定:
記憶法:「三項式、對 \(j,k\) 對稱、乘 \(g\) 反矩陣」。它完全由 \(g_{ij}\) 及其一階偏導構成——度量的知識就足夠定義求導。直覺:度量告訴我們各方向「尺的刻度」,Christoffel 符號則告訴我們刻度之間如何相互扭轉。
SymPy 實作:極座標平面的 Christoffel 符號#
自建矩陣做法(不用 sympy.diffgeom,全程 Matrix,便於控制):
import sympy as sp
r, th = sp.symbols('r theta', real=True, positive=True)
def metric_to_christoffel(g, coords):
"""由度量矩陣計算 Christoffel 符號 Γ^i_jk,回傳三維巢狀結構。
g[i,j] 為度量,coords 為座標變數串列。"""
n = len(coords)
ginv = g.inv()
G = {}
for i in range(n):
for j in range(n):
for k in range(n):
expr = sp.simplify(sum(
sp.Rational(1,2) * ginv[i, l] *
(sp.diff(g[l, k], coords[j]) +
sp.diff(g[l, j], coords[k]) -
sp.diff(g[j, k], coords[l]))
for l in range(n)))
if expr != 0:
G[(i, j, k)] = expr
return G
# 極座標平面度量
g_polar = sp.Matrix([[1, 0], [0, r**2]])
G_polar = metric_to_christoffel(g_polar, [r, th])
names = ['r', 'θ']
for key, val in sorted(G_polar.items()):
i, j, k = key
print(f"Γ^{names[i]}_{names[j]}{names[k]} = {sp.simplify(val)}")
輸出(把下標換成符號):
恰好兩個(對稱後三個)非零符號,全部可解釋: \(-r\) 與 \(1/r\) 正是「 \(\mathbf{e}_\theta\) 隨 \(\theta\) 轉向、隨 \(r\) 變長」的數值記錄。
SymPy 實作:球面(單位球, \((\theta, \phi)\) 座標)#
球面度量 \(g = \mathrm{diag}(1, \sin^2\theta)\) :
sin_t = sp.sin(th)
g_sphere = sp.Matrix([[1, 0], [0, sin_t**2]])
G_sphere = metric_to_christoffel(g_sphere, [th, sp.Symbol('phi', real=True)])
for (i, j, k), val in sorted(G_sphere.items()):
names = [u'θ', u'φ']
# Γ^i_jk 與 Γ^i_kj 對稱,列印一次即可
if (i, k, j) not in G_sphere or j <= k:
print(f"Γ^{names[i]}_{names[j]}{names[k]} = {val}")
非零符號(對 \(j,k\) 對稱):
幾何解讀: \(\Gamma^\phi_{\theta\phi} = \cot\theta\) 說明——沿極角方向(往南北極走),經線會收攏, \(\mathbf{e}_\phi\) 的長度 \(\sin\theta\) 要縮小,聯絡把這件事記了下來;在赤道處 \(\cot\theta = 0\) (經線互相平行),在極點處發散。
動手實驗#
**實驗 1:視覺化 \(\Gamma^\theta_{r\theta} = 1/r\) **
\(\Gamma^\theta_{r\theta}\) 的意義:沿 \(r\) 方向走一小步,基底 \(\mathbf{e}_\theta\) 相對於 \(\theta\) 方向「增長比率」為 \(1/r\) ——離原點越遠,同樣的 \(\theta\) -步幅對應的實際弧就越長。動手驗證:
import sympy as sp
r, th = sp.symbols('r theta', positive=True)
# e_theta 的長度是 r;d/dr(e_theta 長度)/長度 = 1/r
e_len = sp.sqrt(( -r*sp.sin(th))**2 + (r*sp.cos(th))**2)
print(sp.simplify(sp.diff(e_len, r)/e_len)) # 1/r ✓ (即 Γ^θ_{rθ})
再畫出:在同一點畫 \(\mathbf{e}_r, \mathbf{e}_\theta\) (用 matplotlib quiver),令 \(r\) 從 1 走到 3,觀察 \(\|\mathbf{e}_\theta\| = r\) 線性增大。斜率/長度比就是 \(1/r\) 。
實驗 2:直角座標的 Γ 全為零
對 \(g = I\) 跑同一個函數,確認字典為空。這解釋了為什麼在直角座標學微積分時從不提及聯絡——不是不存在,而是恰好為零。換成極座標後量子「出現」了:它們是座標的產物,不是空間的性質。(但要注意:曲面的曲率資訊會藏在「Γ 隨位置變化的方式」裡,見 07.3、07.4。)
實驗 3:驗證 Γ 的下標對稱性
對兩個例子檢查:對所有 \(i, j, k\) ,Γ(i,j,k) == Γ(i,k,j)。在公式中互換 \(j \leftrightarrow k\) 不變——Levi-Civita 聯絡是無撓(torsion-free)的預兆。
實驗 4(挑戰):橢球面 或 三維極座標
用 \(g = \mathrm{diag}(1, \sin^2\theta, \sin^2\theta \sin^2\phi)\) 對三維球座標計算全部 Christoffel 符號(應有 6 個非零組),並逐一給幾何解釋。
小結與練習#
本節重點
- 彎曲座標中 \(\partial_j \mathbf{v}\) 多出一項 \(v^i \partial_j \mathbf{e}_i\) ,因為基底隨位置變。
- 協變導數 \(\nabla_j v^i = \partial_j v^i + \Gamma^i_{jk} v^k\) 把基底變化補償掉,結果是真正張量。
- Christoffel 符號是基底變化率的分解係數,可由度量唯一算出(相容聯絡下)。
- 極座標: \(\Gamma^r_{\theta\theta} = -r\) 、 \(\Gamma^\theta_{r\theta} = 1/r\) ;球面: \(\Gamma^\theta_{\phi\phi} = -\sin\theta\cos\theta\) 、 \(\Gamma^\phi_{\theta\phi} = \cot\theta\) 。
- 直角座標 \(\Gamma \equiv 0\) :聯絡符號是座標效應,但其空間變化模式承載曲率資訊。
練習
- 對極座標手工推導 \(\Gamma^r_{\theta\theta} = -r\) (從 \(\partial_\theta \mathbf{e}_\theta = (-r\cos\theta, -r\sin\theta) = -r\,\mathbf{e}_r\) 出發),再與 SymPy 結果對照。
- 用 SymPy 驗證: \(\nabla_j(\cos\theta)\) ——把常數向量場 \(\mathbf{v} = (1, 0)\) (直角)換算成極座標分量後,計算其協變導數,結果應為零(向量場處處相同)。
- 圓柱面參數化 \((\cos\phi, \sin\phi, z)\) ,求其度量與全部 Christoffel 符號。你應得到全零——說明什麼?(提示:圓柱局部上是平面。)
- 在球面上取向量場恒沿經線( \(v = (1, 0)\) ),計算 \(\nabla_\phi v^\phi = \Gamma^\phi_{\phi\phi} = 0\) 但 \(\nabla_\phi v^\theta = \partial_\phi v^\theta = 0\) ,而 \(\nabla_\theta v^\phi\) 非零,解釋其幾何意義。
- (挑戰)證明公式:由「 \(\nabla_k g_{ij} = 0\) 」解出 \(\Gamma\) ,即把三條方程對 \((ij), (jk), (ki)\) 相加減,重推 Christoffel 公式。