5.1 楔積與外代數:反對稱的結構#
本節目標#
- 理解為什麼要發明 微分形式:把「積分什麼」寫成幾何物件
- 學會楔積(wedge product)的兩條關鍵規則:反對稱與線性
- 看懂「行列式 = 2-form 的面積」、「3-form = 有向體積」這個直覺
- 用 SymPy 的
diffgeom模組建立流形、座標系,並操作 \(dx \wedge dy\) 這類形式 - 動手實驗:驗證 \(dx \wedge dx = 0\) ,體會反對稱的威力
動機:把積分對象做成「物件」#
回想第 3、4 章的計算:曲線積分 \(\int_C F \cdot dr\) 、通量 \(\iint_S F \cdot dS\) 、面積 \(\iint_D dA\) 。這些積分符號裡的 \(dr\) 、 \(dS\) 、 \(dA\) 過去只是「記號」,但微积分形式(differential forms)的主張是:它們是真正可以被相乘、被微分的代數物件。
在高維度統一這些語言的關鍵,就是本章的新乘法 —— 楔積:
把它念成「 \(dx\) 楔上 \(dy\) 」。直覺上,你可以把它想像成一個 小平行四邊形的有向面積片:在平面上取 \(dx\) 方向一小步、再取 \(dy\) 方向一小步,張出的面積是多少?這正是行列式在做的事。
反對稱:方向就是邏輯#
楔積最核心的性質是 反對稱(antisymmetry):
這不是任意規定,而是幾何的事實:同一塊平行四邊形,若你把繞行方向反過來,它是「同一片面積、相反方向」。就像向量叉積 \(\mathbf{u} \times \mathbf{v} = - \mathbf{v} \times \mathbf{u}\) ,只是這次我們乘的是 微小的測量片 而不是向量。
反對稱立刻帶來一個驚人的推論:任何東西和自己楔積為零。
(在特徵不為 \(2\) 的域上,把等式兩邊對調光照兩邊即可推出 \(2 \, dx \wedge dx = 0\) 。)
類比:一條線段( \(dx\) )沒有面積;你要張出面積,必須沿 兩個不同方向 走。走到同一個方向兩次,就會把你帶回原點,什麼面積都不剩。這正是「面積張量不會量到線」這件事的代數化身。
行列式即 2-form 的面積#
設平面上有兩個小向量 \(u = (u_1, u_2)\) 、 \(v = (v_1, v_2)\) ,則
前面的係數 \(u_1 v_2 - u_2 v_1\) 正是 \(2 \times 2\) 行列式 \(\det \begin{pmatrix} u_1 & v_1 \\ u_2 & v_2 \end{pmatrix}\) 。所以:
- 行列式不是技巧,而是楔積的自動產物:把兩個 1-form 相乘,反對稱規則自動替你算出帶號面積。
- 变數代換公式(Jacobian)也因此變得自然:若 \((x, y)\) 對 \((u, v)\) 的變換滿足 \(dx \wedge dy = J \, du \wedge dv\) ,則積分換元就乘上 \(|J|\) 。楔積 自動記錄了鏈鎖法則與方向翻轉。
同樣地,在三維中:
是 有向體積片。 \(dx \wedge dy \wedge dz = dy \wedge dx \wedge dz = - \, dz \wedge dy \wedge dx\) :交換任何兩個因子會改變正負號,於是三個因子的排序方式正好對應 \(3!\) 種方向。至於更高次,例如在 3 維中的 \(dx \wedge dy \wedge dx\) ,因為有兩個 \(dx\) ,立刻為零 —— 在 \(n\) 維空間中,超過 \(n\) 次的形式必然為零,因為你不可能在 3 維裡張出 4 維體積。
k-form 的世界:階梯剖面#
| 階數 k | 名稱 | 幾何對象 | 例 |
|---|---|---|---|
| \(0\) | 函數 | 點上的量 | \(f\) |
| \(1\) | 1-form | 有向線段 / 功片 | \(dx\) 、 \(P\,dx + Q\,dy\) |
| \(2\) | 2-form | 有向面積片 | \(dx \wedge dy\) 、通量 |
| \(3\) | 3-form | 有向體積片 | \(dx \wedge dy \wedge dz\) |
外代數就像一個 階梯: \(k\) -form 住在一層,楔積讓你往上爬 \(p + q\) 層( \(p\) -form 楔 \(q\) -form 得 \((p+q)\) -form),但爬到屋頂( \(n\) 維的 \(n\) -form)之上就什麼都沒有。
SymPy 實戰:diffgeom 中的流形與形式#
sympy.diffgeom 把這套語言做成程式:先宣告流形與座標系,再用 WedgeProduct 楔積、Differential 外微分。
from sympy.diffgeom import Manifold, Patch, CoordinateSystem, WedgeProduct, Differential
from sympy.diffgeom.rn import R2, R3 # 內建的 R^2、R^3 預設流形
from sympy import simplify
# 自行定義一個三維歐氏流形
m3 = Manifold('R3_ours', 3)
p3 = Patch('patch', m3)
cart = CoordinateSystem('cartesian', p3, ['x', 'y', 'z'])
(x, y, z) = cart.coord_functions()
(dx, dy, dz) = cart.base_oneforms()
# 反對稱
w1 = WedgeProduct(dx, dy)
w2 = WedgeProduct(dy, dx)
print(simplify(w1 - w2)) # 不是 0 的「物件差」,需透過展開比較
# 用展開(ungroup)與係數比較驗證 dx ∧ dy = - dy ∧ dx
print(simplify(WedgeProduct(dx, dy) + WedgeProduct(dy, dx))) # 0-form 部分為 0
WedgeProduct(dx, dy) 會印成 WedgeProduct(Differential(x), Differential(y)) 這種相依表示;真正的係數要靠「作用在基底向量場上」或逐步展開來讀。本書後續會反覆用到 rn 預設的 R2 與 R3:
from sympy.diffgeom.rn import R2
R2x, R2y = R2.coord_functions()
R2dx, R2dy = R2.base_oneforms()
area_form = WedgeProduct(R2dx, R2dy)
print(area_form)
# WedgeProduct(Differential(x), Differential(y))
注意 Differential(x) 就是 \(df\) 的表示 —— SymPy 把 \(dx\) 定義為「座標函數的外微分」,這和第 5.2 節將要介紹的 \(d\) 完全一致。形式真的是一級物件,可以相加、相乘、之後還可以被微分。
SymPy 怎麼「讀出」形式的係數?#
一個 2-form 作用在兩個向量場上是個數。利用 base_vectors() 可以定點檢查:
ex, ey, ez = cart.base_vectors() # 基底向量場 ∂/∂x, ∂/∂y, ∂/∂z
# 2-form 作用在兩個向量場 => 標量(此處是常數函數)
print(WedgeProduct(dx, dy)(ex, ey)) # 1
print(WedgeProduct(dx, dy)(ey, ex)) # -1
print(WedgeProduct(dx, dx)(ex, ex)) # 0 <- 方向自己楔自己,面積為零
print(WedgeProduct(dx, dz)(ex, ey)) # 0 <- dy 方向張不出來
這幾行就是楔積的「顯微鏡」: \(dx \wedge dy\) 量的是單位方格 \((1,1)\) ,量到斜向對角 \((\partial_y, \partial_x)\) 就變負號,量到重複方向就是零。
動手實驗:驗證 \(dx \wedge dx = 0\)#
from sympy.diffgeom import Manifold, Patch, CoordinateSystem, WedgeProduct
from sympy import simplify
m = Manifold('E2', 2)
p = Patch('p', m)
cs = CoordinateSystem('c', p, ['x', 'y'])
dx, dy = cs.base_oneforms()
e_x, e_y = cs.base_vectors()
# 實驗 1:自己楔自己
print(WedgeProduct(dx, dx)(e_x, e_y))
# 0 —— 反對稱逼出的必然
# 實驗 2:2 維中的 3-form —— 一切都塌回零
# 三個因子 dx ∧ dy ∧ dy 一定有重複方向
print(WedgeProduct(dx, dy)(e_x, e_y)) # 1:2-form 本身還有戲
print(WedgeProduct(dx, dx)(e_x, e_y)) # 0:重複因子必為零
# 實驗 3:行列式即楔積係數 —— 用極座標換元驗證
from sympy import symbols, cos, sin, Matrix
r, th = symbols('r th')
# x = r cosθ, y = r sinθ 的 Jacobian
J = Matrix([[cos(th), -r*sin(th)],
[sin(th), r*cos(th)]])
print(J.det()) # r —— 這就是 dxdy = r dr dθ 的來源
print(simplify(J.det()))
# r
觀察重點: 1.
WedgeProduct(dx, dx)作用在任何向量對上都給 \(0\) —— 這是程式寫出的「反對稱」事實。 2. 行列式不需要「適配技巧」—— 它從基底變換的係數矩陣中 自動掉出來,這正是楔積替我們記錄的。 3. 在 \(n\) 維中,第 \(n+1\) 層的樓梯消失了:不可能在 2 維裡張 3 維體積。觀察重點: 1.
WedgeProduct(dx, dx)作用在任何一對向量上都給 \(0\) —— 這是程式寫出的「反對稱」事實。 2. 行列式不需要「算」—— 它從楔積的展開中 自動掉出來。 3. 在 \(n\) 維中,第 \(n+1\) 層的樓梯消失了。
小結與練習#
小結
- 微分形式是把「積分什麼」變成代數物件的語言;楔積是新的乘法。
- 反對稱 \(dx \wedge dy = - \, dy \wedge dx\) 是幾何(方向翻轉)的代數化身,並立刻迫使 \(dx \wedge dx = 0\) 。
- 行列式是楔積展開的自動產物: \(2\) -form 量有向面積、 \(3\) -form 量有向體積。
- SymPy 的
diffgeom提供Manifold、Patch、CoordinateSystem、WedgeProduct、Differential,讓形式成為可以計算的一級物件。
練習
- 令 \(u = 3\,dx - 2\,dy\) 、 \(v = x\,dx + y\,dy\) ,展開 \(u \wedge v\) 並確認係數等於 \(\det \begin{pmatrix} 3 & x \\ -2 & y \end{pmatrix}\) 。
- 在
diffgeom中定義 \(dx \wedge dy \wedge dz\) ,驗證它作用在 \((\partial_x, \partial_y, \partial_z)\) 上為 \(1\) ,作用在交換後的順序上變 \(-1\) 。 - (思考)為什麼「面積」需要符號(正負)?用「有向面積可以表示累積與抵銷」舉一個物理例子來解釋。