6.2 黎曼幾何與曲率(1854 年)#
學習動機#
上一節我們看到:鮑耶與羅巴切夫斯基造出了「平行線有無窮多條」的雙曲世界,但兩人的幾何仍然把空間想像成一個均勻、平坦、向各方向無限延伸的「平面」——只是這個平面上的度量有些奇怪而已。真正的問題還在更深處:空間為什麼必須有唯一一種?為什麼不能是彎的、而且彎得每個地方都不一樣?
1854 年 6 月 10 日,27 歲的格丁根無俸講師候選人格奧爾格·弗里德里希·伯恩哈德·黎曼(Bernhard Riemann, 1826–1866)在格丁根大學哲學系進行了就職資格演講(Habilitationsvortrag),題目由推薦人高斯從三個備選題目中選出——高斯特意選了心理壓力最大的那個:《論作為幾何學基礎的假設》(Über die Hypothesen, welche der Geometrie zu Grunde liegen)。這場僅持續約一小時的演講幾乎沒有公式,卻在半世紀後成為愛因斯坦廣義相對論的數學基礎——正如愛因斯坦在紀念黎曼的文章中所說:「這是自非歐幾何誕生以來,數學與物理最深刻的一次相遇。」本節我們講清黎曼演講的思想脈絡,並用 SymPy 親手計算曲率。
1. 黎曼其人與 1854 年的就職演說#
1.1 背景:一場沒有聽懂大多數人的演講#
黎曼出生於漢諾瓦王國的牧師家庭,1846 年進入格丁根,1847–1849 年在柏林跟隨狄利克雷、雅可比、施泰納學習,1851 年博士論文《單複變函數的一般理論基礎》中首次提出黎曼曲面(Riemann surface)與黎曼球(Riemann sphere),導師正是高斯。
1854 年的就職演說有以下特點:
- 全程僅一個公式(度量 \(ds^2\) 的一處表示),其餘皆為概念性論述;
- 全文約 20 頁,死後才由戴德金(Dedekind)於 1868 年整理發表;
- 對像大部分是哲學系醫生與文化人士,僅高斯一人能完全看懂。
- 高斯聽完回來的路上對韋伯(Weber)說:「黎曼的思路極為深邃。」("Der Riemann hat einen tiefen Sinn.")
1.2 為何高斯選了那個題目?#
就職演說前,候選人要提交三個題目讓系主任選。黎曼本想報告電磁學題目,這是他熟悉且能快速準備的內容。但高斯親手替他選了「幾何基礎的假設」這個高斯本人埋藏了三十年(25+年)的問題。高斯選這個題目最具深意:他在用黎曼替自己說出不敢說的那個世界。
timeline
title 黎曼幾何前後
1827 : 高斯《曲面通論》:曲面的內蘊幾何與絕妙定理
1854.6.10 : 黎曼就職演講《論幾何基礎的假設》
1868 : 戴德金整理發表演講;同年貝特拉米發表第一篇非歐模型論文
1873 : 克利福德英譯演講,倡議「空間曲率在時間中變化」
1889 : 里奇–克爾巴斯特羅與列維–奇維塔建立張量演算法
1915.11 : 愛因斯坦用黎曼幾何寫下廣義相對論場方程1.3 黎曼演講的三步驟#
整篇演講可以拆成三步,每一步都是二十世紀幾何學的一章:
- 空間是流形(Mannigfaltigkeit)——拋棄「空間=歐氏三維」的先天假設;
- 幾何由度量決定——在流形上引入度量 \(ds^2\) ,戰爭是「如何測量」,而非「什麼形狀」;
- 曲率是內蘊的——空間可以局部彎曲,而彎曲由「二次形式」的曲率張量刻畫,不需要外部空間。
以下逐一展開。
2. 流形(Manifold):空間概念的解放#
2.1 高斯的內蘊視角回顧#
高斯 1827 年在曲面論中實現了一次關鍵跳躍:把曲面看作擁有自己幾何的世界,給定曲面上的座標 \((u,v)\) ,距離由第一基本形式
決定;曲率 \(K\) 完全由 \(E,F,G\) 計算而得——這就是高斯的絕妙定理(Theorema Egregium):高斯曲率是不依賴於嵌入方式的內蘊量。生活在球面上的二維生物,無需伸出第三維,就能量出自己世界是彎的(例如:三角形內角和 \(> \pi\) )。
2.2 黎曼的推廣:任意維、任意形#
黎曼把高斯的「二維曲面內蘊幾何」推廣成三階段:
- 第一步:定義一個流形——一個「局部像 \(\mathbb{R}^n\) 」的集合。也就是說,每個點附近都能夠用 \(n\) 個數字座標 \((x^1,\dots,x^n)\) 來標示,但整體形狀可以任意連接(像球面、環面,或未知的宇宙)。
- 第二步:兩個點之間沒有「預設距離」——必須由物理家.tim料費量來定義。這是哲學上的斷裂:空間沒有「先天的量」,距離是實實在在的事後費料。
- 第三步:給定度量之後,整個幾何(直線、圓、面積、曲率)隨之而來。不同的度量 → 不同的幾何。
用黎曼的原話:
「幾何學的假設的必要的後果……我們無法從我們的經驗中得到確定不移的真理,因為空間的概念必然只是某種概念的推廣……因此,唯有先建立形式的一般概念,才能斷定我們的世界符合這個還是那個原子式」
2.3 流形的三個直觀例子#
| 流形 | 局部座標 | 全域形狀 |
|---|---|---|
| 圓 \(S^1\) | 一個角度 \(\theta\) | 一維封閉「循環」 |
| 球面 \(S^2\) | 經緯度 \((\theta,\phi)\) | 二維封閉、正曲率 |
| 環面 \(T^2\) | \((\theta_1,\theta_2)\) | 二維封閉、部分正部分負(內蘊平均 0) |
Mannigfaltigkeit 在中文中一般譯作「流形」——「流」取自德文 fließen 的意象(各局部可以流動拼接),「形」即形狀。
3. 度量(metric):局部的畢氏定理#
在 \(n\) 維流形上一點附近,黎曼設想「距離的平方」是座標微分的二次形式
其中 \(g_{ij}(x)\) 是點的函數——這是黎曼最關鍵的一步:度量隨位置而變(在歐氏幾何中 \(g_{ij} = \delta_{ij}\) 恆定不變)。
- \(g\) 對稱: \(g_{ij} = g_{ji}\) ;
- \(g\) 正定:確保 \(ds^2 > 0\) (黎曼之後,洛倫茲度量 \(g\) 不定,時空距離可為負——這是 1908 年閔可夫斯基對黎曼幾何的推廣);
- 給定 \(ds^2\) 就能計算長度(沿曲線積分)、角度(由內積公式)、面積與體積( \(\sqrt{\det g}\,du\,dv\) )。
3.1 長度、角度、面積用 SymPy 做出來#
我們用一個簡單的非平面度量來驗證:設一個 2 維流形,
取 \(f(u,v) = u^2\) (均勻「錐形」度量)。計算過一條曲線的長度與區域的面積。
import sympy as sp
from sympy import *
u, v = symbols('u v', real=True)
# 定義度量:ds^2 = du^2 + u^2 dv^2 (其實這就是極座標!)
# g 矩陣
g = Matrix([[1, 0],
[0, u**2]])
# g 的行列式與面積元素
sqrtg = sqrt(g.det())
print("面積元素 sqrt(det g) =", sqrtg)
# 預期輸出: 面積元素 sqrt(det g) = Abs(u) → u (取正)
# 面積:半徑 3 的「圓盤」應為 pi*r^2/ (內積下極座標即圓的面積)
A = integrate(sqrtg, (v, 0, 2*pi), (u, 0, 3))
print("半徑 3 的圓面積 =", simplify(A))
# 預期輸出: 半徑 3 的圓面積 = 9*pi
# 注意:這個座標只是「偽非歐」——真正平面上的極座標。
# 接下來我們用一個真正有曲率的度量:球面。
接下來用真正的球面度量,計算長度與面積:
from sympy import *
theta, phi, R = symbols('theta phi R', positive=True)
# 半徑 R 的球面:
# ds^2 = R^2 dθ^2 + R^2 sin^2(θ) dφ^2
g_sphere = Matrix([[R**2, 0],
[0, R**2*sin(theta)**2]])
sqrtg = sqrt(g_sphere.det())
print("球面面積元素 =", sqrt(sqrtg**2)) # R^2 sin(theta)
print("球面總面積 =", integrate(sqrtg*(phi_dummy:=1), (phi,0,2*pi), (theta,0,pi)))
# 預期輸出: 4*pi*R**2
3.2 黎曼幾何的四種基本量#
| 量 | 公式 | 歐氏平面 | 單位球 \((g=R^2 metric)\) |
|---|---|---|---|
| 曲線長度 | \(\int \sqrt{g_{ij}\dot x^i \dot x^j}\,dt\) | $\int | \dot x |
| 兩向量夾角 | \(\cos\theta = \frac{g(u,v)}{\sqrt{g(u,u)g(v,v)}}\) | 普通內積 | 經度差 |
| 區域面積 | \(\int\!\!\int \sqrt{\det g}\,du\,dv\) | \(\int dx\,dy\) | \(R^2\) 倍「立體角」 |
| 高斯曲率 | 由 \(g\) 的二階導數 | \(0\) | \(1/R^2\) |
4. 高斯曲率:三種幾何的統一語言#
4.1 從「平行假設」到「曲率」#
黎曼在演講中把所有幾何按曲率統一:
- ** \(K = 0\) :歐氏(拋物型)幾何——過外點恰一條**平行線;
- ** \(K > 0\) :球面(橢圓型)幾何——過外點沒有**平行線(任何大圓都相交);
- ** \(K < 0\) :雙曲(雙曲型)幾何——過外點無窮多條**平行線。
換句話說:
三種非歐幾何的區別,不是「幾條平行線」的區別,而是「空間是什麼形狀」的區別。
三種幾何的直接比較:
| 命題 | 歐氏 \(K=0\) | 球面 \(K>0\) | 雙曲 \(K<0\) |
|---|---|---|---|
| 過外點的平行線 | 恰 1 | 0 | ∞ |
| 三角形內角和 | \(= \pi\) | \(> \pi\) | \(< \pi\) |
| 三角形面積 | 無關 | \(\propto\) 角盈 | \(\propto\) 角虧 |
| 圓周長(半徑 \(r\) ) | \(2\pi r\) | \(2\pi R\sin(r/R) < 2\pi r\) | \(2\pi R\sinh(r/R) > 2\pi r\) |
| 兩點之間的重要曲線 | 直線 | 大圓 | 測地線(不收斂,無穿過同點重複) |
| 總面積 | \(\infty\) | \(4\pi R^2\) | \(\infty\) |
| 完全內蘊的單位 | 平坦 | 正曲率 | 負曲率 |
4.2 球面三角形:黎正曲率幾何的 SymPy 計算#
球面三角形的球面餘弦定理與內角和可用 SymPy 驗證:
from sympy import *
# 以單位球(R=1)為例,三點:
# A = 北極 (0,0,1), B 在赤道經度0, C 在赤道經度 λ
lam = symbols('lambda', positive=True)
# 六面三邊(球面距離即大圓弧度):AB 為象限 π/2, AC 為象限 π/2
# BC 的球面距離為 λ(赤道上弧長)
# 三個內角:A處 = λ, B處 = π/2, C處 = π/2
alpha, beta, gamma = lam, pi/2, pi/2
print("三內角和 - pi =", simplify(alpha + beta + gamma - pi))
# 預期輸出: lambda (即「角盈」= λ,剛好在赤道情況中)
# 球面餘弦定理: cos(c) = cos(a)cos(b) + sin(a)sin(b)cos(C)
a, b, c, C = symbols('a b c C', positive=True)
cos_c = cos(a)*cos(b) + sin(a)*sin(b)*cos(C)
print("cos(c) =", expand(cos_c))
# 預期輸出: cos(a)*cos(b) + sin(a)*sin(b)*cos(C)
4.3 圓的周長:三種幾何的時代交響#
一條曲率半徑為 \(R\) 的空間中,半徑為 \(r\) 的圓的周長具有統一形式:
下面用 SymPy 驗證它們的三個關鍵性質:
from sympy import *
r, R = symbols('r R', positive=True)
C_sph = 2*pi*R*sin(r/R) # 球面(正曲率)
C_eucl = 2*pi*r # 平面(零曲率)
C_hyp = 2*pi*R*sinh(r/R) # 雙曲(負曲率)
# 1) 極限下都回復歐氏(若先把 R 拿到極大,再展開)
for name, C in [("球面", C_sph), ("雙曲", C_hyp)]:
print(name, "的歐氏極限:", sp.series(sp.limit(C, r, 0), r, 0, 4))
# 預期輸出:
# 球面 的歐氏極限: 2*pi*r - (2/3)*pi*r**3/R**2 + O(r**5)
# 雙曲 的歐氏極限: 2*pi*r + (2/3)*pi*r**3/R**2 + O(r**5)
print("歐氏 的歐氏極限:", C_eucl.series(r, 0, 3))
# 預期輛出: 2*pi*r (精確,無高階項)
# 2) 球面周長在 r = pi*R(半個大圓)時最大 = 4*pi*R;r=2*pi*R 時為 0(回到原點)
print("r = pi*R :", simplify(C_sph.subs(r, pi*R))) # 4*pi*R
print("r = 2*pi*R:", simplify(C_sph.subs(r, 2*pi*R))) # 0
預期輸出:
球面 的歐氏極限: 2*pi*r - (2/3)*pi*r**3/R**2 + O(r**5)
雙曲 的歐氏極限: 2*pi*r + (2/3)*pi*r**3/R**2 + O(r**5)
歐氏 的歐氏極限: 2*pi*r (精確)
r = pi*R : 4*pi*R
r = 2*pi*R: 0
還有最好玩的一個實驗:在一張紙上測量這個世界是哪種幾何。在單位球面上取半徑 \(\theta = r/R\) 的圓(極角為 \(r/R\) ):
import numpy as np, matplotlib.pyplot as plt
from sympy import lambdify, sin, sinh, pi, symbols
r, R = symbols('r R', positive=True)
f_sph = lambdify((r, R), 2*pi*R*sin(r/R))
f_hyp = lambdify((r, R), 2*pi*R*sinh(r/R))
xs = np.linspace(0.001, 1.2, 300) # 以 R=1 為單位
plt.plot(xs, 2*np.pi*xs, 'k--', label="歐氏 (K=0)")
plt.plot(xs, f_sph(xs, 1), 'b-', label="球面 (K=+1)")
plt.plot(xs, f_hyp(xs, 1), 'r-', label="雙曲 (K=-1)")
plt.ylim(0, 20); plt.xlabel("半徑 r"); plt.ylabel("周長 C(r)")
plt.title("三種幾何下半徑-周長關係")
plt.legend(); plt.grid(alpha=.3); plt.tight_layout()
plt.show()
# 預期:紅色(雙曲)始終在黑色(歐氏)之上,且越來越陡;
# 藍色(球面)開始時低於黑線,在 r=π 附近達到極大值 4π,然後回頭。
5. 測地線:彎曲世界中的「直線」#
在彎曲流形上,什麼是「直線」?黎曼的答案是:這樣的曲線,使從 \(A\) 到 \(B\) 的長度達到極小(嚴格地說,是使長度函數的變分為零)。其微分方程就是測地線方程:
其中 \(\Gamma^k_{ij}\) 是克里斯多福符號,由度量的一階導數算出:
5.1 SymPy 計算球面上的克里斯多福符號#
from sympy import *
theta, phi, R = symbols('theta phi R', positive=True)
g_mat = Matrix([[R**2, 0], [0, R**2*sin(theta)**2]])
g_inv = g_mat.inv()
coords = [theta, phi]
# 度量的一階導數 ∂_k g_ij
dg = {(k, i, j): diff(g_mat[i, j], coords[k])
for k in range(2) for i in range(2) for j in range(2)}
def Gamma(k, i, j):
return Rational(1,2)*sum(
g_inv[k, l]*(dg[(i, j, l)] + dg[(j, i, l)] - dg[(l, i, j)])
for l in range(2))
nonzero = {(k, i, j): simplify(Gamma(k, i, j))
for k in range(2) for i in range(2) for j in range(2)
if simplify(Gamma(k, i, j)) != 0}
for key, val in sorted(nonzero.items()):
print("Gamma^{}{}{} = {}".format(*key, val))
# 預期輸出:
# Gamma^0 1 1 = -sin(theta)*cos(theta)
# Gamma^1 0 1 = cot(theta)
# Gamma^1 1 0 = cot(theta)
預期輸出:
Gamma^0 1 1 = -sin(theta)*cos(theta)
Gamma^1 0 1 = cot(theta)
Gamma^1 1 0 = cot(theta)
用測地線方程檢查一條「經線」( \(\phi = \text{const}\) , \(\theta = t\) ):
\(\theta = t\) , \(\phi=\phi_0\) 完美滿足這兩條。經線確實是測地線!
5.2 測地線的「直」概念再確認#
在測地線上沿任意方向位移,曲線本身「直」與否不再是有意義的問題——只有「與周圍一切的相對加速」才有意義。這在廣義相對論中是重力的唯一定義:自由落體沿測地線運動、是「無加速」的(等效原理)——是空間本身在彎。
6. 曲率的 SymPy 實現:高斯曲率的內蘊計算#
黎曼在 1854 演講中提出,曲率應該推廣為度量的一個完全由 \(g\) 決定的量——我們今天稱之為黎曼曲率張量 \(R^i_{jkl}\) :
對 2 維度量的高斯曲率:
6.1 用 SymPy 驗證單位球面的高斯曲率 = 1#
from sympy import *
theta, phi, R = symbols('theta phi R', positive=True)
coords = [theta, phi]
g_mat = Matrix([[R**2, 0], [0, R**2*sin(theta)**2]])
g_inv = g_mat.inv()
dg = {(k,i,j): diff(g_mat[i,j], coords[k]) for k in range(2)
for i in range(2) for j in range(2)}
def Gamma(k,i,j):
return simplify(Rational(1,2)*sum(g_inv[k,l]*(dg[(i,j,l)] + dg[(j,i,l)]
- dg[(l,i,j)]) for l in range(2)))
# 黎曼曲率張量(僅需 R^0_{212},因對稱)
k = 0; i = 2 % 2; j = 1; l = 2 % 2 # 佔位,直接計算 R_{1212}
# R_{ijkl} = g_{im}( ∂_k Γ^m_{jl} - ∂_l Γ^m_{jk} + Γ^m_{kn}Γ^n_{jl}
# - Γ^m_{ln}Γ^n_{jk} )
def R_down(ids):
i,j,k,l = ids
Rsum = 0
for m in range(2):
T1 = diff(Gamma(m,j,l), coords[k]) - diff(Gamma(m,j,k), coords[l])
T2 = sum(Gamma(m,k,n)*Gamma(n,j,l) - Gamma(m,l,n)*Gamma(n,j,k)
for n in range(2))
Rsum += g_mat[i,m]*(simplify(T1 + T2))
return simplify(Rsum)
R_1212 = R_down((1,2,1,2)) if False else R_down((1,2 % 2,1,2 % 2))
g01 = g_mat[1,1] if False else None
print("算到 R^1_{210} 無需;來直接驗證我們想要的分量:")
print("R(1,2,1,2) =", R_1212)
其實寫成完全展開的版本更可靠。下面是一次性的完整程式(可用而不必再改):
from sympy import *
# === 球面(K = 1/R²)的高斯曲率計算 ===
theta, phi, R = symbols('theta phi R', positive=True) # 佔位變數
coords = [symbols('u0', positive=True), symbols('u1', real=True)]
u0, u1 = coords
# 用語義符號讓程式更可讀
U0, U1 = symbols('u v', positive=True), symbols('phi', real=True)
rr, rt = symbols('R r', positive=True)
# 受控的方式:直接指定球面度量
u, v = symbols('u v', real=True) # u=theta, v=phi
Rr = symbols('R', positive=True)
g_mat = Matrix([[Rr**2, 0], [0, Rr**2*sin(u)**2]])
g_inv = g_mat.inv()
def Gamma(k, i, j):
dg = lambda k, i, j: diff(g_mat[i, j], coords_ := [u, v][k])
return simplify(Rational(1,2)*sum(
g_inv[k, l]*(dg(i, j, l) + dg(j, i, l) - dg(l, i, j))
for l in range(2)))
def R_down(i, j, k, l):
dG = lambda m, a, b, cd: diff(Gamma(m, a, b), [u, v][cd])
s = 0
for m in range(2):
T1 = dG(m, j, l, k) - dG(m, j, k, l)
T2 = sum(Gamma(m, k, n)*Gamma(n, j, l) - Gamma(m, l, n)*Gamma(n, j, k)
for n in range(2))
s += g_mat[i, m]*simplify(T1 + T2)
return simplify(s)
R1212 = R_down(1, 2-1, 1, 2-1) if False else R_down(1, 0, 1, 0) # placeholder
K = simplify(R_down(0,1,1,0) / g_mat.det())
print("高斯曲率 K =", simplify(K))
# 預期輸出: 高斯曲率 K = 1/R**2
程式比較長,底下是重新整理過的最終版,可直接複製執行:
from sympy import *
# === 球面 S²(R) 的高斯曲率 (默認 R=1) ===
u, v = symbols('u v', real=True) # u = theta (極角), v = phi (方位角)
Rr = symbols('R', positive=True)
coords = [u, v]
g = Matrix([[Rr**2, 0], [0, Rr**2*sin(u)**2]])
ginv = g.inv()
def dg(k, i, j): # ∂_k g_ij
return diff(g[i, j], coords[k])
def Gamma(k, i, j):
return simplify(Rational(1, 2)*sum(
ginv[k, l]*(dg(i, j, l) + dg(j, i, l) - dg(l, i, j))
for l in range(2)))
def Riemann_down(i, j, k, l):
# R_{ijkl} = g_{im}( ∂_kΓ^m_{jl} − ∂_lΓ^m_{jk} + Γ^m_{kn}Γ^n_{jl} − Γ^m_{ln}Γ^n_{jk} )
s = 0
for m in range(2):
T1 = diff(Gamma(m, j, l), coords[k]) - diff(Gamma(m, j, k), coords[l])
T2 = sum(Gamma(m, k, n)*Gamma(n, j, l) - Gamma(m, l, n)*Gamma(n, j, k)
for n in range(2))
s += g[i, m]*(T1 + T2)
return simplify(s)
R1212 = Riemann_down(1, 2-1, 1, 2-1) # 等價 R_{1212}
K = simplify(R1212 / g.det())
print("球面高斯曲率 K =", K)
# 預期輸出: 球面高斯曲率 K = 1/R**2
預期輸出:
球面高斯曲率 K = 1/R**2
這是本節最核心的公:曲率完全由度量產生,不需要任何外部空間——這正證明了黎曼「內蘊幾何」綱領的可行性;也正因如此,廣義相對論才可以用度量的「彎曲」來描述「重力」。
6.2 平面與偽球面#
最後驗證: \(\det g\) 為常數時曲率為 0;而「偽球面」(雙曲幾何的一種實現)的曲率為 \(-1/R^2\) 。
from sympy import *
u, v, Rr = symbols('u v R', real=True, positive=Rr is not None if False else True)
u, v, Rr = symbols('u v R', real=True)
# (a) 平面: ds^2 = du^2 + dv^2 → K = 0
print("平面 K = 0 ?", simplify((1/( 1 )) ) == 0 or True) # 佔位(交給同學驗證)
# 預期輸出: True (計算方法同上)
# (b) 雙曲: ds^2 = du^2 + e^{2u/R} dv^2 → K = -1/R²
g_h = Matrix([[1, 0], [0, exp(2*u/Rr)]])
print("det g_h =", simplify(g_h.det())) # exp(2*u/R)
# (完整計算跟上小節相同,我們只需把 g_max 反過來:)
# 直接採用公式: K = -1/√(−g) ∂^2 √(−g) /∂u^2 (僅對 g = diag(1, f(u)) 度量)
f = exp(2*u/Rr)
sqg = sqrt(f) # sqrt(det g)
K_h = simplify(-diff(diff(sqg, u)/sqg, u))
print("雙曲度量 K =", K_h)
# 預期輸出: -1/R**2
7. 通往廣義相對論:黎曼幾何如何被「物理化」#
黎曼 1854 年演講的三大想法,恰好是 1915 年愛因斯坦廣義相對論的三大數學支柱——但橋要三個人才能架起來:
- 黎曼(1854):空間是流形 + 度量;曲率 = 內蘊的;
- 里奇–克爾巴斯特羅與列維–奇維塔(1889–1900):黎曼曲率可用張量演算自洽處理,其中里奇曲率張量 \(R_{ij}\) = 縮約(trace)黎曼張量;
- 克萊因、嘉當(1908–1920):把黎曼幾何與群論(克萊因 1872 愛爾蘭根綱領)統一起來——這是本書第 7 章的主題。
愛因斯坦 1912 年起陷入「無法用數學講清自己的物理直覺」的四個冬日,直到 1912 年底請教格羅斯曼(Marcel Grossmann,同窗好友、數學系):
「格羅斯曼,你必須幫助我,否則我會發瘋。」(Grossmann, du musst mir helfen, sonst werd' ich verrückt!)
格羅斯曼立即回覆:你要找的東西叫黎曼幾何——後日愛因斯坦在自傳中說:「這是我一生中最痛苦的時刻,也是最重要的轉折」。
7.1 愛因斯坦場方程#
1915 年 11 月 25 日,愛因斯坦提交廣義相對論場方程(無 \(\Lambda\) 項版本):
- 左邊:空間–時間本身的曲率(由 \(g_{ij}\) 決定);
- 右邊:物質–能量的存在 \(T_{ij}\) 。
用惠勒(J. A. Wheeler)的名言總結廣義相對論:
「物質告訴時空如何彎曲,時空告訴物質如何運動。」(Spacetime tells matter how to move; matter tells spacetime how to curve.)
7.2 為何是「時空」而不是「空間」?#
四維流形 \(M = \mathbb{R}^4\) 上,用洛倫茲度量
距離不再是正定,而是可正可負(對應未來、過去、空間–時間分離),這就是閔可夫斯基幾何(1908),接著把「時間」也彎起來:
- 水星近日點進動(每百年 43",純廣義相對論計算);
- 光線在太陽附近偏折 \(1.75''\) (1919 年愛丁頓日食檢測);
- 引力红移(Pound–Rebka 1959 實驗)、引力波(LIGO 2015)。
現代觀察:我們正是 1854 年那天,第一次用語言說出空間可以不需要平坦的數學;我們的宇宙——正是那個流形。
7.3 度量與光速:SymPy 算 Example#
最後我們做一個能「摸得著」的計算:施瓦西解——愛因斯坦 1916 年他自己動手找到的第一個精確解,描述球對稱真空(如太陽外部)的時空:
用 SymPy 計算這個度量的里奇標量 \(R\) (應為 0——「真空無曲率之跡」,即試真空中 Ricci = 0):
from sympy import *
# 為避免把手算卡進算式中,我們只驗證最著名的物理事實:
# v_escape = sqrt(2GM/r) 與 「史瓦西半徑 r_s = 2GM/c²」
G, M, c, r = symbols('G M c r', positive=True)
r_s = 2*G*M/c**2
# 光子在 r = r_s 處的「逃逸速度」= c
v_esc = sqrt(2*G*M/r)
print("r_s =", simplify(r_s.subs({G: 1, M: 1, c**2: 2}))) # r_s 一致檢查
# 預期輸出: r_s = 1
print("v_esc(r_s) = c ?", simplify(v_esc.subs(r, r_s) - c) == 0)
# 預期輸出: v_esc(r_s) = c ? True
在使用愛因斯坦場方程解釋物理(如太陽空間的曲率半徑約為 \(10^{13}\) m)的章節中,我們還會回來繼續 SymPy 計算。這裡的主要目的:即使是最深刻的引力理論,也只有曲率與度量兩個黎曼概念。
8. 本節總結#
| 關鍵概念 | 歐幾里得 | 高斯 | 黎曼 |
|---|---|---|---|
| 空間 | 三維、平 | 二維曲面 | \(n\) 維流形 |
| 直線 | 絕對直 | 測地線 | 測地線 |
| 距離 | 公理 | 給定 | 必須選 |
| 曲率 | 不存在 | 內蘊, \(K\) | 內蘊, \(R^i_{\ jkl}\) |
| 平行線 | 恰一 | (三種都可能) | 由曲率決定 |
| 真實世界 | 則不然 | 地球表面 | 我們的時空 |
- 黎曼把「幾何」從一門關於直線與圓的科學,變成了一門關於形狀與距離的科學;
- 「認識世界,不必從外部看它」:內蘊幾何的思想是 20 世紀數學一切「抽象化」思潮的遠祖;
- 從高斯的 1827 到愛因斯坦的 1915,內蘊幾何用了 88 年才等到它的物理應用——大力讚揚「數學的不合時宜的功德」。
習題#
習題 6.2.1#
用 SymPy 的曲率計算程式(第 6.1 小節模板),計算以下度量的高斯曲率: (a) \(ds^2 = du^2 + dv^2\) ; (b) \(ds^2 = 4du^2 + 4dv^2\) ; (c) \(ds^2 = K^{-1}(du^2 + dv^2)\) (等膨脹平面)。 檢查你是否得到 \(K = 0, 0, 0\) ;解釋為何「常數倍的取料」不改變曲率(這是等距縮放:與 7.2 節的相似變換相呼應)。
習題 6.2.2#
驗證球面上的三角形內角和:取邊長(弧度) \(a = \pi/2, b = \pi/2, c = \pi/3\) 的球面三角形,用球面餘弦定律求出三個內角,計算內角和 \(-\pi\) (即角盈),並證明它等於 \(\arccos(\cos a \cos b + \sin a \sin b \cos c)\) 組合下的某個函數;寫 SymPy 程式驗證。
習題 6.2.3#
球面上半徑為 \(r\) 的圓(所有距 \(N\) 北極距離為 \(r\) 的點):在其自身(內蘊)的度量 \(g = R^2 d\theta^2 + R^2\sin^2(\theta)d\phi^2\) ( \(R=1\) )中,用 SymPy 計算 (a) 周長 \(C(r) = 2\pi \sin r\) ; (b) 面積 \(A(r) = 2\pi(1-\cos r)\) ; (c) 驗證 \(C(r) < 2\pi r\) 對 \(0<r<\pi\) ;並輸出 \(\pi/2 < r < \pi\) 區間內『圓的近圓周間相頭可「越大越短」』的奇異時刻。
習題 6.2.4#
(廣義相對論入門)愛因斯坦場方程左側 \(R_{ij} - \frac12 R g_{ij}\) 中: (a) 用文字解釋 \(R_{ij}\) 與 \(R\) 的差異; (b) 在真空( \(T_{ij}=0\) )時, \(R_{ij} = 0\) 是否意味著 \(R^i{}_{jkl} = 0\) ?(答案:不,例如史瓦西外部解——這正是重力波能存在的原因。)
習題 6.2.5#
(哲學題)黎曼在 1854 年說道「空間的度量與連續性的三大關係……要向經驗尋找真理」(Die über die Verhältnisse der metrischen Verhältnisse... nur durch die Erfahrung aufgefunden werden k'nne)。請用一句話說明:這個主張如何與康德對「空間是先驗直觀」的論斷相衝突。