08.2 Ricci 張量與純量曲率#
本節目標#
- 理解 Ricci 張量 \(R_{jl}\) 的體積偏差意義:它量測「小體積相對於歐氏空間的偏差」。
- 定義純量曲率 \(R = g^{jl}R_{jl} = R^j{}_j\) ,並驗證球面給出 \(R = 2/r^2\) 。
- 澄清一個常見誤解: \(R=0\) 不代表空間平坦;Riemann 張量比純量曲率豐富得多。
- 學會高維的度規收縮技術: \(R_{jl} = g^{ik}R_{ikjl}\) 適用於任意維度。
- 用 SymPy 計算球面與環面的 Ricci 與 \(R\) ,並整理非零分項表。
- 動手實驗:視覺化 Ricci 流的直覺—— \(R>0\) 的區域會在流下收縮。
Ricci 的意義:體積偏差#
第 8.1 節把曲率彙整成四階的 Riemann 張量;我們需要更精簡的量。取一點 \(p\) 與單位向量 \(\mathbf{v}\) ,把 Riemann 用 \(\mathbf{v}\) 壓兩次:
更精確的敘述是:沿 \(\mathbf{v}\) 方向切出的細小測地柱體,其體積與歐氏空間中同形柱體體積的相對偏差,由 \(\operatorname{Ric}(\mathbf{v},\mathbf{v})\) 控制。所以:
- \(\operatorname{Ric}(\mathbf{v},\mathbf{v}) < 0\) :該方向的體積膨脹(如馬鞍面)。
- \(\operatorname{Ric}(\mathbf{v},\mathbf{v}) > 0\) :該方向的體積收縮(如球面)。
- 在 2 維: \(\operatorname{Ric}_{jl} = K\,g_{jl}\) ,Ricci 就是 Gauss 曲率乘上度量,沒有新資訊。
- 在 \(n \geq 3\) :Ricci 是「方向平均後的截面曲率」,已丟失部分 Riemann 資訊。
純量曲率 \(R = R^j{}_j = \frac{2}{r^2}\) (球面)#
把 Ricci 用逆度量再壓一次,得純量曲率:
以球面為例,該面是 \(2\) 維常曲率空間, \(\operatorname{Ric} = K g = \frac{1}{r^2}g\) ,所以
注意分子是維度 \(n\) :常曲率空間通式為 \(R = n(n-1)K\) 。
畫出 \(R\) 對 \(r\) 的關係(用 Matplotlib),可以直觀看到「球越小越彎」:
import numpy as np
import matplotlib.pyplot as plt
r = np.linspace(0.5, 3, 200)
plt.plot(r, 2/r**2, label=r'$R = 2/r^2$ (sphere)')
plt.axhline(0, color='gray', lw=0.8)
plt.xlabel('radius $r$')
plt.ylabel('scalar curvature $R$')
plt.legend(); plt.title('Scalar curvature of a sphere')
plt.show()
關鍵澄清: \(R = 0\) 不等於平坦#
這是初學者最常踩的坑。純量 \(R\) 是把 \(n^2\) 個 Ricci 分量加總成一個數,把 \(n^2(n^2-1)/12\) 個 Riemann 分量濃縮成一個數——丟失的資訊非常可觀。三個層級的對照:
| 張量 | 獨立分量(4 維) | 判定平坦? |
|---|---|---|
| Riemann \(R_{\mu\nu\rho\sigma}\) | \(20\) | 若 \(R_{\mu\nu\rho\sigma}\equiv 0\) 才是內蘊平坦 |
| Ricci \(R_{\mu\nu}\) | \(10\) | \(R_{\mu\nu}\equiv 0\) 仍可能不平坦(真空但非平) |
| 純量 \(R\) | \(1\) | \(R=0\) 幾乎什麼都没說 |
分類學上的反例:在 \(4\) 維時空中,Schwarzschild 解的真空區域滿足 \(\operatorname{Ric} \equiv 0\) (因此 \(R\equiv 0\) ),但 Riemann 張量不為零——時空仍然彎曲。這是「純量歸零但張量不歸零」最著名的例子;引力波同理,曲率呈波狀分布而 \(R \equiv 0\) 。更基本的原因:純量 \(R\) 在 2 維恰好等價於全部曲率(因為 \(R = 2K\) ),但這是 \(2\) 維的特權; \(3\) 維以上立刻失效(順帶一提, \(3\) 維成立的是反過來的特權: \(\operatorname{Ric}\) 決定 Riemann)。更進一步,Ricci-flat 但非平坦的 K3 曲面與 Calabi–Yau 流形連 Ricci 都歸零,只有四階的 Riemann 存活。
口訣:Riemann ⊃ Ricci ⊃ R。壓縮方向不可逆;「純量為零」是最弱的平坦聲明。
高維的度規收縮法#
在 \(n\) 維,壓縮一律透過逆度量:
注意張量指標的位置約定要一致(我們的 \(R^i{}_{jkl}\) 中, \(i\) 升、其餘降),否則容易出現「壓錯對」的符號錯誤。檢查方法:對已知答案的空間(球面)先跑一遍驗證 pipeline。
SymPy 計算球面與環面的 Ricci 與 \(R\)#
第 8.1 節的 pipeline(metric → Gamma → Riemann → Ricci)可以直接沿用。這裡給出完整的兩案例計算:
案例 A:球面 \(g = \mathrm{diag}(r^2,\ r^2\sin^2\theta)\)
案例 B:平坦環面 \(g = \mathrm{diag}(1,\ 1)\) (參數 \(u,v\in[0,2\pi)\) ;這是內蘊平坦的環面,不是嵌入 \(\mathbb{R}^3\) 的甜甜圈)
import sympy as sp
def full_pipeline(g, coords, name):
N = len(coords)
g_inv = g.inv()
Gamma = {}
for i in range(N):
for j in range(N):
for k in range(N):
e = sp.simplify(sp.Rational(1,2)*sum(
g_inv[i,m]*sp.diff(g[j,k], coords[m]) for m in range(N)))
if e != 0:
Gamma[(i,j,k)] = e
# Riemann (up-front index i)
Rup = {}
for i in range(N):
for j in range(N):
for k in range(N):
for l in range(N):
e = sp.simplify(
sp.diff(Gamma.get((i,j,l),0), coords[k])
- sp.diff(Gamma.get((i,j,k),0), coords[l])
+ sum(Gamma.get((i,k,m),0)*Gamma.get((m,j,l),0) for m in range(N))
- sum(Gamma.get((i,l,m),0)*Gamma.get((m,j,k),0) for m in range(N)))
if e != 0:
Rup[(i,j,k,l)] = e
# 降低一個指標: R_{ajkl} = g_{am} R^m_{jkl}
Rdown = {}
for (i,j,k,l), v in Rup.items():
for a in range(N):
w = sp.simplify(sum(g[a,m]*Rup.get((m,j,k,l),0) for m in range(N)))
if w != 0:
Rdown[(a,j,k,l)] = w
# Ricci: R_{jl} = R^i_{j i l} = g^{im} R_{m j i l}
Ricci = sp.zeros(N,N)
for j in range(N):
for l in range(N):
Ricci[j,l] = sp.simplify(sum(Rup.get((i,j,i,l),0) for i in range(N)))
# 純量
Rsc = sp.simplify(sum(g_inv[j,l]*Ricci[j,l] for j in range(N) for l in range(N)))
print(f"=== {name} ===")
print("Ricci =", Ricci)
print("R =", Rsc)
print("Riemann 獨立非零分量:", len(Rup))
return Rup, Ricci, Rsc
th, u, v = sp.symbols('theta u v', real=True)
r = sp.symbols('r', positive=True)
gs = sp.Matrix([[r**2, 0], [0, r**2*sp.sin(th)**2]])
full_pipeline(gs, (th, sp.Symbol('phi')), "球面")
gt = sp.eye(2)
full_pipeline(gt, (u, v), "平坦環面")
非零分項表
| 空間 | Riemann 獨立分量 | Ricci 非零項 | \(R\) |
|---|---|---|---|
| 球面(半徑 \(r\) ) | \(1\) : \(R_{\theta\varphi\theta\varphi}=r^2\sin^2\theta\) | \(\operatorname{Ric}_{\theta\theta} = 1\) , \(\operatorname{Ric}_{\varphi\varphi} = \sin^2\theta\) | \(\dfrac{2}{r^2}\) |
| 平坦環面 | \(0\) | 無 | \(0\) |
| 標準嵌入環面( \(\mathbb{R}^3\) 甜甜圈) | \(1\) | 兩個對角項,隨 \(u,v\) 變號 | 特定區域正、特定區域負 |
注意標準嵌入環面(甜甜圈)的有趣結論:外圈側 \(K>0\) ,內圈側 \(K<0\) ,因此純量曲率在曲面上是變號函數。
動手實驗:視覺化 Ricci 流的概念#
Ricci 流方程
的直覺: \(\operatorname{Ric}\) 正比於度量時(常曲率),解是 \(g(t) = (1 - 2Kt)\,g(0)\) ——正曲率的面會收縮,負曲率的面會擴張。Poincaré 猜想的證明核心正是靠這條流把任意閉 3 維流形「修剪」成球。
用純數值視覺化收縮效應:
import numpy as np
import matplotlib.pyplot as plt
# 一維圓環的卡通版: 半徑 a(t) 滿足 da/dt = -2K a = -2*(1/a^2)*a = -2/a^2
t = np.linspace(0, 0.4, 200)
# 解析解: a(t)^3 = a0^3 - 6t
a0 = 1.0
a = (a0**3 - 6*t)**(1/3)
plt.plot(t, a, label=r'$a(t) = (a_0^3 - 6t)^{1/3}$')
plt.axvline(a0**3/6, color='r', ls='--', label='singular time $t=a_0^3/6$')
plt.xlabel('$t$'); plt.ylabel('radius $a(t)$')
plt.legend(); plt.title('Ricci flow shrinks positive curvature')
plt.show()
觀察:半徑在有限時間 \(t = a_0^3/6\) 收縮到零(奇異點),這正是曲面演化中出現「頸縮」與「手術」(surgery)的數學根源。
小結與練習#
本節重點
- Ricci \(\operatorname{Ric}_{jl}\) 是 Riemann 的第一道壓縮,量的是方向性體積偏差。
- 純量曲率 \(R = g^{jl}\operatorname{Ric}_{jl}\) 是第二道壓縮;常曲率空間 \(R = n(n-1)K\) ,球面 \(R = 2/r^2\) 。
- \(R = 0\) 不代表平坦:判平坦必須回到 Riemann 張量本身; \(\operatorname{Ric}=0\) (Ricci-flat)甚至都有非平坦範例(Schwarzschild 真空區、K3、Calabi–Yau)。
- 高維壓縮統一用 \(g^{ik}R_{ikjl}\) 與 \(g^{jl}R^i{}_{jil}\) 。
- SymPy pipeline 可以直接擴充算 Ricci 與 \(R\) ,球面給 Einstein manifold \(\operatorname{Ric} = \frac{1}{r^2}g\) 。
練習
- 用本節 pipeline 計算嵌入甜甜圈 \(X(u,v) = ((a+b\cos u)\cos v, (a+b\cos u)\sin v, b\sin u)\) 的 metric,找出 \(R\) 變號的曲線。
- 證明:2 維時 \(\operatorname{Ric}_{jl} = K g_{jl}\) ,因此 \(R = 2K\) 。(提示: \(2\) 維 Riemann 只有一個獨立分量。)
- 對 \(g = e^{2\phi(x,y)}(dx^2+dy^2)\) 推導 \(R = -2e^{-2\phi}\Delta\phi\) (保角變換公式),並用 SymPy 驗證 \(\phi = \log\frac{2r}{1+r^2}\) (球極投影)給出 \(R = 2\) 。
- 挑戰:構造一個 \(R \equiv 0\) 但 \(\operatorname{Ric} \neq 0\) 的對稱 \(2\times 2\) 跡零矩陣當玩具例(這不是真 metric,只是說明「壓縮丟資訊」的代數遊戲)。