跳轉到

8.2 格林、斯托克斯與高斯積分定理#

學習動機#

8.1 節我們有三個局部的算子:梯度、散度、旋度。它們回答的是「在這一點附近,場的結構如何」。

但 19 世紀的物理學家真正想要的問題是全域的:

整個地球表面的磁通量是多少?
繞著一根導線轉一圈的電位差是多少?
一個封閉區域邊界上的總流量是多少?

這些問題的共同特徵是:它們問的是「沿著一個邊界」的量,但答案卻由「邊界內部的場」決定。 這正是積分定理的威力——它們把「彎曲的邊界上的積分」換成「平坦的內部上的積分」。

三個定理,三個版本:

定理 年份 邊界是 內部是 物理意義
格林定理 1828 / 1831 平面上的一條閉曲線 平面上的一個區域 二維的「邊界決定內部」
斯托克斯定理 1851 空間中的一條閉曲線 空間中的一個曲面 磁場沿閉合路徑的循環量
高斯積分定理 1835 空間中的一個閉曲面 空間中的一個立體 磁通量 = 內部磁荷總量

本節要做三件事:

  1. 各自的歷史:Green 是 1828 年靠自學成才的「磨坊主數學家」;Stokes 是 1851 年在劍橋的「史密斯獎」競賽中,在 Kelvin 的建議下做出的推廣;Gauss 是 1835 年在研究地磁時為節省「物理學家的勞動」而推出的。
  2. 共同的結構:三者都是「局部算子的積分 = 邊界上的積分」,只是維度不同、算子不同。
  3. 統一的視角:它們其實是同一個定理——斯托克斯定理——的三個特例或推論。

SymPy 目標:用 sp.integrate 與 sp.diff 把三個定理逐字驗證(不是驗證特例,而是驗證一般的敘述),並用數值多邊形逼近把「區域面積 \(=\oint_C x\,\mathrm{d}y\) 」這個著名的格林推論算出來。


8.2.1 格林定理(1828 / 1831):一位自學成才者的定理#

George Green 的生平#

George Green(1793–1841)是英國諾丁漢的一個磨坊主兼棉花商。他自學數學,靠的是一整套法國的著作——其中最關鍵的是 Laplace 與 Poisson 關於位能的論文。

1828 年,Green 出版了一本自費印刷的小冊子,題為《論數學分析對電學與磁學理論的應用》(An Essay on the Application of Mathematical Analysis to the Theories of Electricity and Magnetism)。這本冊子的第二部分裡,包含後來被稱為格林定理的結果:

\[ \oint_C (P\,\mathrm{d}x + Q\,\mathrm{d}y) = \iint_D \left( \frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y} \right) \mathrm{d}A \]

其中 \(C\) 是區域 \(D\) 的邊界(取逆時針方向)。

1828 年的小冊子幾乎無人問津——直到 1831 年,Green 親自帶著它去了劍橋,被重新出版在《劍橋哲學學報》上,並得到當時數學界權威 William Hopkins 的好評。Green 在 1837 年當選皇家學會會士,但一年後就因病去世,年僅 45 歲。

格林定理說了什麼?#

用最直白的話說:

沿著區域邊界繞一圈的「流動總量」,等於把區域內部每一點的「局部流動密度」加起來。

\(P\,\mathrm{d}x + Q\,\mathrm{d}y\) 的物理意義是:向量場 \(\mathbf{F} = (P, Q)\) 沿路徑做的功(或流體的流量)。右邊的 \(\partial Q/\partial x - \partial P/\partial y\) 正是二維的旋度(8.1 節說過:在二維裡旋度只有 \(z\) 分量)。

所以格林定理就是二維版的斯托克斯定理。它也立刻給出一個漂亮的推論:取 \(P = -y/2,\ Q = x/2\) ,則旋度處處為 \(1\) ,於是

\[ \oint_C \left(-\frac{y}{2}\,\mathrm{d}x + \frac{x}{2}\,\mathrm{d}y\right) = \iint_D 1\,\mathrm{d}A = \mathrm{Area}(D) \]

而更有名的版本是取 \(P = 0,\ Q = x\) :

\[ \boxed{\ \mathrm{Area}(D) = \oint_C x\,\mathrm{d}y = -\oint_C y\,\mathrm{d}x\ } \]

這就是「用曲線積分算面積」——Green 在 1828 年就已經知道了。

我們先用 SymPy 把這兩件事都算出來。

import sympy as sp

x, y, t = sp.symbols('x y t', real=True)

# ================= 格林定理 =================
# ∮_C (P dx + Q dy) = ∬_D (Q_x - P_y) dA
P = -y / 2
Q = x / 2
print('P =', P, '   Q =', Q)
print('Q_x - P_y =', sp.simplify(sp.diff(Q, x) - sp.diff(P, y)))

# 左邊:沿單位圓 C: x = cos t, y = sin t 的循環積分
xs, ys = sp.cos(t), sp.sin(t)
dx, dy = sp.diff(xs, t), sp.diff(ys, t)
circ = sp.integrate((P * dx + Q * dy).subs({x: xs, y: ys}), (t, 0, 2 * sp.pi))
print('左邊 ∮_C (P dx + Q dy) =', sp.simplify(circ))

# 右邊:單位圓盤 D 上的二重積分(limits 由外而內:先 y 後 x)
dA = sp.integrate(sp.diff(Q, x) - sp.diff(P, y),
                  (y, -sp.sqrt(1 - x**2), sp.sqrt(1 - x**2)), (x, -1, 1))
print('右邊 ∬_D (Q_x - P_y) dA =', sp.simplify(dA))
print('兩邊相等?', sp.simplify(circ - dA) == 0)

print()
print('--- 面積公式(格林定理的推論):Area(D) = ∮_C x dy = -∮_C y dx ---')
print('∮ x dy  =', sp.simplify(sp.integrate((x * dy).subs({x: xs, y: ys}), (t, 0, 2 * sp.pi))))
print('-∮ y dx =', sp.simplify(sp.integrate((-y * dx).subs({x: xs, y: ys}), (t, 0, 2 * sp.pi))))

預期輸出:

P = -y/2    Q = x/2
Q_x - P_y = 1
左邊 ∮_C (P dx + Q dy) = pi
右邊 ∬_D (Q_x - P_y) dA = pi
兩邊相等? True

--- 面積公式(格林定理的推論):Area(D) = ∮_C x dy = -∮_C y dx ---
∮ x dy  = pi
-∮ y dx = pi

SymPy 的一個技術細節:sp.integrate(expr, (y, ...), (x, ...)) 的 limits 順序代表「先積 y,再積 x」,也就是內層先寫。這與 7.3 節的約定一致。若寫成 (x, -1, 1), (y, -sqrt(1-x^2), ...),SymPy 會把 \(y\) 當成外層變數,得到未求值的中間結果 4*sqrt(1 - x**2),而不是 \(\pi\)。

格林定理的另一個重要推論:把 \(P, Q\) 換成位能相關的形式,可以得到格林第一恆等式與格林第二恆等式:

\[ \iint_D \left( f \nabla^2 g - g \nabla^2 f \right)\mathrm{d}A = \oint_C \left( f \frac{\partial g}{\partial n} - g \frac{\partial f}{\partial n} \right)\mathrm{d}s \]

這兩條恆等式在 10.2 節(柯西積分定理)會以複變數的形式重新出現。


8.2.2 斯托克斯定理(1851):史密斯獎競賽與 Kelvin 的建議#

一場「可以被規劃」的競賽#

1851 年,劍橋大學頒發史密斯獎(Smith's Prize)——這是當時劍橋最高的學生數學競賽。評審 William Thomson(後來的 Kelvin 勳爵,開爾文爵士)出的題目是:

把格林定理從平面推廣到空間中的曲面。

James Clerk Stokes(1819–1903,當時是劍橋的盧卡斯講席教授)把這個題目做成了他一生最重要的定理,並在 1851 年發表於《劍橋與都柏林數學雜誌》。後人便把它稱為 Stokes 定理。

定理的內容是:若 \(C\) 是曲面 \(S\) 的邊界(取與法向量 \(\mathbf{n\) 右手相應的方向),\(S\) 上的向量場 \(\mathbf{F}\) 連續可微,則

\[ \oint_C \mathbf{F} \cdot \mathrm{d}\mathbf{r} = \iint_S (\nabla \times \mathbf{F}) \cdot \mathbf{n}\,\mathrm{d}S \]

左邊:沿著閉合曲線 \(\mathbf{F}\) 做的總功(循環量)。 右邊:曲面上每點的「局部渦度」乘上法向分量後加總。

用一句話說:「繞一圈的總循環量」等於「面內所有局部渦度之和」。

物理意義:Faraday 感應定律#

Stokes 定理在電磁學裡最重要的應用,是把它和 Faraday 感應定律放在一起:

\[ \oint_C \mathbf{E} \cdot \mathrm{d}\mathbf{r} = -\frac{\mathrm{d}\Phi_B}{\mathrm{d}t} \qquad\text{(Faraday 感應定律)} \]

而由斯托克斯定理,

\[ \oint_C \mathbf{E} \cdot \mathrm{d}\mathbf{r} = \iint_S (\nabla \times \mathbf{E}) \cdot \mathbf{n}\,\mathrm{d}S \]

兩式合併,得到

\[ \boxed{\ \nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t}\ } \]

這是 Maxwell 方程組的第二條,也是「變化的磁場產生電場」的數學表達。於是 Maxwell 能夠說:「只要在空間中放一個導線線圈,裡面就會有電流——因為穿過線圈的磁通量在變化。」

一個關鍵的方法論:不必真的去算曲面積分#

用 SymPy 驗證斯托克斯定理時,有一個非常漂亮的策略:故意選一個難以積分的曲面(例如半球面),但選一個容易積分的邊界(圓),然後比較兩邊。如果定理成立,兩邊必然相等——而且我們只算了簡單的那一邊。

import sympy as sp

x, y, z, t = sp.symbols('x y z t', real=True)
u, v = sp.symbols('u v', real=True)

# ================= 斯托克斯定理 =================
# ∮_C F·dr = ∬_S (curl F)·n dS
# 取 S 為上半球面 z = sqrt(1-x^2-y^2),邊界 C 為單位圓(逆時針,位於 z = 0)

F = sp.Matrix([-y, x, 0])
curlF = sp.Matrix([
    sp.diff(F[2], y) - sp.diff(F[1], z),
    sp.diff(F[0], z) - sp.diff(F[2], x),
    sp.diff(F[1], x) - sp.diff(F[0], y),
])
print('F =', F.T)
print('curl F =', curlF.T)

# 邊界循環積分:r(t) = (cos t, sin t, 0)
r = sp.Matrix([sp.cos(t), sp.sin(t), 0])
dr = r.diff(t)
circ = sp.integrate((F.T * dr)[0].subs({x: sp.cos(t), y: sp.sin(t), z: 0}), (t, 0, 2 * sp.pi))
print()
print('邊界循環積分 ∮_C F·dr =', sp.simplify(circ))

# 曲面積分:參數化 r(u,v) = (u, v, sqrt(1-u^2-v^2)),法向量取 ru × rv(指向 +z)
z_surf = sp.sqrt(1 - u**2 - v**2)
ru = sp.Matrix([1, 0, sp.diff(z_surf, u)])
rv = sp.Matrix([0, 1, sp.diff(z_surf, v)])
n = ru.cross(rv)
print('ru × rv =', n.T)
integrand = (curlF.T * n)[0]
surface = sp.integrate(integrand.subs({x: u, y: v, z: z_surf}),
                        (v, -sp.sqrt(1 - u**2), sp.sqrt(1 - u**2)), (u, -1, 1))
print('曲面積分 ∬_S (curl F)·n dS =', sp.simplify(surface))
print('兩者相等?', sp.simplify(circ - surface) == 0)

預期輸出:

F = Matrix([[-y, x, 0]])
curl F = Matrix([[0, 0, 2]])

邊界循環積分 ∮_C F·dr = 2*pi
ru × rv = Matrix([[u/sqrt(-u**2 - v**2 + 1), v/sqrt(-u**2 - v**2 + 1), 1]])
曲面積分 ∬_S (curl F)·n dS = 2*pi
兩者相等? True

技術要點:曲面的法向量怎麼算? 我們把曲面參數化為 \(\mathbf{r}(u, v)\),然後取偏導向量的叉積:

\[ \mathbf{n}\,\mathrm{d}S = \left( \frac{\partial \mathbf{r}}{\partial u} \times \frac{\partial \mathbf{r}}{\partial v} \right) \mathrm{d}u\,\mathrm{d}v \]

這是「向量面積元素」的公式。方向由叉積的順序決定:若要外法向量,就讓參數化保持右手定向。這一點在 Stokes 定理裡是生死攸關的——方向弄反,兩邊會差一個負號。

順帶注意 ru × rv 的 \(z\) 分量恆為 \(1\):因為曲面是「圖形」\(z = f(x,y)\),參數化 \(\mathbf{r}(u,v) = (u, v, f(u,v))\) 的兩個切向量都與 \(z\) 軸無關,所以叉積的 \(z\) 分量就是 \(1\),法向量的水平分量則由曲面的斜率給出。


8.2.3 高斯積分定理(1835):為了省下「物理學家的勞動」#

Gauss 的磁學計畫#

1835 年,Gauss 完成了他稱為「磁學的理論與觀測」的大部分,發表了著名的〈論以距離平方的反比作用之吸引與排斥力的一般定理〉(Allgemeine Lehrsätze in Beziehung auf die im verkehrten Verhältnisse des Quadrats der Entfernung wirkenden Anziehungs- und Abstossungskräfte)。在這篇(以及他相關的通訊)裡,Gauss 把「磁場」正式定義成一個向量場 \(\mathbf{B}\),並且證明了:

\[ \oiint_{\partial V} \mathbf{B} \cdot \mathbf{n}\,\mathrm{d}S = \iiint_V (\nabla \cdot \mathbf{B})\,\mathrm{d}V \]

這就是高斯積分定理(散度定理)。

Gauss 自己的動機非常實際。他當時在做的是地磁測量:要在全球範圍內測出磁場的各個分量,然後推算地球內部的「磁荷」分布。他發現,若要從零散的測量資料算出地球表面的磁通量,物理學家必須付出「極其可觀的勞動」(這是 Gauss 原文的語氣)。有了散度定理,這項工作就變成了一件局部化的事:只要知道內部的磁荷密度,通量就是它們的總和。這是積分定理的第一個「實用」版本,也是 Gauss 把它當成「省力工具」而非「定理」來對待的典型例子。

兩個數學史上的插曲#

  • Ostrogradsky(1835) 也獨立導出了同一個定理(在俄羅斯),所以俄國教材至今仍稱它為 Ostrogradsky–Gauss 定理。
  • 高斯在世時並未以現在的形式完整發表這個定理;它是在他 1867 年去世後,由《全集》(Werke)整理出版時才廣為人知。

一個更深的統一:高斯定理與「通量守恆」#

回到 8.1.3 節:散度在 \(\mathbf{p}\) 的值是「小立方體的淨流出率除以體積」。現在把很多小立方體拼成一個大區域 \(V\),內部的小立方體彼此的通量互相抵消(相鄰面通量相反),只剩外面殼層 \(\partial V\) 上的通量:

\[ \oiint_{\partial V} \mathbf{F}\cdot\mathbf{n}\,\mathrm{d}S = \iiint_V (\nabla\cdot\mathbf{F})\,\mathrm{d}V \]

這就是散度定理的物理直覺:把「局部源密度」加總,等於「整個邊界上的淨流出」。沒有源的場(\(\nabla \cdot \mathbf{F} = 0\))在閉曲面上的總通量為零——磁場線沒有起點也沒有終點,它們必須閉合。

我們用 SymPy 把它算出來,並且順便驗證「無源場通量為零」這個推論。

import sympy as sp

x, y, z, t = sp.symbols('x y z t', real=True)

# ================= 高斯(散度)定理 =================
# ∯_S F·n dS = ∭_V (div F) dV
# 取 V 為半徑 R 的球,邊界 S 為球面

R = sp.symbols('R', positive=True)
F = sp.Matrix([x, y, z])
divF = sp.diff(F[0], x) + sp.diff(F[1], y) + sp.diff(F[2], z)
print('F =', F.T, '   div F =', divF)

# 表面積分:參數化球面 r(theta, phi) = R(sin th cos ph, sin th sin ph, cos th)
th, ph = sp.symbols('theta phi', real=True)
rt = sp.Matrix([R * sp.sin(th) * sp.cos(ph), R * sp.sin(th) * sp.sin(ph), R * sp.cos(th)])
n = rt.diff(th).cross(rt.diff(ph))
print('|n| =', sp.simplify(sp.sqrt(n.dot(n))))
Fsub = F.subs({x: rt[0], y: rt[1], z: rt[2]})
flux = sp.integrate((Fsub.T * n)[0], (ph, 0, 2 * sp.pi), (th, 0, sp.pi))
print('表面通量 ∯ F·n dS =', sp.simplify(flux))

# 體積積分:球座標
rho, psi = sp.symbols('rho psi', real=True)
vol = sp.integrate(divF.subs({x: rho * sp.sin(psi) * sp.cos(th),
                               y: rho * sp.sin(psi) * sp.sin(th),
                               z: rho * sp.cos(psi)}) * rho**2 * sp.sin(psi),
                    (th, 0, 2 * sp.pi), (psi, 0, sp.pi), (rho, 0, R))
print('體積積分 ∭ div F dV =', sp.simplify(vol))
print('兩者相等?', sp.simplify(flux - vol) == 0)
print()

# --- 再驗一個「無源場」:散度為零 ⇒ 閉曲面上的通量為零 ---
G = sp.Matrix([-y, x, 0])
divG = sp.simplify(sp.diff(G[0], x) + sp.diff(G[1], y) + sp.diff(G[2], z))
print('G =', G.T, '   div G =', divG)
Gsub = G.subs({x: rt[0], y: rt[1], z: rt[2]})
fluxG = sp.integrate((Gsub.T * n)[0], (ph, 0, 2 * sp.pi), (th, 0, sp.pi))
print('G 在球面上的通量 =', sp.simplify(fluxG))

預期輸出:

F = Matrix([[x, y, z]])    div F = 3
|n| = R**2*Abs(sin(theta))
表面通量 ∯ F·n dS = 4*pi*R**3
體積積分 ∭ div F dV = 4*pi*R**3
兩者相等? True

G = Matrix([[-y, x, 0]])    div G = 0
G 在球面上的通量 = 0

解讀:\(\mathbf{F} = (x, y, z)\) 是「從原點向外輻射」的場。散度是常數 \(3\),意思是每一單位體積都有三個單位的「源」。球面的通量是 \(4\pi R^3\),體積積分也是 \(4\pi R^3\)。兩邊相等——定理成立。

第二個例子 \(\mathbf{G} = (-y, x, 0)\) 是繞 \(z\) 軸的剛體旋轉場,散度為零(無源、無匯),因此在任何閉曲面上的通量都是零——連球面也不例外。注意它不是保守場(\(\nabla \times \mathbf{G} = (0,0,2) \neq \mathbf{0}\)),所以它有渦但沒有源。這正是 8.1.3 節那個「無源場」推論的精確內容。

高斯定理與 Maxwell 方程#

把高斯定理用於靜電學:\(\mathbf{E}\) 是電場,\(V\) 是充滿電荷的區域,則

\[ \oiint_{\partial V} \mathbf{E}\cdot\mathbf{n}\,\mathrm{d}S = \frac{Q_{\text{內}}}{\varepsilon_0} \]

這就是「高斯定律」。用它來解問題的做法是:選一個高對稱性的封閉曲面(球、柱、球殼),讓通量積分簡化。這個技巧在 9.2 節(拉普拉斯方程與勢論)會大量出現。


8.2.4 三個定理的共同結構#

把三個定理並排放在一起,結構立刻清楚:

格林定理 斯托克斯定理 高斯定理
維度 \(n = 2\) \(n = 3\) \(n = 3\)
區域 平面區域 \(D\) 曲面 \(S\) 立體 \(V\)
邊界 閉曲線 \(\partial D = C\) 閉曲線 \(\partial S = C\) 閉曲面 \(\partial V = S\)
左邊 \(\oint_C P\,\mathrm{d}x + Q\,\mathrm{d}y\) \(\oint_C \mathbf{F}\cdot\mathrm{d}\mathbf{r}\) \(\oiint_S \mathbf{F}\cdot\mathbf{n}\,\mathrm{d}S\)
右邊 \(\iint_D (\nabla\times\mathbf{F})\cdot\mathbf{k}\,\mathrm{d}A\) \(\iint_S (\nabla\times\mathbf{F})\cdot\mathbf{n}\,\mathrm{d}S\) \(\iiint_V \nabla\cdot\mathbf{F}\,\mathrm{d}V\)
局部算子 旋度 旋度 散度
1-形式 \(\omega = P\,\mathrm{d}x + Q\,\mathrm{d}y\) \(\omega = F_1\mathrm{d}x+F_2\mathrm{d}y+F_3\mathrm{d}z\) —

共同的骨架是:

\[ \underbrace{\int_{\partial \Omega} \omega}_{\text{邊界上的(1 維)積分}} = \underbrace{\int_{\Omega} \mathrm{d}\omega}_{\text{內部上的(2 維)積分}} \]

這個骨架在微分形式的語言裡就是一句話:

\[ \int_{\partial \Omega} \omega = \int_{\Omega} \mathrm{d}\omega \]

其中 \(\omega\) 是 1-形式,\(\mathrm{d}\omega\) 是它的外微分:

\[ \mathrm{d}(P\,\mathrm{d}x + Q\,\mathrm{d}y) = \left( \frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y} \right) \mathrm{d}x \wedge \mathrm{d}y \]

外微分滿足 \(\mathrm{d}^2 = 0\),這正好對應 8.1.2 節的恆等式 \(\nabla \times (\nabla f) = 0\)(位能的 1-形式是恰式的,\(\mathrm{d}\) 兩次得零)。

而「\(n\) 維版本的斯托克斯定理」——在 \(n\) 維流形上對 \((n-1)\)-形式做積分——是微分幾何的基本工具,也是 20 世紀-forms 的源頭。第 12.2 節的黎曼–羅朗定理會以「函數空間」的形式重新出現類似的對偶結構。


8.2.5 統一視角:斯托克斯定理是唯一的母定理#

現在做那個最漂亮的重組。如果我們把格林定理與高斯定理都看成斯托克斯定理的特例(或退化),會怎樣?

格林定理 = 平面上的斯托克斯定理#

在 \(\mathbb{R}^2\) 中取曲面 \(S\) 為平面區域 \(D\) 本身,法向量固定為 \(\mathbf{k}\)(\(\mathbf{z}\) 方向)。此時「曲面上的旋度」就是

\[ (\nabla \times \mathbf{F})\cdot\mathbf{k} = \frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y} \]

「向量面積元素」\(\mathbf{n}\,\mathrm{d}S = \mathbf{k}\,\mathrm{d}A\),而邊界 \(C = \partial D\)。於是斯托克斯定理逐字變成格林定理——格林定理不是另一個定理,它是斯托克斯定理在 \(n = 2\) 時的樣子。

高斯定理 = 斯托克斯定理作用於閉曲面#

對高斯定理的兩邊做一個「對偶」操作:把 3 維空間裡的向量場 \(\mathbf{F}\) 換成它的旋度 \(\nabla \times \mathbf{F}\),然後套用斯托克斯定理到閉曲面 \(S = \partial V\):

\[ \oiint_S (\nabla \times \mathbf{F}) \cdot \mathbf{n}\,\mathrm{d}S = \oint_{\partial S} \mathbf{F}\cdot\mathrm{d}\mathbf{r} \]

但 \(\partial S = \partial(\partial V) = \emptyset\)(閉曲面的邊界是空集),所以右邊是零:

\[ \oiint_S (\nabla \times \mathbf{F})\cdot\mathbf{n}\,\mathrm{d}S = 0 \]

這是「旋度場的散度為零」的積分版本。再取 \(\mathbf{F}\) 為某個向量場 \(\mathbf{G}\) 的「反旋度」,就得到高斯定理。

更乾淨的說法:高斯定理是斯托克斯定理在「\(3 - 1 = 2\) 維」的對偶版本——它把「\(n\) 維區域上的 \((n-1)\)-形式」換成「\((n-1)\) 維區域上的 \(n\)-形式」。

定理 積分區域 被積的次數 微分算子
格林 \(2\) 維區域 \(1\)-形式 外微分(旋度)
斯托克斯 \(2\) 維曲面(\(3\) 維空間中) \(1\)-形式 外微分(旋度)
高斯 \(3\) 維區域 \(2\)-形式 外微分(散度)

三個定理其實是同一條公式 \(\int_{\partial\Omega}\omega = \int_{\Omega}\mathrm{d}\omega\) 在不同維度的投影。

物理上的統一#

用同一句話說三個定理:「邊界上的總量」=「內部每點局部量的總和」。

  • 格林:邊界上的總流量 = 內部每點的局部渦度之和(2 維)。
  • 斯托克斯:邊界上的總循環量 = 曲面上每點的局部渦度之和(3 維中的 2 維曲面)。
  • 高斯:閉曲面上的總通量 = 立體內每點的局部源密度之和。

這就是「局部 ↔ 全域」的轉換,也是第 9 章偏微分方程(用局部方程推出全域守恆律)的思想核心。


8.2.6 這些定理怎麼被用:兩個實例#

流體力學:Kelvin 循環定理#

1869 年,Kelvin 證明:若流體無黏、無外力、密度隨壓力變化,則任一隨流體運動的閉合曲線上的循環量守恆:

\[ \frac{\mathrm{d}}{\mathrm{d}t} \oint_C \mathbf{v}\cdot\mathrm{d}\mathbf{r} = 0 \]

推導只有兩行:把循環量寫成 \(\iint_S (\nabla\times\mathbf{v})\cdot\mathbf{n}\,\mathrm{d}S\)(Stokes 定理),再用運動學公式 \(\frac{\mathrm{D}}{\mathrm{D}t}(\nabla \times \mathbf{v}) = (\nabla \times \mathbf{v})\cdot\nabla\,\mathbf{v}\) 證明 \(\nabla\times\mathbf{v}\) 隨流體運動守恆——這需要「\(\nabla\times\mathbf{v}\) 滿足一個齊次的運輸方程」,而這正是 8.1.2 節恆等式 \(\nabla\cdot(\nabla\times\mathbf{F}) = 0\) 的流體版本。

一句話:Helmholtz 的渦旋定理與 Kelvin 的循環定理是同一件事的兩種說法,而它們的證明都依賴 Stokes 定理。

電磁學:Maxwell 方程組的積分形式#

回到 Faraday:

\[ \oint_C \mathbf{E}\cdot\mathrm{d}\mathbf{r} = -\frac{\mathrm{d}}{\mathrm{d}t}\iint_S \mathbf{B}\cdot\mathbf{n}\,\mathrm{d}S \]

用 Stokes 定理把左邊換成面積分,得到微分形式 \(\nabla\times\mathbf{E} = -\partial\mathbf{B}/\partial t\)。

關鍵的方法論:在 Maxwell 的時代,人們知道的是「積分形式」(Faraday 的實驗給出的是迴路上的量)。微分形式是從積分形式「借」來的——而「借」的過程正是 Stokes 定理。反過來說,Maxwell 方程組的積分形式與微分形式的等價性,完全依賴 Stokes 定理與高斯定理。

這是一個深刻的循環:

  1. 實驗給出積分形式;
  2. Stokes / Gauss 定理把積分形式「微分」成局部方程;
  3. 局部方程更容易求解(例如用分離變數法、9.1 節);
  4. 解完再「積分」回去,與實驗對照。

8.2.7 用數值多邊形逼近驗證「面積 = \(\oint_C x\,\mathrm{d}y\)」#

最後,我們回到 8.2.1 節那個著名的推論,用數值的方法把它驗證一遍。思路是:

  1. 用一個 \(N\) 邊的正多邊形逼近單位圓;
  2. 用離散的「梯形公式」計算 \(\oint_C x\,\mathrm{d}y\);
  3. 比較它與 \(\pi\)。

因為格林定理保證 \(\oint_C x\,\mathrm{d}y = \mathrm{Area}(D)\),而多邊形的面積趨近 \(\pi\),所以這個數值積分也必須趨近 \(\pi\)。

我們順便對一個非圓形的區域(拋物線區域)做同樣的事,並且做精確的符號計算作為對照。

import numpy as np
import sympy as sp

x, y, t = sp.symbols('x y t', real=True)

# --- 格林定理的數值驗證:Area(D) = ∮_C x dy(逆時針)---

# (1) 單位圓盤:解析值 pi
N = 2000
th = np.linspace(0, 2 * np.pi, N + 1)
xs, ys = np.cos(th), np.sin(th)
I = float(np.sum(0.5 * (xs[:-1] + xs[1:]) * np.diff(ys)))
print('單位圓盤(%d 邊多邊形)' % N)
print('  數值 ∮ x dy =', I)
print('  pi           =', np.pi)
print('  誤差         =', abs(I - np.pi))
print()

# (2) 拋物線區域 D = { (x,y) : -1 <= x <= 1, 0 <= y <= 1 - x^2 }
#     逆時針邊界:先沿 x 軸 (-1,0)->(1,0),再沿拋物線 (1,0)->(-1,0)
rx1 = -1 + 2 * t
ry1 = sp.Integer(0)
I1 = sp.integrate(sp.simplify((x * sp.diff(ry1, t)).subs(x, rx1)), (t, 0, 1))
rx2 = 1 - 2 * t
ry2 = 1 - rx2**2
I2 = sp.integrate(sp.simplify((x * sp.diff(ry2, t)).subs(x, rx2)), (t, 0, 1))
area = sp.integrate(1 - x**2, (x, -1, 1))
print('拋物線區域 D')
print('  段 1(x 軸)∫ x dy =', sp.simplify(I1))
print('  段 2(拋物線)∫ x dy =', sp.simplify(I2))
print('  ∮_C x dy        =', sp.simplify(I1 + I2))
print('  區域面積 ∬_D dA =', area)
print('  Area = ∮ x dy ?', sp.simplify(I1 + I2 - area) == 0)
print()

# (3) 同一區域的多邊形逼近:數值 ∮ x dy 趨近 4/3
N = 20000
u = np.linspace(-1, 1, N + 1)
xb = u[::-1]          # 拋物線由右到左:(1,0) -> (-1,0)
yb = 1 - xb**2
# 逆時針:先沿 x 軸 (-1,0)->(1,0)(dy = 0,貢獻 0),再沿拋物線 (1,0)->(-1,0)
circ = float(np.sum(0.5 * (xb[:-1] + xb[1:]) * np.diff(yb)))
print('拋物線區域(%d 段折線逼近)' % N)
print('  數值 ∮ x dy =', circ)
print('  4/3          =', 4 / 3)
print('  誤差         =', abs(circ - 4 / 3))

預期輸出:

單位圓盤(2000 邊多邊形)
  數值 ∮ x dy = 3.141587485879563
  pi           = 3.141592653589793
  誤差         = 5.167710229958544e-06

拋物線區域 D
  段 1(x 軸)∫ x dy = 0
  段 2(拋物線)∫ x dy = 4/3
  ∮_C x dy        = 4/3
  區域面積 ∬_D dA = 4/3
  Area = ∮ x dy ? True

拋物線區域(20000 段折線逼近)
  數值 ∮ x dy = 1.3333333299999999
  4/3          = 1.3333333333333333
  誤差         = 3.333333387089965e-09

如何解讀這些數字:

  • 圓盤的誤差 \(5.17\times10^{-6}\) ,正多邊形面積的誤差是 \(O(N^{-2})\) :內接正 \(N\) 邊形面積是 \(\frac{N}{2}\sin\frac{2\pi}{N}\) ,展開後誤差 \(\approx \frac{2\pi^3}{3N^2}\) ,在 \(N = 2000\) 時約 \(5.17\times10^{-6}\) 。完全吻合。
  • 拋物線區域的誤差 \(3.33\times10^{-9}\) :折線逼近一條光滑曲線,梯形公式的誤差是 \(O(h^2)\) , \(h = 2/20000 = 10^{-4}\) , \(h^2 = 10^{-8}\) ,與觀察到的 \(3.3\times10^{-9}\) 同量級。

這就是格林定理的「工程意義」:你不需要知道區域的解析描述,只要知道它的邊界,就能算出面積。反過來,格林定理也給了「用邊界積分檢驗區域描述是否正確」的能力。


習題#

習題 8.2.1(格林定理的直接應用) 設 \(D\) 是由曲線 \(y = x^2\) 、 \(y = 0\) 、 \(x = 1\) 圍成的區域, \(C\) 取逆時針方向。 (a) 用格林定理計算 \(\oint_C \left( -y\,\mathrm{d}x + x\,\mathrm{d}y \right)\) ,並用直接參數化驗證; (b) 用格林定理的面積公式計算 \(\mathrm{Area}(D)\) ,並與直接二重積分對照; (c) 用格林定理計算 \(\oint_C \left( x^2\,\mathrm{d}y - 2xy\,\mathrm{d}x \right)\) 。

習題 8.2.2(斯托克斯定理的三個方向) 取 \(\mathbf{F} = (-y, x, 0)\) , \(S\) 為單位球的上半球, \(C\) 為赤道圓(逆時針)。 (a) 計算 \(\oint_C \mathbf{F}\cdot\mathrm{d}\mathbf{r}\) 與 \(\iint_S (\nabla\times\mathbf{F})\cdot\mathbf{n}\,\mathrm{d}S\) ; (b) 把 \(S\) 換成半圓形圓盤(在同一半球內),驗證兩邊仍相等,並解釋為什麼定理的值不依賴曲面的選擇; (c) 把 \(S\) 換成一個更彎曲的曲面(提示:可用 \(\mathbf{r}(u,v) = (u, v, \sqrt{1-u^2-v^2})\) 的一般化,例如 \(z = h(x,y)\) 加上半球帽),說明「曲面可以變形但邊界不變 → 積分值不變」。

習題 8.2.3(高斯定理的應用) 設球體 \(x^2+y^2+z^2 \le R^2\) 內部有均勻電荷密度 \(\rho_0\) 。 (a) 用高斯定理求出球面上的電場(先猜對稱性: \(\mathbf{E} = E(r)\hat{\mathbf{r}}\) ,把通量積分化簡); (b) 用三重積分直接算,驗證結果相同; (c) 證明若電荷分布是 \(\rho = \rho_0 (1 - r/R)\) ,則球面上的電場為零,並解釋為什麼(提示:算總電荷與「內部各殼層的貢獻」)。

習題 8.2.4(格林恆等式) 用格林定理導出格林第二恆等式:

\[ \iint_D \left( f \nabla^2 g - g \nabla^2 f \right)\mathrm{d}A = \oint_C \left( f \frac{\partial g}{\partial n} - g \frac{\partial f}{\partial n} \right)\mathrm{d}s \]

(提示:對 \(\nabla^2\) 乘上 \(f\,g\) 分別取兩種方式展開,再用格林定理把面積分換成邊界積分。)然後用它證明:**若 \(f\) 在 \(D\) 上滿足 \(\nabla^2 f = 0\) (諧函數),則 \(\oint_C \frac{\partial f}{\partial n}\,\mathrm{d}s = 0\) **(提示:在恆等式中取 \(g \equiv 1\) ,則 \(\nabla^2 g = 0\) 且 \(\frac{\partial g}{\partial n} = 0\) )。 挑戰題:證明兩個調和函數 \(f, g\) 在 \(D\) 上滿足 \(\iint_D \left( f \nabla^2 g - g \nabla^2 f \right)\mathrm{d}A = 0\) 的同時,若 \(f = g\) 則邊界上的「Dirichlet 能量差」 \(\oint_C \left( f \frac{\partial f}{\partial n} \right)\mathrm{d}s\) 必須另行處理——用一個具体的例子說明為什麼。

習題 8.2.5(統一視角的實踐) 用 8.2.5 節的觀點回答: (a) 格林定理是 \(n\) 維斯托克斯定理在 \(n = 2\) 的樣子。請把它寫成「 \(1\) -形式 + 外微分」的形式,並驗證 \(\mathrm{d}\omega\) 的公式確實給出 \(\partial Q/\partial x - \partial P/\partial y\) 。 (b) 證明高斯定理可以由斯托克斯定理推出:取 \(\mathbf{G}\) 使得 \(\nabla \times \mathbf{G} = \mathbf{F}\) (在適當條件下可行),則 \(\oiint_{\partial V}\mathbf{F}\cdot\mathbf{n}\,\mathrm{d}S = \oiint_{\partial V}(\nabla\times\mathbf{G})\cdot\mathbf{n}\,\mathrm{d}S = \oint_{\partial(\partial V)}\mathbf{G}\cdot\mathrm{d}\mathbf{r} = 0\) ——這裡出了什麼問題?(提示:想想 \(\partial(\partial V)\) 真的是空集嗎?以及「 \(\nabla\times\mathbf{G} = \mathbf{F}\) 有解」需要什麼條件。) (c) 解釋:為什麼「斯托克斯定理是母定理」的說法,在微分形式的語言裡比在向量微積分的語言裡更乾淨?


小結#

定理 公式 年份 / 人物 SymPy 驗證方式
格林 \(\oint_C (P\mathrm{d}x+Q\mathrm{d}y) = \iint_D (\partial_x Q - \partial_y P)\,\mathrm{d}A\) 1828/1831 Green 圓盤參數化 vs 二重積分
斯托克斯 \(\oint_C \mathbf{F}\cdot\mathrm{d}\mathbf{r} = \iint_S (\nabla\times\mathbf{F})\cdot\mathbf{n}\,\mathrm{d}S\) 1851 Stokes(Smith's Prize,Kelvin 建議) 半球面:叉積法向量 vs 邊界循環量
高斯 \(\oiint_S \mathbf{F}\cdot\mathbf{n}\,\mathrm{d}S = \iiint_V (\nabla\cdot\mathbf{F})\,\mathrm{d}V\) 1835 Gauss(Ostrogradsky 同期) 球面通量 vs 球座標三重積分

共同骨架: \(\int_{\partial\Omega}\omega = \int_{\Omega}\mathrm{d}\omega\) (微分形式的外微分版本)。

統一視角:格林 = 平面上的斯托克斯;高斯 = 斯托克斯在「低一維」上的對偶。三者的物理意義都是「邊界上的總量 = 內部局部量的總和」。

方法論:積分定理是把「實驗給的積分形式」轉成「可解的微分形式」的橋樑——這正是 Maxwell 從 Faraday 的實驗走到 Maxwell 方程組的路徑,也是 9.1 節(熱方程與波方程)的策略。

下一節的問題:我們已經有定理了,但每次要驗證一個場是否保守,都得手寫三行偏導數。SymPy 能幫上什麼忙?8.3 節要回答:怎麼用 sp.Matrix 手寫三個算子、怎麼用 sympy.vector 讓電腦幫你做座標無關的散度與旋度、怎麼自動判定一個場是否保守(以及那個著名的「curl = 0 但仍不是保守場」的陷阱)。