02.3 Gauss 神奇定理(Theorema Egregium)#
本節目標#
- 理解 Gauss 的神奇定理:高斯曲率 \(K\) 只由第一基本形式 \(E, F, G\) 決定。
- 體會其意義:住在曲面上的二維生物不必離開曲面,就能測出自己的曲率。
- 用 \(K\) 檢驗地圖投影:為什麼球面不能平鋪成圖?墨卡托與等面積投影各自犧牲了什麼?
- SymPy 實驗:驗證平面與柱面 \(K\) 同為 \(0\) ,故可互相攤平;球面不行。
幾何直覺:彎曲是內在的#
上一節我們用「第二基本形式」(曲面在三維空間中怎麼彎)算出 \(K\) 。直覺上, \(K\) 似乎是一個外在量——它描述曲面嵌在 \(\mathbb{R}^3\) 裡的彎曲方式。 Gauss 在 1827 年證明了一件出乎意料的事:
Theorema Egregium(神奇定理):高斯曲率 \(K\) 可以只用第一基本形式 \(E, F, G\) (及其對 \(u, v\) 的導數)表達。
也就是說, \(K\) 是內在量(intrinsic)。想像一隻只活在曲面上的二維生物, 牠量不出法向量、看不到第三維,但只要牠有一把尺,就能在牠的世界裡測量小 三角形的角度和、小圓的周長,從而**測出 \(K\) **:
- \(K = 0\) :三角形內角和恰為 \(180^\circ\) (歐氏幾何)。
- \(K > 0\) :內角和超過 \(180^\circ\) (球面幾何)。
- \(K < 0\) :內角和小於 \(180^\circ\) (雙曲幾何)。
一個直接的推論:**等距變換保持 \(K\) **。兩個曲面若能不伸縮地互相彎過去, 它們在對應點的 \(K\) 必相同。
剪刀效應:球面為什麼攤不平#
\(K\) 是內在量,立刻解釋了日常生活經驗:把一張平面紙彎成柱面很容易( \(K\) 都是 \(0\) ,內在不變);但要把紙包住球而不皺、不剪、不伸縮,辦不到—— 平面 \(K = 0\) ,球面 \(K = 1/R^2 \ne 0\) 。
同樣地,地球表面無法完美地畫成平面地圖。任何地圖投影都必須犧牲某些性質:
- 墨卡托投影(等角):角度保真(羅盤航線是直線),但面積嚴重失真—— 格陵蘭看起來和非洲差不多大。
- 蘭伯特等面積投影:面積保真,但角度(形狀)被扭壞。
幾何語言:投影是一張從球面( \(K = 1/R^2\) )到平面( \(K = 0\) )的映射,內在 曲率不同,不可能同時保長度、角度與面積。你剪開橘子的皮攤平時,皮上 必然出現裂縫或皺褶——這就是「剪刀效應」。
內在公式:Brioschi 公式#
只用 \(E, F, G\) 表達 \(K\) 的公式( \(F = 0\) 的正交參數化情形最常用):
一般情形可用 Brioschi 公式(行列式形式,見練習)。關鍵是:式子裡**只有 \(E, F, G\) **,完全沒有 \(L, M, N\) 。
SymPy 實作#
先寫一個「內在曲率計算器」,輸入 \(E, F, G\) (不是曲面本身!):
import sympy as sp
u, v, R, a = sp.symbols('u v R a', positive=True)
def K_intrinsic(E, F, G, P=u, Q=v):
"""由第一基本形式 E, F, G 算高斯曲率 K(F = 0 的內在公式)。
P, Q 為曲面的兩個參數符號。"""
if sp.simplify(F) != 0:
raise ValueError('一般情形請做練習 4(Brioschi 公式)')
K = -1/(2*sp.sqrt(E*G)) * (
sp.diff(sp.diff(G, P)/sp.sqrt(E*G), P)
+ sp.diff(sp.diff(E, Q)/sp.sqrt(E*G), Q))
return sp.simplify(K)
# --- 平面 ---
# r = (u, v, 0) → E = G = 1, F = 0
print(K_intrinsic(1, 0, 1)) # 0
# --- 柱面 r = (R cos u, R sin u, v) → E = G = R**2... 其實 G = 1 ---
Ecyl, Fcyl, Gcyl = R**2, 0, 1
print(sp.simplify(K_intrinsic(Ecyl, Fcyl, Gcyl))) # 0
兩個曲面**只靠 \(E, F, G\) **(柱面的 \(E = R^2\) 只是沿緯線的尺度縮放,屬於 「座標選擇」),內在公式都給 \(K = 0\) 。這正是柱面可以攤平成紙的原因。
再看球面:
# 球面(餘緯 theta):r = (R sin t cos u, R sin t sin u, R cos t)
t = sp.symbols('t', positive=True)
Es = sp.sin(t)**2*R**2
Fs = 0
Gs = R**2
print(sp.simplify(K_intrinsic(Es, Fs, Gs, u, t)))
# 輸出帶有一個 sin(t)=0 的 Piecewise 分支(極點本來就奇異),主分支為 1/R**2
注意球面的第一基本形式 \(ds^2 = R^2\,dt^2 + R^2\sin^2 t\,du^2\) 完全沒提到 任何法向量或第三維,但內在公式硬是算出 \(K = 1/R^2\) 。二維生物只要量出 「緯線圓周長 \(= 2\pi R \sin t\) 」與「到極點距離 \(= Rt\) 」的偏差,就能推出 \(K\) ,不必離開球面。
畫圖:剪刀效應#
把球面的經緯網「平鋪」到矩形上,可以看到高緯度被嚴重拉伸——這就是墨卡托 地圖把格陵蘭放大的原因:
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
lat = np.linspace(-np.pi/2 + 0.05, np.pi/2 - 0.05, 60) # 避開極點(墨卡托在 ±90° 發散)
lon = np.linspace(-np.pi, np.pi, 90)
LAT, LON = np.meshgrid(lat, lon)
# 球面真實網格
ax = axes[0]
for la in np.linspace(-np.pi/2, np.pi/2, 7):
ax.plot(lon, la + 0*lon, 'b-', lw=0.8)
for lo in np.linspace(-np.pi, np.pi, 13):
ax.plot(lo + 0*lat, lat, 'b-', lw=0.8)
ax.set_title('sphere grid (equal steps in lat/lon)')
# 墨卡托:y = ln(tan(pi/4 + lat/2)),緯線間距往兩極暴漲
ax = axes[1]
y = np.log(np.tan(np.pi/4 + LAT/2))
ax.pcolormesh(LON, y, np.ones_like(y), cmap='Blues', shading='auto')
ax.set_title('Mercator: angles kept, AREA exploded')
# 等面積:y = sin(lat),面積保真但形狀壓扁
ax = axes[2]
ax.pcolormesh(LON, np.sin(LAT), np.ones_like(np.sin(LAT)),
cmap='Greens', shading='auto')
ax.set_title('Equal-area: area kept, ANGLES distorted')
plt.tight_layout(); plt.show()
中圖的緯線間距在兩極附近無限拉開( \(K = 1/R^2\) 的內在資訊被硬塞進 \(K = 0\) 的平面,只能以面積爆炸為代價);右圖保住面積就得犧牲角度。
動手實驗:誰能攤平?#
用「 \(K\) 是否相同」當判準,檢驗哪些曲面可以互相攤平:
# 1) 圓錐面 r = (v cos u, v sin u, c v),v > 0
cone = [v*sp.cos(u), v*sp.sin(u), a*v]
ru = [sp.diff(c, u) for c in cone]
rv = [sp.diff(c, v) for c in cone]
dot = lambda p, q: sp.simplify(sum(pi*qi for pi, qi in zip(p, q)))
Ec, Fc, Gc = dot(ru, ru), dot(ru, rv), dot(rv, rv)
print(Ec, Fc, Gc) # v**2, 0, a**2 + 1
print(K_intrinsic(Ec, Fc, Gc)) # 0 → 圓錐也能攤平(剪開就是扇形)
# 2) 環面外圈 K > 0:攤不平
# 3) 偽球面 K = -1/a**2 < 0:也攤不平,但它「局部等距」於雙曲平面!
# r(u,w) = (a cos u sin w, a sin u sin w, a(cos w + ln tan(w/2)))
w = sp.symbols('w', positive=True)
Ep = a**2*sp.sin(w)**2 # r_u · r_u(可自行驗證)
Gp = a**2*sp.cos(w)**2/sp.sin(w)**2 # r_w · r_w = a**2 cot**2(w)
print(sp.trigsimp(K_intrinsic(Ep, 0, Gp, u, w))) # -1/a**2(常數負曲率)
結論整理成一張表:
| 曲面 | \(K\) | 能攤平成平面? | 幾何 |
|---|---|---|---|
| 平面、柱面、圓錐 | \(0\) | 可以 | 歐氏 |
| 球面 | \(1/R^2 > 0\) | 不行 | 球面幾何 |
| 偽球面 | \(-1/a^2 < 0\) | 不行 | 雙曲幾何 |
小結與練習#
- 神奇定理: \(K\) 只依賴 \(E, F, G\) ,是內在量;等距變換保持 \(K\) 。
- 二維生物不需要第三維就能測出 \(K\) ——這正是廣義相對論「內在幾何」思想的起點。
- \(K\) 相同才可能等距:柱面/圓錐可攤平( \(K=0\) ),球面不行( \(K>0\) ),任何 球面地圖必在角度或面積(或兩者)上失真。
練習:
- 用 02.2 的
curvatures算柱面得到 \(K = 0\) ,與本節內在公式結果對照, 體會「外在算法」與「內在算法」殊途同歸。 - 半徑 \(R\) 的球面上,半徑為 \(\rho\) (沿大圓量)的測地圓周長是 \(C = 2\pi R \sin(\rho/R) = 2\pi\rho\,(1 - K\rho^2/6 + \cdots)\) 。用 SymPy 對 \(\rho\) 做級數展開驗證。
- 計算旋轉曲面(見 02.2 環面)的 \(E, G\) ,代入 \(F=0\) 內在公式,確認得到 與外在公式相同的 \(K = \cos v/(b(a+b\cos v))\) 。
- (挑戰)實作一般 \(F \ne 0\) 的 Brioschi 公式:
並用馬鞍面 \(z = xy\) 驗證。 5. 把一張紙捲成圓錐,量錐面上「三角形」的內角和——驗證它仍是 \(180^\circ\) ( \(K = 0\) ),再想想為什麼錐頂點是唯一的奇異點。