M0.1 閘門的進出:Divergence 與通量
起點:看不見站內
你負責一座捷運站的人流。站內沒有攝影機,你手上只有每個閘門的計數器:每分鐘各有多少人刷卡進、多少人刷卡出。四個閘門的讀數擺在你面前。
問題:現在站內的人是在變多還是變少?每分鐘變多少?
直覺的答案幾乎是反射:把所有閘門的「進」加起來,減掉所有「出」,正的就是變多。寫下你有多確定。
大多數人會非常確定。這一次直覺是對的——但請試著回答兩個追問:這個算法依賴什麼才成立?如果有一天讀數告訴你「每分鐘淨進 40 人」,而站務員回報月台其實空了,哪裡出了問題?能回答這兩題,才算真的懂了這個算法。
課堂提問Q1
把情境翻成數學:這裡的「區域」是什麼?「邊界」是什麼?我們手上量到的是哪種量?我們想知道的又是哪種量?
先想一想,再展開看整理後的答案
最直覺的答案會直接跳到「進減出」,跳過了三個該說清楚的物件。
區域 :站內的範圍,一個平面上的區域。我們想知道的是它裡面的總量 ——站內人數隨時間的變化率 。
邊界 :站內與站外的分界線。閘門是邊界上開了口的幾段;其餘的邊界是牆,沒有人穿過。
量到的東西:每個閘門的計數器給的是「每分鐘穿過這一段邊界的淨人數」——一個穿過邊界的流量,方向有正負(出為正、進為負,或反過來,先講好)。
於是問題變成:知道邊界上每一段的穿越流量,能不能推出內部總量的變化率? 翻譯到這裡就看到了關鍵:這需要一個把「邊界上的穿越」與「內部的增減」連起來的定律。連起來的橋是守恆——人不會在站內憑空出現或消失。這一句話就是整個算法的地基。
一個灑水器和一個排水口
暫時放下閘門,看一張只有箭頭的圖。地面上每一點畫一支小箭頭,表示那裡的人(或水)往哪流、流多快。
在灑水器四周,箭頭一律向外指:任何一個圈住灑水器的小圈,流出去的比流進來的多——這裡是一個源。在排水口四周,箭頭一律向內:圈住它的任何小圈都是淨流入——這裡是一個匯。在一條平直的走廊裡,箭頭全部同向、等長:一個小圈左邊進多少、右邊就出多少,淨流量是零。
「圈一個小圈,數淨流出多少」這個動作,對平面上每一點都可以做。做出來的數字有正有負:正的地方在「吐出」、負的地方在「吸入」、零的地方只是「經過」。這個逐點的數字就是 divergence。
把小圈寫成數學
流量場與 flux。 記 為流量場:在 這一點,每單位長度的邊界、每單位時間穿過的人數,方向是人流的方向。對區域 ,邊界上每一小段長 、向外的單位法向量 ,穿過它向外的人數是 (只有垂直於邊界的分量會穿過)。整條邊界加起來:
叫 的 flux(通量)——向外為正。守恆這句話寫成式子就是
裡面的總量增加多少,就是邊界上淨流進多少。這一行沒有任何近似,但它有一個前提: 的變化只能來自穿過邊界,內部沒有源與匯。
Divergence。 現在把 縮成一個以 為中心、邊長 的小長方形。四條邊的 flux:右邊流出 ,左邊流入 ,兩者相減約是 ;上下同理給 。除以面積、取極限:
divergence 就是每單位面積的淨流出。 符號 是刻意的:把 M0.0 的 與 做內積,形式上就是這個和。
Gauss 定理(二維)。 把 切成很多小格子。每個小格子的 flux 約是 面積。把所有格子加起來時,每一條內部的格線被相鄰兩格各算一次、方向相反,剛好抵消,只剩最外圈的邊界。所以
左邊只看邊界,右邊只看內部,兩者永遠相等。這就是「內部格線抵消」這一句話的正式版本。
展開細節抵消為什麼是精確的、而不是近似(離散版本一行就看得出來)
在一個 的格網上,把每條格線上的流量記成數字 。「格子 的淨流出」定義為它四條邊的 帶正負號相加。把所有格子的淨流出相加,每條內部格線出現兩次:對左邊那格是流出(),對右邊那格是流入(),和為零。剩下的只有最外圈——這是一個 telescoping sum,沒有任何近似。連續版本的 Gauss 定理就是這個離散事實取極限,divergence 的定義正好讓「每格淨流出 」在極限下成為等式。
回到情境:直覺對了,但要說出它靠什麼
結論。 「進減出」正確,因為它就是 :站內人數的變化率等於邊界上的淨流入。這一行是恆等式,不是估計。
它依賴兩個假設。 第一,守恆:人不會在站內出現或消失——這在捷運站幾乎一定成立。第二,閘門就是全部的邊界:所有能穿過 的地方都有計數器。這一條才是會出事的地方。站務員的員工門、緊急出口、還有月台邊的列車門——列車到站,一車人進了站內;列車開走,一車人離開。如果你的 是「整座站含月台」,列車門就是邊界的一部分,而閘門計數器沒有算它。「每分鐘淨進 40 人,月台卻空了」正是這種情形:40 人從閘門進來,一列車載走了更多人,而那條邊界你沒量。
Divergence 多給了什麼。 閘門版只回答「整站」的增減。若你有站內各處的人流方向與速度(例如手機定位的匿名統計), 能逐點告訴你哪裡在累積(,淨流入)、哪裡在疏散();而 Gauss 定理保證:把整站的 積分起來,一定等於閘門加列車門的總 flux——兩種算法可以互相對帳。對不上,就表示有一道門沒被算進去。
回到情境:實際算一次
十行程式就能看到「內部相加=邊界」是精確的,以及暗門造成的差額:
import numpy as np
n = 40; rho = np.full((n, n), 5.0) # 每格人數
Fx = 0.3 + 0.1*np.random.randn(n, n+1) # 垂直格線上的向右流量
Fy = 0.1*np.random.randn(n+1, n) # 水平格線上的向下流量
inside = (slice(10, 30), slice(10, 30)) # 站內範圍 Ω
for leak in (0.0, 0.5): # 0.5 = 暗門每步帶走的人
N0 = rho[inside].sum()
div = (Fx[:, 1:] - Fx[:, :-1]) + (Fy[1:, :] - Fy[:-1, :]) # 每格淨流出
rho_new = rho - div; rho_new[20, 20] -= leak
flux_out = Fx[10:30, 30].sum() - Fx[10:30, 10].sum() + Fy[30, 10:30].sum() - Fy[10, 10:30].sum()
print(f"實際變化 {rho_new[inside].sum()-N0:+.3f} 閘門推算 {-flux_out:+.3f}")
第一行兩個數字完全相同;第二行差 ——正是暗門的量。
先消化一下
參考文獻
- Strang, G. Calculus. Wellesley-Cambridge Press;MIT OpenCourseWare RES.18-001 免費全文。(Green / divergence theorem 的章節。)
- Feynman, R. P., Leighton, R. B., Sands, M. The Feynman Lectures on Physics, Vol. II, Ch. 3: Vector Integral Calculus.(用「小方塊的 flux」定義 divergence、以及 Gauss 定理的拼接論證。)
- Marsden, J. E., Tromba, A. J. Vector Calculus. W. H. Freeman.(二維與三維 divergence theorem 的正式敘述與證明。)