07.3 Levi-Civita 聯絡#
本節目標#
- 認識度規幾何的「標準配備」:Levi-Civita 聯絡——唯一保度量且無撓的聯絡。
- 理解「唯一性」為什麼重要:它使「度量 → 求導 → 測地線」成為完全確定的 pipeline。
- 用 SymPy 實作從度量生成 \(\Gamma\) (07.2 已寫的函式直接沿用),並驗證度量相容性 \(\nabla_k g_{ij} = 0\) 。
- 建立完整流程:給度量 → 算聯絡 → 檢查相容 → 準備求測地線(07.4 用)。
- 實驗改變度量的局部場效應:連續修改度量參數,看聯絡如何「生病」。
直覺:多種可能的「求導方式」?#
a 07.2 我們把協變導數定義為 \(\nabla_j v^i = \partial_j v^i + \Gamma^i_{jk} v^k\) ,而 \(\Gamma\) 是由「基底變化」分解出來的。但若有人換一組 \(\Gamma\) ,協變導數一樣「形式上成立」——問題來了:
在一個流形上,究竟有多少種合理的「求導方式」?
答案是:很多。可以定義 \(\tilde{\nabla}_j v^i = \nabla_j v^i + T^i_{jk} v^k\) (加任意一個對 \(j, k\) 反對稱的張量 \(T\) ——撓率),仍是合法聯絡。但其中有一個最特殊:
Levi-Civita 聯絡(號稱「自然聯絡」)由兩個要求唯一刻畫:
- 保度量(metric compatibility):對任何向量場 \(u, v\) ,沿任何方向 \(w\) 平行移動時內積不變:
分量形式等價於
- 無撓: \(\Gamma^i_{jk} = \Gamma^i_{kj}\) (對稱下標),對應微分幾何中「交換偏導」的熟悉性質。
定理(Levi-Civita,Fundamental Theorem of Riemannian Geometry):同時滿足這兩條的聯絡恰有一個,且就是 07.2 的 Christoffel 符號。這不是巧合——07.2 從「基底變化」推出 \(\Gamma\) ,本節從「兩大公理」推出同一個 \(\Gamma\) :兩條路走向同一座橋。
本質:為什麼 「保度量 + 無撓」如此自然?#
保度量就是「剛性量尺」:用 SymPy 類比,若把向量想成剛桿,平行移動不許伸縮、不許改變相對夾角。幾何直覺上,黎曼幾何的度量是終極 道具,一個會「扭曲量尺」的聯絡與度量互相打架。無撓則是「局域無扭旋」:在極小範圍內平行移動兜一圈,向量不會多轉出一個額外角度(撓率不為零的幾何上會)。兩者合起來,Levi-Civita 聯絡就是把度量「忠實搬運」的最自然方式。
最深刻的意義:有了 Levi-Civita 聯絡,測地線、曲率、平行移動全部由度量唯一決定。這就是「metric geometry」的精義:只要給 \(g\) ,一切幾何隨之確定。
SymPy 實作:metric → connection → 驗證相容#
沿用 07.2 的 metric_to_christoffel,加上相容性檢查:
import sympy as sp
def christoffel(g, coords):
"""由度量算 Christoffel 符號,回傳 {(i,j,k): expr}"""
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(sp.Rational(1,2)*sum(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
def gamma_full(G, coords):
"""把 G 擴張成 n*n*n 的完整 array(缺席者補 0)"""
n = len(coords)
arr = sp.MutableDenseNDimArray.zeros(n, n, n)
for (i, j, k), v in G.items():
arr[i, j, k] = v
arr[i, k, j] = v # 對稱下標
return arr
def check_metric_compatibility(g, G3, coords):
"""計算 ∇_k g_ij = ∂_k g_ij − Γ^l_ki g_lj − Γ^l_kj g_il,全分量應為 0"""
n = len(coords)
bad = []
for k in range(n):
for i in range(n):
for j in range(n):
expr = sp.diff(g[i, j], coords[k])
for l in range(n):
expr -= G3[l, k, i]*g[l, j]
expr -= G3[l, k, j]*g[i, l]
e = sp.simplify(expr)
if e != 0:
bad.append(((k, i, j), e))
return bad
pipeline 跑一遍:球面#
th, ph = sp.symbols('theta phi', real=True, positive=True)
g_sphere = sp.diag(1, sp.sin(th)**2)
G = christoffel(g_sphere, [th, ph])
G3 = gamma_full(G, [th, ph])
print("非零 Γ:", G)
print("相容性違規:", check_metric_compatibility(g_sphere, G3, [th, ph]))
# 應印出 []:Levi-Civita 聯絡與度量完全相容 ✓
對換一組「不保度量」的聯絡做對照#
故意把 \(\Gamma\) 修改(比如砍掉某個非零符號),再跑 check_metric_compatibility,將看到一堆非零違規——證明那組 \(\Gamma\) 不是 Levi-Civita 聯絡,它會在搬運向量時「偷伸縮」。
G_bad = dict(G)
G_bad.pop((1, 0, 1), None) # 刪掉 Γ^φ_θφ
G3_bad = gamma_full(G_bad, [th, ph])
print(check_metric_compatibility(g_sphere, G3_bad, [th, ph])) # 非空 ✓
「唯一」的驗證:兩人情同 一個答案#
一個重要交叉檢查:度規幾何聯絡的唯一性可以用一個實驗證明——把 \(\Gamma\) 的公式改成
( \(A\) 為任意張量),要求 \(\nabla_k g_{ij} = 0\) 仍成立,用 SymPy 解 \(A\) 應得 \(A \equiv 0\) 。做法:在極座標上,令 \(A = A(t)\) 為符號、寫下 \(\nabla_k g_{ij}= 0\) 的分量方程組並 sp.solve。你會發現解是平凡的——兩大公理的交集只有一點。
為什麼「測地線 = 測量的-measure 地線」?#
預告 07.4:聯絡確定後,測地線(「局部最直的路」)可以用 \(\nabla_{\dot\gamma}\dot\gamma = 0\) 定義——意即「自身沿自身做協變微分為零」。由於 Levi-Civita 的保度量性,這條曲線上 向量自身沿自身移動時長度不變、且是「不可能再直」的極值化路徑——同時可用 變分法證明它最小化能量 \(E = \int g_{ij}\dot\gamma^i \dot\gamma^j\) 。兩種定義(「直」與「極值」)在 Levi-Civita 聯絡下重合,這是此聯絡名符其實 的深層理由。
動手實驗#
實驗 1:改變度量的局部場效應
考量一族依參數 \(a\) 變化的度量 \(g_a = \mathrm{diag}(1, a\sin^2\theta\sqrt{\phantom{x}})\) (其實就是球面縮放:半徑 \(a\) 的球):
a = sp.Symbol('a', positive=True)
g_a = sp.diag(1, a**2*sp.sin(th)**2)
G_a = christoffel(g_a, [th, ph])
for (i, j, k), v in sorted(G_a.items()):
print((i, j, k), sp.simplify(v))
觀察: \(\Gamma^\phi_{\theta\phi} = \cot\theta\) 與半徑無關(經線收攏率是純角度幾何),但 \(\Gamma^\theta_{\phi\phi} = -\sin\theta\cos\theta\) 也沒有 \(a\) —— 半徑不進入 \((\theta, \phi)\) 座標的 Christoffel 符號。這再次呼應 07.1 的教訓:座標內的公式看不到絕對尺度,只有對外比較(如嵌入 \(\mathbb{R}^3\) )才看得到。試把度量改成椭球 \(g = \mathrm{diag}\) 形式,讓 \(\Gamma\) 出現真正的參數依賴。
實驗 2:相容性也可正向驗證
對球面直接計算 \(\partial_k g_{ij}\) 與 \(\Gamma\) 二項的差,逐 分量印出,親眼看到每個都是 0(比如 \(\partial_\theta g_{\phi\phi} = 2\sin\theta\cos\theta\) 恰被 \(2\Gamma^\phi_{\theta\phi} g_{\phi\phi}\) 捕回)。特別解釋本例非零的 \(\partial_\theta g_{\phi\phi}\) 如何被聯絡「補回零」。
實驗 3:雙曲平面
用上半平面度量 \(g = \dfrac{dx^2 + dy^2}{y^2}\) ( \(y > 0\) ),跑整個 pipeline:算 \(\Gamma\) 、驗證 \(\nabla g = 0\) 。你會得到 \(\Gamma^x_{xy} = \Gamma^y_{yy} = -1/y\) 、 \(\Gamma^y_{xx} = 1/y\) 等符號——這是負曲率幾何的第一 個計算實例。
實驗 4(挑戰):撓率不為零的聯絡
在平面上定義 \(\Gamma^x_{xy} = 1\) (其餘為零),計算它對應聯絡的撓率張量 \(T^i_{jk} = \Gamma^i_{jk} - \Gamma^i_{kj}\) ,確認非零,並計算 \(\nabla g\) ,看它違反相容性到什麼程度。
小結與練習#
本節重點
- 聯絡有很多;Levi-Civita 聯絡由「保度量 + 無撓」兩公理唯一確定。
- 保度量即 \(\nabla_k g_{ij} = 0\) :平行移動不改變內積;無撓即 \(\Gamma^i_{jk} = \Gamma^i_{kj}\) 。
- 07.2 從基底變化推出 \(\Gamma\) ,本節從公理推出同一個 \(\Gamma\) ——兩條路殊途同歸。
- Metric → connection → verification pipeline 是整章的工程骨架,可套用到任何度量。
- 有了 Levi-Civita 聯絡,測地線與曲率都是度量的內在產物,不需要外面世界。
練習
- 對球面逐分量手算 \(\nabla_\theta g_{\phi\phi}\) ,親自驗證它為零。
- 對椭圓拋物面參數化度量(參考 02 章)、跑 pipeline,列出非零 \(\Gamma\) 並驗證相容性。
- 在平面極座標上令 \(\hat\Gamma^\theta_{\theta r} = \Gamma^\theta_{\theta r} + c/r\) ( \(c\) 常數),計算 \(\nabla_k g_{ij}\) ,找出 \(c\) 為何值時相容性破壞最小(應得 \(c = 0\) )。
- 證明:保度量 + 無撓 \(\Rightarrow\) \(\Gamma\) 的 Christoffel 公式。(提示:把 \(\nabla_k g_{ij} = 0\) 中的 \(\Gamma\) 換成 \(\hat\Gamma = \Gamma + A\) ,解線性方程組,得 \(A^i_{jk}\) 對 \(j,k\) 反對稱且為零。)
- (挑戰)用
sympy.diffgeom模組重做球面 pipeline:定義Manifold、Patch、CoordSystem、metric並呼叫TensorProduct、metric_to_Christoffel_2nd,對照自建矩陣法的結果。