跳轉到

02.1 參數曲面與第一基本形式#

本節目標#

  • 理解參數曲面 \(\mathbf{r}(u,v)\) 的幾何意義,以及切向量 \(\mathbf{r}_u, \mathbf{r}_v\) 的角色。
  • 認識第一基本形式 \(I = E\,du^2 + 2F\,du\,dv + G\,dv^2\) ,它就是「曲面上的尺規」。
  • 學會用 SymPy 計算球面、柱面的 \(E, F, G\) ,並畫出參數曲面圖。
  • 動手實驗:用第一基本形式計算球面上一條曲線的長度。

幾何直覺:把曲面想成一張有彈性的地圖#

想象你在描述一個甜甜圈、一個球、或一棟扭過的建築外牆。最自然的方式是說: 「給我兩個數字 \((u, v)\) ,我告訴你在空間中的位置 \((x, y, z)\) 。」這就是參數曲面 \(\mathbf{r}(u, v)\) 的想法—— \((u,v)\) 就像曲面上的「經緯度座標」。

把 \(v\) 固定、讓 \(u\) 變動,你會沿著曲面上的一條曲線滑動;這條曲線在 \(u\) 方向的 速度就是切向量:

\[ \mathbf{r}_u = \frac{\partial \mathbf{r}}{\partial u}, \qquad \mathbf{r}_v = \frac{\partial \mathbf{r}}{\partial v}. \]

這兩個向量張成了曲面在每一點的切平面(只要它們線性獨立)。切平面是「住在 曲面上的小蟲」所能感覺到的全部世界——小蟲沒有第三維,它只能沿切平面量化 距離與角度。

第一基本形式:曲面上的尺規#

小蟲從點 \(P\) 附近走一小步 \((du, dv)\) ,這一步在空間中的實際長度平方是

\[ d s^2 = \|\mathbf{r}_u\, du + \mathbf{r}_v\, dv\|^2 = E\, du^2 + 2F\, du\, dv + G\, dv^2, \]

其中三個係數完全由切向量的內積決定:

\[ E = \mathbf{r}_u \cdot \mathbf{r}_u, \qquad F = \mathbf{r}_u \cdot \mathbf{r}_v, \qquad G = \mathbf{r}_v \cdot \mathbf{r}_v. \]

這就是第一基本形式 \(I\) 。可以把它寫成對稱矩陣(度量張量):

\[ g = \begin{pmatrix} E & F \\ F & G \end{pmatrix}, \qquad ds^2 = \begin{pmatrix} du & dv \end{pmatrix} \begin{pmatrix} E & F \\ F & G \end{pmatrix} \begin{pmatrix} du \\ dv \end{pmatrix}. \]

度量張量告訴我們三件事:

  1. 長度:任意切向量的長度由 \(g\) 算出。
  2. 角度:兩個切方向的夾角滿足 \(\cos\theta = \dfrac{\mathbf{a}\cdot\mathbf{b}}{\|\mathbf{a}\|\|\mathbf{b}\|}\) ,而內積全部可用 \(E,F,G\) 表示。
  3. 面積:小塊面積 \(dA = \sqrt{EG - F^2}\, du\, dv\) ,即 \(\sqrt{\det g}\, du\, dv\) 。

注意 \(EG - F^2 = \|\mathbf{r}_u \times \mathbf{r}_v\|^2 \ge 0\) ,當且僅當兩個切向量 線性獨立時為正——這正是參數化「合法」的條件。

SymPy 實作#

先寫一個通用的「第一基本形式計算器」,之後每一節都會重複使用:

import sympy as sp

u, v, R = sp.symbols('u v R', positive=True)

def first_form(r):
    """給定參數曲面 r(u,v),回傳 E, F, G。"""
    ru = [sp.diff(c, u) for c in r]
    rv = [sp.diff(c, v) for c in r]
    dot = lambda a, b: sum(ai*bi for ai, bi in zip(a, b))
    E = sp.simplify(dot(ru, ru))
    F = sp.simplify(dot(ru, rv))
    G = sp.simplify(dot(rv, rv))
    return E, F, G

# --- 球面:u = 經度 phi, v = 餘緯 theta ---
phi, theta = sp.symbols('phi theta', real=True)
sphere = [R*sp.sin(theta)*sp.cos(phi),
          R*sp.sin(theta)*sp.sin(phi),
          R*sp.cos(theta)]
Es, Fs, Gs = first_form(sphere)
print("球面: E =", Es, ", F =", Fs, ", G =", Gs)
# 球面: E = R**2*sin(theta)**2 , F = 0 , G = R**2

# --- 柱面:沿 z 軸半徑 R ---
z = sp.symbols('z', real=True)
cylinder = [R*sp.cos(u), R*sp.sin(u), v]
Ec, Fc, Gc = first_form(cylinder)
print("柱面: E =", Ec, ", F =", Fc, ", G =", Gc)
# 柱面: E = R**2 , F = 0 , G = 1

兩個結果的幾何解讀:

  • 球面:沿緯度方向走 \(d\phi\) ,實際弧長是 \(R\sin\theta\, d\phi\) (緯度圈越靠近 極點越小),所以 \(E = R^2 \sin^2\theta\) ;沿經線走 \(d\theta\) 弧長是 \(R\,d\theta\) , 所以 \(G = R^2\) 。經線與緯線垂直,故 \(F = 0\) 。
  • 柱面:把它攤平成平面紙捲, \(du\) 方向半徑 \(R\) 對應 \(E = R^2\) , \(v\) 方向就是 平面高度 \(G = 1\) ——這預告了柱面與平面「內在一樣」。

有了 \(E, F, G\) ,面積元素就是:

dA_sphere = sp.sqrt(Es*Gs - Fs**2)   # 這是 per (dphi*dtheta) 的係數
print(sp.simplify(dA_sphere))        # R**2*sin(theta)

\(R^2\sin\theta\) 正是球面積分裡那個經典的 \(\sin\theta\) 因子——第一基本形式 自動產生了它。

畫出參數曲面與切向量#

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12, 5))

# 球面
ax1 = fig.add_subplot(121, projection='3d')
th, p = np.meshgrid(np.linspace(0, np.pi, 40),
                    np.linspace(0, 2*np.pi, 60), indexing='ij')
x, y, z = np.sin(th)*np.cos(p), np.sin(th)*np.sin(p), np.cos(th)
ax1.plot_surface(x, y, z, alpha=0.4, color='steelblue')
# 在 theta=pi/3 處畫經線與緯線
p_line = np.linspace(0, 2*np.pi, 100)
ax1.plot(np.sin(np.pi/3)*np.cos(p_line), np.sin(np.pi/3)*np.sin(p_line),
         np.full_like(p_line, np.cos(np.pi/3)), 'r', lw=2)
th_line = np.linspace(0, np.pi, 100)
ax1.plot(np.sin(th_line), np.zeros_like(th_line), np.cos(th_line), 'g', lw=2)
ax1.set_title('sphere: red=latitude, green=meridian')

# 柱面
ax2 = fig.add_subplot(122, projection='3d')
t, h = np.meshgrid(np.linspace(0, 2*np.pi, 60), np.linspace(0, 2, 20), indexing='ij')
ax2.plot_surface(np.cos(t), np.sin(t), h, alpha=0.5, color='orange')
ax2.set_title('cylinder')
plt.tight_layout()
plt.show()

紅色緯線與綠色經線處處垂直——這對應 \(F = 0\) 。你可以用 first_form 驗證任意 自訂曲面的 \(F\) 是不是 0(不是 0 就代表兩個參數方向歪斜了)。

動手實驗:算球面上一條曲線的長度#

在球面( \(R=1\) )上取一條緯線 \(\theta = \pi/3\) 、 \(\phi\) 從 \(0\) 走到 \(\pi/2\) 。 曲線長度公式(第一基本形式沿曲線積分):

\[ L = \int \sqrt{E\, \dot\phi^2 + 2F\,\dot\phi\,\dot\theta + G\, \dot\theta^2}\; dt. \]
t = sp.symbols('t', positive=True)
R_val = 1
E_sub = Es.subs({R: R_val, theta: sp.pi/3})   # 常數,因為 theta 固定
L = sp.integrate(sp.sqrt(E_sub) * sp.diff(sp.pi/2*t, t), (t, 0, 1))
print(sp.simplify(L))    # sqrt(3)*pi/6 = pi/(2*sqrt(3)),沿著 60 度緯線走 90 度經度

# 對照:同一對點之間的大圓(經線)距離是 theta 差 = pi/3(單位球上等於弧度)。
# 比較:pi/6*sqrt(3) ≈ 0.9069 > pi/3 ≈ 1.0472? 留意緯線其實「較長」!
print(float(sp.sqrt(3)*sp.pi/6), float(sp.pi/3))

你會發現沿緯線走的距離 \(\dfrac{\sqrt{3}\pi}{6} \approx 0.907\) 小於 沿經線的 \(\dfrac{\pi}{3} \approx 1.047\) ?不要急著下結論——請檢查方向:這兩個起訖點是 \((\theta{=}\pi/3, \phi{=}0)\) 到 \((\theta{=}\pi/3, \phi{=}\pi/2)\) ,大圓距離其實是 \(2\arcsin(\sin(\pi/3)\sin(\pi/4))\) 。把它算出來:

gc = 2*sp.asin(sp.sin(sp.pi/3)*sp.sin(sp.pi/4))
print(float(gc))   # ≈ 0.7605,比緯線路徑 0.9069 短 → 緯線不是測地線!

大圓才是最短路線(下節詳談測地線),緯線只是「看起來平平的」。機師飛越 高緯度而非沿緯線飛,就是這個原因。

小結與練習#

本節把曲面變成「有度量標尺的座標世界」: \(\mathbf{r}(u,v)\) 給座標, \(\mathbf{r}_u, \mathbf{r}_v\) 給切平面,第一基本形式 \(E\,du^2 + 2F\,du\,dv + G\,dv^2\) 給長度、角度、面積。所有計算只需要 \(E,F,G\) ——這個事實將在 02.3 發展出 驚人的定理。

練習:

  1. 寫出旋轉曲面 \(\mathbf{r}(u,v) = (v\cos u,\; v\sin u,\; f(v))\) 的 \(E, F, G\) , 並驗證 \(F = 0\) 。
  2. 用 first_form 計算環面 \(\mathbf{r}(u,v) = ((2+\cos v)\cos u,\,(2+\cos v)\sin u,\,\sin v)\) 的 \(E,F,G\) 與面積元素,並對整個環面積分求總表面積(提示:應為 \(4\pi^2 \cdot 1 \cdot 2\) ...其實是 \(4\pi^2 \cdot 2 \cdot 1\) ,請自行確認)。
  3. 把實驗改為沿緯線走一整圈( \(\phi: 0 \to 2\pi\) ),比較與大圓路徑的長度差。
  4. 嘗試找一個參數化讓 \(F \ne 0\) (例如把柱面的參數做斜切換 \(. u' = u+v,\ v' = v\) ), 觀察 \(E, F, G\) 如何變化但 \(EG-F^2\) 不變。