1868 - Beltrami 偽球面(非歐幾何第一次「被看見」)#
案件摘要#
1868 年,義大利數學家 Eugenio Beltrami(1835–1900) 在《數學年刊》 發表兩篇論文(Saggio di interpretazione della geometria non-euclidea、 Teoria fondamentale degli spazii di curvatura costante),完成了一件 Lobachevsky 與 Bolyai 都沒能完成的事:
他造出了偽球面(pseudosphere)——一個由曳物線(tractrix)旋轉而成的曲面, 其高斯曲率恆為 \(-1\) :
從此,非歐幾何不再只是「邏輯上的可能性」,而是「可以被畫出來的實物」—— 這終結了「非歐幾何是否自洽」的爭論。
前因 -- 為什麼會有這個案子#
- 非歐幾何的「可信度危機」(1829–1868): Lobachevsky(1829)與 Bolyai(1832)都只給了公理系統 + 推導, 卻沒有給出具體的模型——批評者(包括當時多數數學家)的質疑是:
「你怎麼知道這套公理不會在某一頁推出矛盾?」
- Gauss 的曲率理論(1828): Gauss 的 Disquisitiones generales circa superficies curvas 證明:
這給了 Beltrami 鑰匙:若能找到一個 \(K<0\) 的曲面,它的內在幾何就是雙曲幾何。 - 曳物線(tractrix,1673): Huygens、Leibniz、Newton(1673)研究「曳物線」:一個被繩子拖著走的重物的軌跡:
Beltrami 的洞察(1868):把曳物線繞漸近線旋轉, 得到的曲面高斯曲率恆為負常數。 - Klein 與 Poincaré 的接力(1871/1882): Beltrami 的模型被 Felix Klein(1871) 重述為「射影圓盤模型」(Beltrami–Klein model), 被 Poincaré(1882) 重述為「共形圓盤模型」(見「1882-彭加萊圓盤模型.md」)。
線索與推理 -- 數學式、程式、理論#
第一條線索:偽球面的幾何(曳物線旋轉體)#
曳物線(半徑 \(a=1\) )繞 \(x\) 軸旋轉,得到的曲面參數化:
高斯曲率(直接計算):
面積與體積:
注意:偽球面只是雙曲幾何的局部模型——它有邊界(頂點尖點), 不能覆蓋整個雙曲平面。全域模型要等 Klein(1871)與 Poincaré(1882)。
第二條線索:Beltrami 的「地圖」(Klein 模型的前身)#
Beltrami 把偽球面的測地線映到圓盤內的弦(chord):
- 測地線 = 弦:圓盤內的「直線」是歐氏直線段(但距離不是歐氏距離)。
- Beltrami–Klein 距離公式:
這個公式直接來自射影幾何的交比(見「1639-德沙格射影幾何.md」):
第三條線索:常曲率空間的分類(Beltrami 1868 的最強結果)#
Beltrami 證明了常曲率空間的完整分類:
- 三種幾何的三角形內角和:
- 這是「曲率決定幾何」的第一個嚴格證明—— 為 Riemann 幾何(1854)的「曲率即幾何」提供了具體實例。
Python:偽球面的曲率與面積驗證#
import numpy as np
# 1) 曳物線與偽球面
import numpy as np
sech = lambda x: 1/np.cosh(x) # numpy 沒有 sech,自訂
a = 1.0
u = np.linspace(0.01, 3, 50) # 沿軸參數
r = sech(u) # 半徑(sech u)
x = u - np.tanh(u) # 沿軸座標
print("曳物線旋轉體(偽球面):")
print(f" 頂點(u→0):半徑 = {sech(0.01):.4f} ≈ 1(尖端)")
print(f" 漸近(u→∞):半徑 → {sech(3):.6f} → 0")
print(f" 沿軸長度(u: 0→3)= {x[-1]:.4f}\n")
# 2) 高斯曲率驗證(用第二基本形式的數值計算)
# 參數化 X(u,v) = (u - tanh u, sech u cos v, sech u sin v)
def X(u, v):
return np.array([u - np.tanh(u), sech(u)*np.cos(v), sech(u)*np.sin(v)])
def gauss_curvature_num(u0, v0, h=1e-4):
"""數值計算高斯曲率 K = (LN - M²)/(EG - F²)"""
Xu = (X(u0+h, v0) - X(u0-h, v0)) / (2*h)
Xv = (X(u0, v0+h) - X(u0, v0-h)) / (2*h)
Xuu = (X(u0+h, v0) - 2*X(u0, v0) + X(u0-h, v0)) / h**2
Xuv = (X(u0+h, v0+h) - X(u0+h, v0-h) - X(u0-h, v0+h) + X(u0-h, v0-h)) / (4*h**2)
Xvv = (X(u0, v0+h) - 2*X(u0, v0) + X(u0, v0-h)) / h**2
n = np.cross(Xu, Xv)
n = n / np.linalg.norm(n)
E, F, G = Xu@Xu, Xu@Xv, Xv@Xv
L, M, N = Xuu@n, Xuv@n, Xvv@n
return (L*N - M**2) / (E*G - F**2)
print("高斯曲率驗證(應 = -1):")
for u0 in [0.3, 0.5, 1.0, 1.5, 2.0]:
K = gauss_curvature_num(u0, 0.7)
print(f" u={u0}: K = {K:.4f}")
print("→ 各處 K ≈ -1(常負曲率)✓\n")
# 3) 面積驗證:A = 2πa²(有限)
# 數值積分:A = ∫∫ |Xu × Xv| du dv
def area_element(u, v):
Xu = (X(u+1e-5, v) - X(u-1e-5, v)) / 2e-5
Xv = (X(u, v+1e-5) - X(u, v-1e-5)) / 2e-5
return np.linalg.norm(np.cross(Xu, Xv))
us = np.linspace(0.001, 8, 200)
vs = np.linspace(0, 2*np.pi, 100)
A = 0.0
for i in range(len(us)-1):
du = us[i+1] - us[i]
for j in range(len(vs)-1):
dv = vs[j+1] - vs[j]
A += area_element((us[i]+us[i+1])/2, (vs[j]+vs[j+1])/2) * du * dv
print(f"偽球面面積(u: 0→8,一整圈)= {A:.4f}")
print(f"理論值 2πa² = {2*np.pi*a**2:.4f}(u→∞ 的極限)")
print("→ 偽球面面積有限!(u→∞ 收斂到 2π)\n")
# 4) Beltrami–Klein 距離(交比公式)
def klein_distance(p, q, boundary=1.0):
"""Beltrami–Klein 距離:d = ½ ln(|AQ||BP| / |AP||BQ|)"""
# 沿 p-q 方向求與邊界圓的交點
d = q - p
t_sq = p@p - (p@d)**2/(d@d) # 垂直距離平方
disc = np.sqrt(boundary**2 - t_sq) if t_sq < boundary**2 else 0
center = p - (p@d)/(d@d) * d
# 交點參數
t1 = -(p@d)/(d@d) - disc/np.sqrt(d@d)
t2 = -(p@d)/(d@d) + disc/np.sqrt(d@d)
A_pt, B_pt = p + t1*d, p + t2*d
AP, AQ = np.linalg.norm(A_pt - p), np.linalg.norm(A_pt - q)
BP, BQ = np.linalg.norm(B_pt - p), np.linalg.norm(B_pt - q)
return 0.5*np.log((AQ*BP)/(AP*BQ))
print("Beltrami–Klein 距離(交比公式):")
for q in [0.2, 0.5, 0.8, 0.95]:
d = klein_distance(np.array([0.0, 0.0]), np.array([q, 0.0]))
print(f" P=(0,0), Q=({q},0): d = {d:.4f}")
print("→ 靠近邊界時距離 → ∞(邊界圓是「無窮遠」)")
曳物線旋轉體(偽球面):
頂點(u→0):半徑 = 1.0000 ≈ 1(尖端)
漸近(u→∞):半徑 → 0.099328 → 0
沿軸長度(u: 0→3)= 2.0049
高斯曲率驗證(應 = -1):
u=0.3: K = -1.0000
u=0.5: K = -1.0000
u=1.0: K = -1.0000
u=1.5: K = -1.0000
u=2.0: K = -1.0000
→ 各處 K ≈ -1(常負曲率)✓
偽球面面積(u: 0→8,一整圈)= 6.2794
理論值 2πa² = 6.2832(u→∞ 的極限)
→ 偽球面面積有限!(u→∞ 收斂到 2π)
Beltrami–Klein 距離(交比公式):
P=(0,0), Q=(0.2,0): d = 0.2027
P=(0,0), Q=(0.5,0): d = 0.5493
P=(0,0), Q=(0.8,0): d = 1.0986
P=(0,0), Q=(0.95,0): d = 1.8318
→ 靠近邊界時距離 → ∞(邊界圓是「無窮遠」)
結案 -- 後果與影響#
- 非歐幾何的「除魅」(1868): Beltrami 的偽球面把「非歐幾何是否自洽」從邏輯問題變成幾何事實:
這是數學史上「用模型證明一致性」的第一個重大案例—— 也是 希爾伯特計畫(1899)「用模型證公理自洽」 的先聲。 - 三個模型的時代(1868–1882):
| 模型 | 「直線」 | 「角度」 | 優點 |
|---|---|---|---|
| Beltrami–Klein | 歐氏弦 | 被扭曲 | 距離公式簡潔(交比) |
| Poincaré 圓盤 | 與邊界正交的圓弧 | 保持不變 | 保角、便於複分析 |
| Poincaré 半平面 | 垂直圓弧與垂直線 | 保持不變 | 最常用於雙曲三角 |
| - Klein 的 Erlangen 綱領(1872): | |||
| Beltrami 的模型直接啟發 Klein 用變換群分類幾何 | |||
| (見「1872-克萊因艾爾朗根計畫.md」)—— |
- 物理學的回響(1908–1915):
- Minkowski(1908):狹義相對論的時空幾何就是偽歐氏幾何( \(K<0\) 的符號差)—— Beltrami 的「負曲率」思想延伸到「負號度規」。
- Einstein(1915):廣義相對論把重力化為時空曲率—— Beltrami 的「曲率即幾何」成為物理學的核心原理 (見「1908-閔考斯基時空.md」)。
- 現代應用:
- 雙曲幾何的視覺化(Escher 的《圓極限》系列直接使用 Poincaré 圓盤模型);
- 網路科學(2010s):複雜網路的隱空間(hidden metric space)是雙曲平面—— 網路的「小世界 + 無尺度」性質自然湧現於負曲率空間;
- 機器學習(2019–):雙曲嵌入(hyperbolic embeddings)—— 層次結構(樹、知識圖譜)在雙曲空間中可以用更少維度表示。
- 歷史定位:Beltrami 是「把抽象變成具體」的大師—— Lobachevsky 說「這個幾何存在」,Beltrami 畫出了它。
關鍵人物與文獻#
- E. Beltrami:Saggio di interpretazione della geometria non-euclidea(1868); Teoria fondamentale degli spazii di curvatura costante(1868);偽球面。
- N. I. Lobachevsky:Imaginäre Geometrie(1829)——被 Beltrami「除魅」。
- F. Klein:Über die sogenannte Nicht-Euklidische Geometrie(1871)——射影模型。
- H. Poincaré:Théorie des groupes fuchsiens(1882)——共形模型(見「1882-彭加萊圓盤模型.md」)。
- C. F. Gauss:Disquisitiones generales circa superficies curvas(1828)——內在曲率。
- 相關案件:
1829-羅巴切夫斯基非歐幾何.md、1854-黎曼幾何.md、1882-彭加萊圓盤模型.md、1639-德沙格射影幾何.md。