跳轉到

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 年的就職演說有以下特點:

  1. 全程僅一個公式(度量 \(ds^2\) 的一處表示),其餘皆為概念性論述;
  2. 全文約 20 頁,死後才由戴德金(Dedekind)於 1868 年整理發表;
  3. 對像大部分是哲學系醫生與文化人士,僅高斯一人能完全看懂。
  4. 高斯聽完回來的路上對韋伯(Weber)說:「黎曼的思路極為深邃。」("Der Riemann hat einen tiefen Sinn.")

1.2 為何高斯選了那個題目?#

就職演說前,候選人要提交三個題目讓系主任選。黎曼本想報告電磁學題目,這是他熟悉且能快速準備的內容。但高斯親手替他選了「幾何基礎的假設」這個高斯本人埋藏了三十年(25+年)的問題。高斯選這個題目最具深意:他在用黎曼替自己說出不敢說的那個世界。

1.3 黎曼演講的三步驟#

整篇演講可以拆成三步,每一步都是二十世紀幾何學的一章:

  1. 空間是流形(Mannigfaltigkeit)——拋棄「空間=歐氏三維」的先天假設;
  2. 幾何由度量決定——在流形上引入度量 \(ds^2\) ,戰爭是「如何測量」,而非「什麼形狀」;
  3. 曲率是內蘊的——空間可以局部彎曲,而彎曲由「二次形式」的曲率張量刻畫,不需要外部空間。

以下逐一展開。


2. 流形(Manifold):空間概念的解放#

2.1 高斯的內蘊視角回顧#

高斯 1827 年在曲面論中實現了一次關鍵跳躍:把曲面看作擁有自己幾何的世界,給定曲面上的座標 \((u,v)\) ,距離由第一基本形式

\[ ds^2 = E\,du^2 + 2F\,du\,dv + G\,dv^2 \]

決定;曲率 \(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\) 維流形上一點附近,黎曼設想「距離的平方」是座標微分的二次形式

\[ ds^2 = \sum_{i,j} g_{ij}(x)\, dx^i dx^j \quad\Longleftrightarrow\quad ds^2 = g_{11}dx_1^2 + g_{12}dx_1 dx_2 + \cdots + g_{nn} dx_n^2 \]

其中 \(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 維流形,

\[ ds^2 = du^2 + f(u,v)\,dv^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\) 的圓的周長具有統一形式:

\[ C(r) = \begin{cases} 2\pi R \sin(r/R) & K>0\\[4pt] 2\pi r & K=0 \\[4pt] 2\pi R \sinh(r/R) & K<0 \end{cases} \]

下面用 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\) 的長度達到極小(嚴格地說,是使長度函數的變分為零)。其微分方程就是測地線方程:

\[ \ddot x^k + \Gamma^k_{ij}\,\dot x^i \dot x^j = 0 \]

其中 \(\Gamma^k_{ij}\) 是克里斯多福符號,由度量的一階導數算出:

\[ \Gamma^k_{ij} = \frac{1}{2} g^{k\ell}\left(\partial_i g_{j\ell} + \partial_j g_{i\ell} - \partial_\ell g_{ij}\right). \]

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\) ):

\[ \ddot\theta + \Gamma^0_{11}\dot\phi^2 = 0 + 0 = 0,\qquad \ddot\phi + 2\Gamma^1_{01}\dot\theta\dot\phi = 0. \]

\(\theta = t\) , \(\phi=\phi_0\) 完美滿足這兩條。經線確實是測地線!

5.2 測地線的「直」概念再確認#

在測地線上沿任意方向位移,曲線本身「直」與否不再是有意義的問題——只有「與周圍一切的相對加速」才有意義。這在廣義相對論中是重力的唯一定義:自由落體沿測地線運動、是「無加速」的(等效原理)——是空間本身在彎。


6. 曲率的 SymPy 實現:高斯曲率的內蘊計算#

黎曼在 1854 演講中提出,曲率應該推廣為度量的一個完全由 \(g\) 決定的量——我們今天稱之為黎曼曲率張量 \(R^i_{jkl}\) :

\[ R^i_{jkl} = \partial_k \Gamma^i_{jl} - \partial_l \Gamma^i_{jk} + \Gamma^i_{km}\Gamma^m_{jl} - \Gamma^i_{lm}\Gamma^m_{jk}. \]

對 2 維度量的高斯曲率:

\[ K = \frac{R_{1212}}{\det g}. \]

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 年愛因斯坦廣義相對論的三大數學支柱——但橋要三個人才能架起來:

  1. 黎曼(1854):空間是流形 + 度量;曲率 = 內蘊的;
  2. 里奇–克爾巴斯特羅與列維–奇維塔(1889–1900):黎曼曲率可用張量演算自洽處理,其中里奇曲率張量 \(R_{ij}\) = 縮約(trace)黎曼張量;
  3. 克萊因、嘉當(1908–1920):把黎曼幾何與群論(克萊因 1872 愛爾蘭根綱領)統一起來——這是本書第 7 章的主題。

愛因斯坦 1912 年起陷入「無法用數學講清自己的物理直覺」的四個冬日,直到 1912 年底請教格羅斯曼(Marcel Grossmann,同窗好友、數學系):

「格羅斯曼,你必須幫助我,否則我會發瘋。」(Grossmann, du musst mir helfen, sonst werd' ich verrückt!)

格羅斯曼立即回覆:你要找的東西叫黎曼幾何——後日愛因斯坦在自傳中說:「這是我一生中最痛苦的時刻,也是最重要的轉折」。

7.1 愛因斯坦場方程#

1915 年 11 月 25 日,愛因斯坦提交廣義相對論場方程(無 \(\Lambda\) 項版本):

\[ R_{ij} - \frac{1}{2}R g_{ij} = \frac{8\pi G}{c^4} T_{ij} \]
  • 左邊:空間–時間本身的曲率(由 \(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\) 上,用洛倫茲度量

\[ ds^2 = -c^2 dt^2 + dx^2 + dy^2 + dz^2 \]

距離不再是正定,而是可正可負(對應未來、過去、空間–時間分離),這就是閔可夫斯基幾何(1908),接著把「時間」也彎起來:

  • 水星近日點進動(每百年 43",純廣義相對論計算);
  • 光線在太陽附近偏折 \(1.75''\) (1919 年愛丁頓日食檢測);
  • 引力红移(Pound–Rebka 1959 實驗)、引力波(LIGO 2015)。

現代觀察:我們正是 1854 年那天,第一次用語言說出空間可以不需要平坦的數學;我們的宇宙——正是那個流形。

7.3 度量與光速:SymPy 算 Example#

最後我們做一個能「摸得著」的計算:施瓦西解——愛因斯坦 1916 年他自己動手找到的第一個精確解,描述球對稱真空(如太陽外部)的時空:

\[ ds^2 = -\left(1-\frac{r_s}{r}\right)c^2 dt^2 + \left(1-\frac{r_s}{r}\right)^{-1}dr^2 + r^2(d\theta^2 + \sin^2\theta\, d\phi^2) \]

用 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)。請用一句話說明:這個主張如何與康德對「空間是先驗直觀」的論斷相衝突。