M0.1 閘門的進出:Divergence 與通量
本篇重用1 篇
看不見站內
你負責一座捷運站的人流。站內沒有攝影機,你手上只有每個閘門的計數器:每分鐘各有多少人刷卡進、多少人刷卡出。四個閘門的讀數擺在你面前。
問題:現在站內的人是在變多還是變少?每分鐘變多少?
最直接的方法是把所有「進」加起來,再減掉所有「出」。但這個方法有一個前提:我們得把能進出的地方都算到。若列車帶走的人沒有被記錄,只看閘門就可能判斷錯。
那麼,怎麼把「穿過邊界的量」寫下來,再把它縮到一個小區域,判斷局部的增減?
課堂提問Q1
把情境翻成數學:這裡的「區域」是什麼?「邊界」是什麼?我們手上量到的是哪種量?我們想知道的又是哪種量?
先想一想,再展開看整理後的答案
最直覺的答案會直接跳到「進減出」,跳過了三個該說清楚的物件。
區域 :站內的範圍,一個平面上的區域。我們想知道的是它裡面的總量 ——站內人數隨時間的變化率 。
邊界 :站內與站外的分界線。閘門是邊界上開了口的幾段;其餘的邊界是牆,沒有人穿過。
量到的東西:每個閘門的計數器給的是「每分鐘穿過這一段邊界的淨人數」——一個穿過邊界的流量,方向有正負(出為正、進為負,或反過來,先講好)。
於是問題變成:知道邊界上每一段的穿越流量,能不能推出內部總量的變化率? 翻譯到這裡就看到了關鍵:這需要一個把「邊界上的穿越」與「內部的增減」連起來的定律。連起來的橋是守恆——人不會在站內憑空出現或消失。這一句話就是整個算法的地基。
一個灑水器和一個排水口
先看一張箭頭圖。不過,我們要計算的是人數,不只是速度:同樣走得很快的地方,人多與人少時,每秒通過的量不同。以下把「密度乘上速度」記成流量場 ,其中 是人數密度、 是速度;箭頭的長度表示通過的量,而不只是走多快。
在灑水器四周,箭頭一律向外指:任何一個圈住灑水器的小圈,流出去的比流進來的多——這裡是一個源。在排水口四周,箭頭一律向內:圈住它的任何小圈都是淨流入——這裡是一個匯。在一條平直的走廊裡,箭頭全部同向、等長:一個小圈左邊進多少、右邊就出多少,淨流量是零。
「圈一個小圈,數淨流出多少」這個動作,對平面上每一點都可以做。做出來的數字有正有負:正的地方在「吐出」、負的地方在「吸入」、零的地方只是「經過」。這個逐點的數字就是 divergence。
圖:紅色 source 的 divergence 為正;藍色 sink 的 divergence 為負;均勻穿流為零。
把小圈寫成數學
流量場與 flux。 在二維裡, 的單位是人數/面積, 是距離/時間,因此 是人數/長度/時間。邊界的一小段長 ,向外的單位法向量是 ,每單位時間淨流出的人數就是 :只有垂直於邊界的分量會穿過。整條邊界加起來:
叫 的 flux(通量)——向外為正。守恆這句話寫成式子就是
裡面的總量增加多少,就是邊界上淨流進多少。這一行沒有任何近似,但它有一個前提: 的變化只能來自穿過邊界,內部沒有源與匯。
Divergence。 把區域縮成以 為中心的小長方形。先只算水平方向:右邊的向右流量減去左邊的向右流量,是
除以面積 ,括號裡就是對 的差商。上下兩邊同樣得到對 的差商;兩個方向加起來,再取極限:
Divergence 把每一個方向的淨流出變化率加總起來。 對 做 divergence,得到每單位面積的人數淨流出;對 做 divergence,則描述速度場的局部擴張。算站內密度變化時,我們需要前者。
Gauss 定理(二維)。 把 切成很多小格子。每個小格子的 flux 約是 面積。把所有格子加起來時,每一條內部格線被相鄰兩格各算一次、方向相反,剛好抵消,只剩最外圈的邊界。所以
對足夠平滑的流量場與邊界,左邊只看邊界、右邊逐點算內部,得到相同的量。這就是「內部格線抵消」的連續版本。
展開細節抵消為什麼是精確的、而不是近似(離散版本一行就看得出來)
在格網上,每條內部邊界的同一個流量 ,對一格是流出 ,對鄰格就是流入 。全部格子相加,內部項抵消,只剩外側邊界。這個離散抵消是精確的;在足夠平滑的條件下,取極限得到每格淨流出由 描述的連續版本。
直覺對了,但要說出它靠什麼
結論。 「進減出」正確,因為它就是 :站內人數的變化率等於邊界上的淨流入。這一行是恆等式,不是估計。
它依賴兩個假設。 第一,守恆:人不會在站內出現或消失——這在捷運站幾乎一定成立。第二,閘門就是全部的邊界:所有能穿過 的地方都有計數器。這一條才是會出事的地方。站務員的員工門、緊急出口、還有月台邊的列車門——列車到站,一車人進了站內;列車開走,一車人離開。如果你的 是「整座站含月台」,列車門就是邊界的一部分,而閘門計數器沒有算它。「每分鐘淨進 40 人,月台卻空了」正是這種情形:40 人從閘門進來,一列車載走了更多人,而那條邊界你沒量。
Divergence 多給了什麼。 閘門版只回答整站的增減;知道各處的 density 與 velocity 後, 才能逐點判斷密度如何變化。在沒有內部來源時,淨流出為正,這裡的密度就下降。Gauss 定理讓局部計算與邊界計數對照;對不上時,需要檢查漏算的通道、量測誤差或模型假設,不一定只有一種原因。
實際算一次
十行程式就能看到「內部相加=邊界」是精確的,以及暗門造成的差額:
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 的正式敘述與證明。)