跳轉到

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\) 的正交參數化情形最常用):

\[ K = -\frac{1}{2\sqrt{EG}} \left[ \frac{\partial}{\partial u}\!\left(\frac{G_u}{\sqrt{EG}}\right) + \frac{\partial}{\partial v}\!\left(\frac{E_v}{\sqrt{EG}}\right) \right]. \]

一般情形可用 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\) ),任何 球面地圖必在角度或面積(或兩者)上失真。

練習:

  1. 用 02.2 的 curvatures 算柱面得到 \(K = 0\) ,與本節內在公式結果對照, 體會「外在算法」與「內在算法」殊途同歸。
  2. 半徑 \(R\) 的球面上,半徑為 \(\rho\) (沿大圓量)的測地圓周長是 \(C = 2\pi R \sin(\rho/R) = 2\pi\rho\,(1 - K\rho^2/6 + \cdots)\) 。用 SymPy 對 \(\rho\) 做級數展開驗證。
  3. 計算旋轉曲面(見 02.2 環面)的 \(E, G\) ,代入 \(F=0\) 內在公式,確認得到 與外在公式相同的 \(K = \cos v/(b(a+b\cos v))\) 。
  4. (挑戰)實作一般 \(F \ne 0\) 的 Brioschi 公式:
\[ K = \frac{1}{(EG-F^2)^2}\det\begin{pmatrix} -\tfrac12 E_{vv} + F_{uv} - \tfrac12 G_{uu} & \tfrac12 E_u & F_u - \tfrac12 E_v\\ F_v - \tfrac12 G_u & E & F\\ \tfrac12 G_v & F & G \end{pmatrix} \]

並用馬鞍面 \(z = xy\) 驗證。 5. 把一張紙捲成圓錐,量錐面上「三角形」的內角和——驗證它仍是 \(180^\circ\) ( \(K = 0\) ),再想想為什麼錐頂點是唯一的奇異點。