06.2 座標卡與圖冊#
本節目標#
- 理解座標卡(chart)、圖冊(atlas) 與轉換函數(transition map) 的意義。
- 用「地圖集」比喻掌握這三個概念。
- 看懂奇點:座標卡在某些點失效(球面的北極、角度 \(\phi\) 的重疊)。
- 用 SymPy
diffgeom的Manifold與CoordSystem建立球面兩種座標系,並寫出 transition map 實現互換。
直覺:地球地圖集是現成的教材#
你房間裡的地球儀、你的地圖集,其實就是一本真實的「流形操作手冊」。
- 地球整體不是平面,不能一張紙蓋住( Africans 周圍的形狀總會拉歪)。
- 地圖集裡的每一頁(例如「東亞」、「歐洲」)表示地球的一小塊,這一頁能攤平在地圖桌上。這就是座標卡(chart)。
- 所有頁合起來蓋住地球,這整套就是圖冊(atlas)。
- 兩頁交界處(例如「東亞」與「南亞」的接縫),同一個地點出現在兩頁上,你必須知道兩張地圖上的座標如何互換,這就是轉換函數(transition map)。
座標卡不是「畫面」,而是「座標規則」。 一張座標卡 \(=\) 一小塊鄰域 \(\cup\) 一個把這塊鄰域映射到 \(\mathbb{R}^n\) 的規則。可以直觀想成:「在這片小地方,用這幾個數字當門牌號碼」。
在數學上,一個 \(n\) 維流形 \(M\) 的座標卡是一對 \((U, \varphi)\) ,其中:
- \(U \subset M\) 是一個開集(一小塊地區),
- \(\varphi: U \to \varphi(U) \subseteq \mathbb{R}^n\) 是一個同胚(連續雙射,逆連續)。
兩張卡 \((U, \varphi)\) 與 \((V, \psi)\) 交疊( \(U \cap V \neq \emptyset\) )時,對 \(p \in U\cap V\) 有:
這在 \(\mathbb{R}^n\) 上是一個普通函數(可以用一般微積分處理),稱為轉換函數。它必須光滑,這條件就成了光滑流形的定義。
奇點:某座標卡失效的地方#
座標卡不是萬能,在特定點它們會「打架」。
例子 1:球面的經緯度#
球面 \(S^2\) 想用經緯度 \((\theta, \phi)\) :
- \(\theta\) :極角(0 到 \(\pi\) ,北極到南極)
- \(\phi\) :方位角( \(-\pi\) 到 \(\pi\) )
失效點在哪?
- 北極( \(\theta = 0\) ):北極的所有 \(\phi\) 值都是同一個點(北極只有一個)。也就是 \(\phi\) 在北極這一點不唯一。類似地,南極也是失效點。
- 方位角 \(\phi\) 的接縫( \(\phi = \pi\) 與 \(\phi = -\pi\) ):這是同一條子午線,但座標數值不同。
graph LR
A[一張座標卡] -->|可以| B[大範圍、沒奇點<br>例如東半球 $x$ 當座標]
A -->|會失效| C[某些點<br>例如北極 $\theta=0$]
C --> D[phi 所有值 = 同一個點]
C --> E[解法:換另一張座標卡]
E --> F[另一張卡在北極附近仍有效]
F --> G[兩張卡交疊處有 transition map]例子 2:投影座標卡#
另一張球面卡可以用「平面投影」:從北極看球面沿射線投到赤道平面。這張卡在北極以外的所有點都有唯一定義,卻在北極本身失效。反過來,從南極投影的卡在北極以外失效。
兩張卡加起來蓋住球面(北極有一張、南極不會用到同樣的失敗點)。這是標準教科書範例。
重要觀念#
奇點不是流形的問題,是座標的問題。 北極並不特別彎或不光滑,球面是完美的光滑流形。是我們選的座標在那一點不適用。這就像地圖集的每一頁有邊界,邊界處不是地球出了問題,是這一頁你不該用。
SymPy:Manifold、Patch 與 CoordSystem#
SymPy 的 sympy.diffgeom 提供以下工具:
| 概念 | SymPy 類別 |
|---|---|
| 流形 | Manifold |
| 局部片(同一流形開子集) | Patch |
| 座標卡 | CoordSystem |
| 轉換函數 | CoordSystem 的 connect_to / transitions |
注意:隨 sympy 版本更迭,CoordSystem 的建構介面有差異(舊版要指定 relations,新版可用更簡單的參數)。以下以通用寫法示範。
球面兩種座標系:Spherical 與 Cartesian(內在角度看 \(S^2\) 的嵌入座標)#
為簡化,我們把球面 \(S^2\) 放進 \(\mathbb{R}^3\) ,並比較球面座標 \((\theta,\phi)\) ** 與一種投影座標**。用 connect_to 定義 transition。
from sympy import symbols, sin, cos, pi, simplify
from sympy.diffgeom import Manifold, Patch, CoordSystem
# 1. 流形與局部片
m = Manifold('Sphere2', 2)
patch = Patch('patch', m)
# 2. 兩種座標卡的參數
theta, phi = symbols('theta phi', real=True) # 球面座標
u, v = symbols('u v', real=True) # 投影樣座標(以 x,y 表示)
# 3. 座標卡 1:球面座標
spherical = CoordSystem('spherical', patch, [theta, phi])
# 其在 R^3 的嵌入公式(可用於和另一協調比對)
x_sph = sin(theta)*cos(phi)
y_sph = sin(theta)*sin(phi)
z_sph = cos(theta)
# 4. 座標卡 2:(u, v) 這裡當成赤道平面座標 (x, y)(以球面座標表出)
# 給定一點 (x, y) 在赤道投影上,球面座標為 phi = atan2(y, x), sin(theta) = sqrt(x^2+y^2)
import sympy as sp
X, Y = symbols('X Y', real=True)
r2 = X**2 + Y**2 # sin(theta)^2
# 轉回球面角度
theta_from_xy = sp.acos(sp.sqrt(1 - r2)) # theta = arccos(sqrt(1-x^2-y^2))
phi_from_xy = sp.atan2(Y, X)
這段程式顯示了 transition map 的精神:** \((\theta, \phi) \leftrightarrow (X, Y)\) 是兩組符號互換的規則**。實際上 diffgeom 允許兩個 CoordSystem 之間互相 connect_to,使 transitions 存查表裡定義兩方法。
更完整的寫法:用 connect_to#
from sympy import atan, atan2, sqrt
# 定義 spherical -> XY 的轉換
XY_sys = CoordSystem('XY', patch, [X, Y])
# connect_to:從 spherical 到 XY
# 在 spherical 中,X = sin(theta)*cos(phi), Y = sin(theta)*sin(phi)
sph_to_xy = [sin(theta)*cos(phi), sin(theta)*sin(phi)]
xy_to_sph = [atan2(Y, X), sqrt(X**2 + Y**2)] # phi, sin(theta)(第 2 個用 r 代表 sin(theta))
# 簡化示範:讓兩協調互換一個點(th=pi/4, ph=pi/3)
from sympy import Rational
th_v, ph_v = Rational(1,4)*pi, pi/3
x1 = sp.N(sin(th_v)*cos(ph_v))
y1 = sp.N(sin(th_v)*sin(ph_v))
th_back = sp.N(atan2(y1, x1))
print('原點球面 (theta, phi) =', th_v, ph_v)
print('轉到 (X, Y) =', x1, y1)
print('轉回 (theta) 以 atan2 給的是 phi =', th_back)
這段程式精神上是「換頁」:用同一個球面上的點,先以球面卡描述,再翻到 \((X, Y)\) 卡,再翻回球面卡。
球面 ↔ 直角座標的 transition(最多人用)#
如果你把球面放進 \(\mathbb{R}^3\) ,最常看到的 transition 是球面 ↔ 直角座標:
在球面 \(r=1\) 上這個 transition 縮成 \((\theta,\phi) \leftrightarrow (x,y,z)\) ,但外在有約束 \(x^2+y^2+z^2=1\) ,所以 \((x,y,z)\) 並不是 3 個獨立座標。
動手實驗#
實驗 1:同一點兩種座標描述
在球面上取同一點,用 \((\theta, \phi)\) 與 \((x, y)\) (赤道投影)兩種描述:
from sympy import symbols, sin, cos, sqrt, atan2, N, pi
# 取球面上一點:theta=pi/4(緯度45度)、phi=pi/3
theta_v, phi_v = pi/4, pi/3
# 球面卡描述
print('球面卡:theta =', N(theta_v), ', phi =', N(phi_v))
# 換到平面投影卡 (x, y)
x_v = sin(theta_v)*cos(phi_v)
y_v = sin(theta_v)*sin(phi_v)
print('平面卡:X =', N(x_v), ', Y =', N(y_v))
# 從平面卡換回球面卡
theta_back = atan2(sqrt(x_v**2 + y_v**2), x_v) # 這其實是 atan2航道,可拿 phi 再回 theta
phi_back = atan2(y_v, x_v)
print('換回 (r 這一號.theta):', N(sqrt(x_v**2 + y_v**2)), ', phi =', N(phi_back))
你該看到 \(\phi\) 換回 \(\pi/3\) ,證明 transition map 雙向一致。
實驗 2:找出北極的失效
試著在北極 \(\theta = 0\) 檢查 \((\theta, \phi)\) :
from sympy import pi, sin, cos, N
theta_v, phi_v = 0, 3*pi/4
print('球面參數化 (theta=0):')
print(' x =', N(sin(0)*cos(phi_v))) # 0
print(' y =', N(sin(0)*sin(phi_v))) # 0
print(' z =', N(cos(0))) # 1
無論 \(\phi\) 是 \(0\) 、 \(\pi/4\) 、 \(3\pi/4\) , \((x,y,z)\) 都是 \((0, 0, 1)\) 。** \(\phi\) 失效**。這就是這一點你必須換另一張卡的原因。
實驗 3:transition map 的可逆性
transition map 必須是雙射。以球面 ↔ 投影為例,請寫一段程式:
- 從 \((\theta,\phi)\) 轉到 \((X, Y)\) 。
- 從 \((X, Y)\) 轉回 \((\theta, \phi)\) 。
- 比較起點和終點,確認相等。
挑 5 個不同點(要避開北極)測試,確認往返一致。
實驗 4:自訂一種新座標卡
在環面 \(T^2\) 上,你也應該能定義兩種座標卡(如大環距離 \(u\) 、小環距離 \(v\) )與它們的 transition。雖然 diffgeom 本身也內建環面(sympy.diffgeom 有相關範例),試著自己寫一次 Manifold / Patch / CoordSystem,把 \((u, v)\) 定義為你的第一張卡,感覺一下這套 API 的節奏。
小結與練習#
- 座標卡 = 局部鄰域 + 映上 \(\mathbb{R}^n\) 的規則。
- 圖冊 = 一組蓋住整個流形的座標卡。
- 轉換函數定義光滑性,是把不同卡上同一點的座標互換的規則。
- 奇點是座標失效,不是流形壞掉。
- SymPy
diffgeom用Manifold/Patch/CoordSystem(與transitions)表現這些概念。
練習:
- 請自己動手在 SymPy 中定義球面的兩張座標卡:一張用北極投影、一張用南極投影。確認:兩張卡合起來蓋住球面。
- 環面 \(T^2\) 的 \((u, v)\) 座標卡在哪些點失效?試著推導,並與本節球面例子對照。
- 所有 transition map 都是可逆的。如果有一張卡在某點失效,那 transition 在哪些座標值上會尖斷或不可微?舉例說明。
- 用 SymPy 驗證:球面座標 \((\theta,\phi)\) 換到直角座標 \((x, y, z)\) 再換回來,是否與原值一致(限制在 \(\theta \in (0, \pi)\) 且不過南北極)?在北極上做同樣測試,觀察失敗。
- 試著用 mermaid 畫一張說明「圖冊中兩卡交疊,transition map 如何作用」的圖,內容包含 \(U\) 、 \(V\) 、 \(\varphi\) 、 \(\psi\) 、 \(\varphi\circ\psi^{-1}\) 等元素。