跳轉到

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 \wedge dy \]

把它念成「 \(dx\) 楔上 \(dy\) 」。直覺上,你可以把它想像成一個 小平行四邊形的有向面積片:在平面上取 \(dx\) 方向一小步、再取 \(dy\) 方向一小步,張出的面積是多少?這正是行列式在做的事。

反對稱:方向就是邏輯#

楔積最核心的性質是 反對稱(antisymmetry):

\[ dx \wedge dy = - \, dy \wedge dx \]

這不是任意規定,而是幾何的事實:同一塊平行四邊形,若你把繞行方向反過來,它是「同一片面積、相反方向」。就像向量叉積 \(\mathbf{u} \times \mathbf{v} = - \mathbf{v} \times \mathbf{u}\) ,只是這次我們乘的是 微小的測量片 而不是向量。

反對稱立刻帶來一個驚人的推論:任何東西和自己楔積為零。

\[ dx \wedge dx = - \, dx \wedge dx \quad \Longrightarrow \quad dx \wedge dx = 0 \]

(在特徵不為 \(2\) 的域上,把等式兩邊對調光照兩邊即可推出 \(2 \, dx \wedge dx = 0\) 。)

類比:一條線段( \(dx\) )沒有面積;你要張出面積,必須沿 兩個不同方向 走。走到同一個方向兩次,就會把你帶回原點,什麼面積都不剩。這正是「面積張量不會量到線」這件事的代數化身。

行列式即 2-form 的面積#

設平面上有兩個小向量 \(u = (u_1, u_2)\) 、 \(v = (v_1, v_2)\) ,則

\[ (u_1 \, dx + u_2 \, dy) \wedge (v_1 \, dx + v_2 \, dy) = (u_1 v_2 - u_2 v_1) \, dx \wedge dy \]

前面的係數 \(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 \]

是 有向體積片。 \(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,讓形式成為可以計算的一級物件。

練習

  1. 令 \(u = 3\,dx - 2\,dy\) 、 \(v = x\,dx + y\,dy\) ,展開 \(u \wedge v\) 並確認係數等於 \(\det \begin{pmatrix} 3 & x \\ -2 & y \end{pmatrix}\) 。
  2. 在 diffgeom 中定義 \(dx \wedge dy \wedge dz\) ,驗證它作用在 \((\partial_x, \partial_y, \partial_z)\) 上為 \(1\) ,作用在交換後的順序上變 \(-1\) 。
  3. (思考)為什麼「面積」需要符號(正負)?用「有向面積可以表示累積與抵銷」舉一個物理例子來解釋。