06.4 度量張量#
本節目標#
- 理解 度量張量 \(g = \sum g_{ij}\, dx^i \otimes dx^j\) :在每個切空間上給一個內積
- 說清 \(ds^2 = g_{ij}\, dx^i dx^j\) 的意義:測量彎曲世界裡的無窮小長度
- 用 SymPy
diffgeom計算球面、圓柱、雙曲面的度量,呼應第 2 章的第一基本形式 - 學會由度量計算曲線長度: \(L = \int \sqrt{g_{ij}\, \dot{x}^i \dot{x}^j}\ dt\)
- 理解 等距(isometry):兩個度量之間存在保持長度的座標變換
- 動手實驗:在球面上用度量算大圓弧長,與已知公式對照
直覺:度量是在每個點放一把「尺」#
第 6.3 節說:切空間 \(T_pM\) 是在點 \(p\) 附近的「直線世界」。但有一個問題沒解決:在 \(T_pM\) 裡,兩個切向量的內積是多少?向量多長?角度多大?
在 \(\mathbb{R}^n\) 我們用標準內積 \(u \cdot v = \sum u^i v^i\) 。但在彎曲的流形上,沒有天生的「標準」——每個點可以有自己的量法。度量張量 就是這把尺:
每個點 \(p\) 各一把尺,合起來就是一個 對稱、正定 的 \((0,2)\) -張量場:
類比:一張世界地圖。格網線在赤道附近間距合理,但在極區被壓縮變形。要知道「地圖上一小格實際有多長」,必須查表——這張表就是度量 \(g_{ij}\) 。彎曲空間中的「尺」隨位置變化,度量就是把每個位置的尺都記下來的完整檔案。
\(ds^2\) :無窮小長度的配方#
記號 \(ds^2\) 是物理與幾何的通用語言:
它的意義:一個無窮小位移 \((dx^1, \dots, dx^n)\) 的 長度平方。例如:
- 平面直角座標: \(ds^2 = dx^2 + dy^2\) (畢氏定理)
- 平面極座標: \(ds^2 = dr^2 + r^2\, d\theta^2\) (沿 \(\theta\) 走一小步,實際長度是 \(r\, d\theta\) ,不是 \(d\theta\) )
- 球面(半徑 \(R\) ): \(ds^2 = R^2\, d\theta^2 + R^2 \sin^2\theta\, d\phi^2\)
這就是第 2 章第一基本形式的回歸。當時我們對參數曲面 \(X(u, v)\) 計算 \(E = X_u \cdot X_u\) 、 \(F = X_u \cdot X_v\) 、 \(G = X_v \cdot X_v\) ,寫出 \(ds^2 = E\,du^2 + 2F\,du\,dv + G\,dv^2\) 。現在用張量語言重看: \((g_{ij}) = \begin{pmatrix} E & F \\ F & G \end{pmatrix}\) 。第一基本形式就是嵌入曲面上的度量——不是新東西,是同一件事的座標無關版本。
度量決定了內積,因此決定:曲線長度、曲面面積、角度、體積,以及(透過第 7 章的聯絡)平行移動與測地線。Riemann 幾何的全部素材,都從這一個 \((0,2)\) -張量出發。
三個經典曲面的度量#
球面(半徑 \(R\) )#
參數化 \(X(\theta, \phi) = (R\sin\theta\cos\phi,\ R\sin\theta\sin\phi,\ R\cos\theta)\) :
沿緯度線走 \(d\phi\) 這麼多「座標距離」,實際長度是 \(R\sin\theta\, d\phi\) ——在極區( \(\theta \to 0\) )被壓到很小,這正是地圖變形的源頭。
圓柱面(半徑 \(R\) )#
參數化 \(X(u, v) = (R\cos u,\ R\sin u,\ v)\) :
係數全是常數!這暗示圓柱 ** 本質上是平的**:把它攤開就是一片長方形紙。第 2 章我們算過圓柱的高斯曲率為 \(0\) ,這裡從度量結構再次看到證據。
雙曲面(Poincaré 上半平面模型)#
雙曲幾何最方便的表法是 上半平面 \(y > 0\) 帶度量:
底盤還是平的( \(dx^2 + dy^2\) ),但除以 \(y^2\) :越靠近 \(y = 0\) ,「同一個座標步長」的實際長度越 大——無窮遠就在 \(y = 0\) 的方向。這個度量讓整個上半平面擁有常數負曲率 \(-1\) (第 8 章驗證)。
SymPy:用 diffgeom 建立度量#
sympy.diffgeom 允許自訂座標卡與張量場。我們在 \(\mathbb{R}^3\) 的球面座標卡上構造「限制到球面上的度量」(設 \(\theta, \phi\) 為球面參數):
from sympy import symbols, sin, cos, simplify, Matrix
from sympy.diffgeom import Manifold, Patch, CoordSystem, TensorProduct
# 建立一個 2 維流形,座標 (theta, phi)
M = Manifold('S2', 2)
patch = Patch('patch', M)
theta, phi = symbols('theta phi', real=True)
cs = CoordSystem('spherical', patch, [theta, phi])
dtheta, dphi = cs.base_oneforms()
e_th, e_ph = cs.base_vectors()
R = symbols('R', positive=True)
# 度量張量:g = R² dθ⊗dθ + R² sin²θ dφ⊗dφ
g = R**2 * TensorProduct(dtheta, dtheta) \
+ R**2 * sin(theta)**2 * TensorProduct(dphi, dphi)
# 讀出分量:g_ij = g(e_i, e_j)
# 注意:多項相加的張量物件不能直接呼叫,需逐項用 rcall 再求和
def metric_component(g, v1, v2):
if g.func == TensorProduct:
return g.rcall(v1, v2)
s = 0
for term in g.args:
c, tp = term.as_coeff_Mul()
s += c * tp.rcall(v1, v2)
return simplify(s)
g11 = metric_component(g, e_th, e_th)
g12 = metric_component(g, e_th, e_ph)
g22 = metric_component(g, e_ph, e_ph)
G = Matrix([[g11, g12], [g12, g22]])
print(G)
# Matrix([[R**2, 0], [0, R**2*sin(theta)**2]])
# 把分量中的 BaseScalarField 換成普通符號,方便後續積分
th_s, ph_s = symbols('th_s ph_s', real=True)
G_plain = G.subs([(theta, th_s), (phi, ph_s)])
print(G_plain)
對圓柱與雙曲面,做法完全相同,只是換分量:
u, v = symbols('u v', real=True)
# 圓柱面:g = R² du⊗du + dv⊗dv(係數常數 → 平坦的線索)
g_cyl = Matrix([[R**2, 0], [0, 1]])
# 雙曲上半平面:g = (dx² + dy²)/y²
y_coord = symbols('y', positive=True)
g_hyp = Matrix([[1, 0], [0, 1]]) / y_coord**2
print(g_cyl, '\n', g_hyp)
觀察重點:度量完全由分量矩陣 \(G = (g_{ij})\) 決定;
TensorProduct構造出的對象呼叫g(e_i, e_j)就能取分量。對稱性( \(g_{12} = g_{21}\) )由構造方式保證。
由度量算曲線長度#
曲線 \(c(t) = (x^1(t), \dots, x^n(t))\) , \(t \in [a, b]\) ,其速度 \(\dot{c} = \sum \dot{x}^i \frac{\partial}{\partial x^i}\) 。用度量量它的長度平方:
於是弧長:
這是第 1 章 \(L = \int \|\dot{c}\|\ dt\) 的推廣:把歐氏內積換成 \(g\) 。被開方的量 \(\sum g_{ij}\dot{x}^i\dot{x}^j\) 恆為正(正定性),所以積分良定義。第 7 章將看到:使這個泛函取極值的曲線就是 測地線 ——「度量決定什麼是直線」。
等距:兩個度量是同一個幾何#
定義:光滑映射 \(f : M \to N\) 若保持度量(對所有切向量 \(u, v\) 有 \(g_N(f_* u, f_* v) = g_M(u, v)\) ),稱為 等距映射;若還是雙射,稱為 等距(isometry)。
直覺:等距就是「不拉伸、不撕裂」的變換。兩個等距的流形,縱使座標寫法天差地遠,幾何完全相同——長度、角度、面積、測地線全部一致。
經典例子:圓柱面與平面(上一段已埋伏筆)。把圓柱攤開: \((R\cos u, R\sin u, v) \mapsto (Ru, v)\) ,圓柱度量 \(R^2 du^2 + dv^2\) 變成平面度量 \(dx^2 + dy^2\) (令 \(x = Ru\) )。分量矩陣在變換前後相同 —— 這就是「攤開」的嚴格意義。高斯曲率在等距下不變(Gauss 的 Theorema Egregium,第 2.2 節),所以球面( \(K = 1/R^2\) )與平面( \(K = 0\) )不可能等距——這是地圖製作的根本困境:任何世界地圖都必須在某處犧牲長度、角度或面積。
操作層面:給定座標變換 \(\varphi\) ,度量分量的變換規則是:
若變換後 \(g' = g\) ,就是等距。SymPy 可以直接做這個矩陣運算(見實驗)。
動手實驗:在球面上算大圓弧長#
實驗:赤道是球面上的大圓,已知周長 \(2\pi R\) 。我們不使用這個已知答案,而是 從度量出發 積分,看是否重現。
from sympy import symbols, sin, cos, pi, simplify, sqrt, integrate, Matrix, Rational
R, t = symbols('R t', positive=True)
th = symbols('theta', nonnegative=True)
# 球面度量分量
g = Matrix([[R**2, 0], [0, R**2*sin(th)**2]])
# ① 赤道:theta = pi/2(常數),phi = t(t: 0 → 2π)
speed_sq = (g * Matrix([0, 1])).dot(Matrix([0, 1])) # g_ij ẋⁱ ẋʲ
speed_sq_eq = simplify(speed_sq.subs(th, pi/2)) # R²
L_equator = integrate(sqrt(speed_sq_eq), (t, 0, 2*pi))
print('赤道長度 =', L_equator) # 2*pi*R ✅
# ② 緯度圈 theta = π/3(小圓,不是大圓)
speed_sq_lat = simplify(speed_sq.subs(th, pi/3)) # 3R²/4
L_lat = integrate(sqrt(speed_sq_lat), (t, 0, 2*pi))
print('緯度圈長度 =', L_lat) # sqrt(3)*pi*R
print('理論值 2πR sin(π/3) =', 2*pi*R*sin(pi/3)) # sqrt(3)*pi*R ✅
除錯提示:若第 ② 步的兩個值不同,回頭檢查
speed_sq的構造——(g * ẋ).dot(ẋ)才是 \(g_{ij}\dot{x}^i\dot{x}^j\) ,不要忘了速度向量本身。赤道 \(\theta = \pi/2\) 時 \(\sin^2\theta = 1\) ,速度是 \(R\) ,積分得 \(2\pi R\) 。
實驗進階:等距檢驗——圓柱攤開成平面
from sympy import symbols, pi, cos, sin, simplify, Matrix
R = symbols('R', positive=True)
u, v = symbols('u v', real=True)
# 圓柱參數化 X(u,v) = (R cos u, R sin u, v),計算第一基本形式
X = Matrix([R*cos(u), R*sin(u), v])
Xu, Xv = X.diff(u), X.diff(v)
E = simplify(Xu.dot(Xu)) # R²
F = simplify(Xu.dot(Xv)) # 0
G = simplify(Xv.dot(Xv)) # 1
print('圓柱度量分量:', E, F, G) # R² 0 1
# 攤開映射:(u, v) → (x, y) = (Ru, v),平面度量 E'F'G' = (1, 0, 1)
# 若令 x = Ru,則 du = dx/R,圓柱度量 R² du² + dv² = dx² + dy² ✅
x, y = symbols('x y', real=True)
# 用變換規則驗證:u = x/R, v = y
g_cyl = Matrix([[R**2, 0], [0, 1]])
J = Matrix([[u.subs(u, x/R).diff(x), 0], [0, 1]]) # ∂(u,v)/∂(x,y)
g_new = simplify(J.T * g_cyl * J)
print('變換後的度量:\n', g_new)
# Matrix([[1, 0], [0, 1]]) —— 與平面標準度量相同 → 等距!
觀察重點: 1. 從度量積分得到赤道長 \(2\pi R\) ,與幾何常識一致 —— 度量確實編碼了「尺」。 2. 緯度圈長度 \(2\pi R\sin\theta\) 隨緯度縮短,這是球面與平面不等距的直接後果。 3. 圓柱的度量分量是常數,攤開後與平面完全吻合 —— 它是平的;球面做不到,因為 \(K \neq 0\) 。
小結與練習#
小結
- 度量張量 \(g = \sum g_{ij}\, dx^i \otimes dx^j\) :在每個切空間給內積,是對稱正定的 \((0,2)\) -張量場。
- \(ds^2 = g_{ij}\, dx^i dx^j\) 是無窮小長度平方;第 2 章的第一基本形式 \((E, F, G)\) 就是它的分量。
- 球面 \(R^2(d\theta^2 + \sin^2\theta\, d\phi^2)\) 、圓柱 \(R^2 du^2 + dv^2\) (平坦)、雙曲上半平面 \((dx^2 + dy^2)/y^2\) 。
- 曲線長度 \(L = \int \sqrt{g_{ij}\dot{x}^i\dot{x}^j}\ dt\) :度量決定什麼是「直線」(測地線,第 7 章)。
- 等距 = 度量分量在座標變換下保持不變;球面與平面不等距,所以完美的世界地圖不存在。
練習
- 用本節程式碼計算半徑 \(R\) 的球面上、經線( \(\phi\) = 常數)從北極到南極的長度,確認答案是 \(\pi R\) (子午線長的一半)。
- 對雙曲度量 \(g = (dx^2 + dy^2)/y^2\) ,計算豎直線 \(x = 0\) 從 \(y = 1\) 到 \(y = 2\) 的長度: \(L = \int_1^2 dy/y = \ln 2\) 。用 SymPy 驗證,並思考:從 \(y = 1\) 走到 \(y = 0\) 的長度是多少?(答:無窮大—— \(y = 0\) 是無窮遠。)
- 驗證極座標與直角座標的度量互換:從 \(ds^2 = dr^2 + r^2 d\theta^2\) 出發,用變換規則( \(x = r\cos\theta\) 、 \(y = r\sin\theta\) )算出 \(ds^2 = dx^2 + dy^2\) 。
- (思考)Mercator 地圖保角(保角度)但不保面積。說明:保角意味著什麼?(提示:度量分量矩陣在變換後是原來的純量倍數 \(g' = \lambda(p)\, g\) ;這叫共形等距,比等距弱一階。)
- (進階)在球面度量上,驗證緯度圈 \(\theta = \theta_0\) 不是測地線(除赤道外):比較「沿緯度圈走」與「先沿大圓連接同兩端點」的長度。