M0.1 12 分鐘閱讀 2026年9月

M0.1 閘門的進出:Divergence 與通量

本篇重用M0.0霧中下山:Gradient 與方向

起點:看不見站內

你負責一座捷運站的人流。站內沒有攝影機,你手上只有每個閘門的計數器:每分鐘各有多少人刷卡進、多少人刷卡出。四個閘門的讀數擺在你面前。

問題:現在站內的人是在變多還是變少?每分鐘變多少?

直覺的答案幾乎是反射:把所有閘門的「進」加起來,減掉所有「出」,正的就是變多。寫下你有多確定。

大多數人會非常確定。這一次直覺是對的——但請試著回答兩個追問:這個算法依賴什麼才成立?如果有一天讀數告訴你「每分鐘淨進 40 人」,而站務員回報月台其實空了,哪裡出了問題?能回答這兩題,才算真的懂了這個算法。

課堂提問Q1

把情境翻成數學:這裡的「區域」是什麼?「邊界」是什麼?我們手上量到的是哪種量?我們想知道的又是哪種量?

先想一想,再展開看整理後的答案

最直覺的答案會直接跳到「進減出」,跳過了三個該說清楚的物件。

區域 Ω\Omega:站內的範圍,一個平面上的區域。我們想知道的是它裡面的總量 N(t)N(t)——站內人數隨時間的變化率 dN/dtdN/dt

邊界 Ω\partial\Omega:站內與站外的分界線。閘門是邊界上開了口的幾段;其餘的邊界是牆,沒有人穿過。

量到的東西:每個閘門的計數器給的是「每分鐘穿過這一段邊界的淨人數」——一個穿過邊界的流量,方向有正負(出為正、進為負,或反過來,先講好)。

於是問題變成:知道邊界上每一段的穿越流量,能不能推出內部總量的變化率? 翻譯到這裡就看到了關鍵:這需要一個把「邊界上的穿越」與「內部的增減」連起來的定律。連起來的橋是守恆——人不會在站內憑空出現或消失。這一句話就是整個算法的地基。

一個灑水器和一個排水口

暫時放下閘門,看一張只有箭頭的圖。地面上每一點畫一支小箭頭,表示那裡的人(或水)往哪流、流多快。

灑水器四周,箭頭一律向外指:任何一個圈住灑水器的小圈,流出去的比流進來的多——這裡是一個。在排水口四周,箭頭一律向內:圈住它的任何小圈都是淨流入——這裡是一個。在一條平直的走廊裡,箭頭全部同向、等長:一個小圈左邊進多少、右邊就出多少,淨流量是零。

「圈一個小圈,數淨流出多少」這個動作,對平面上每一點都可以做。做出來的數字有正有負:正的地方在「吐出」、負的地方在「吸入」、零的地方只是「經過」。這個逐點的數字就是 divergence。

把小圈寫成數學

流量場與 flux。v(x,y)v(x,y) 為流量場:在 (x,y)(x,y) 這一點,每單位長度的邊界、每單位時間穿過的人數,方向是人流的方向。對區域 Ω\Omega,邊界上每一小段長 dsds、向外的單位法向量 nn,穿過它向外的人數是 vndsv\cdot n\,ds(只有垂直於邊界的分量會穿過)。整條邊界加起來:

Φ(Ω)=Ωvnds,\Phi(\Omega)=\oint_{\partial\Omega}v\cdot n\,ds ,

Ω\Omegaflux(通量)——向外為正。守恆這句話寫成式子就是

dNdt=Φ(Ω):\frac{dN}{dt}=-\,\Phi(\Omega):

裡面的總量增加多少,就是邊界上淨流進多少。這一行沒有任何近似,但它有一個前提:NN 的變化只能來自穿過邊界,內部沒有源與匯。

Divergence。 現在把 Ω\Omega 縮成一個以 (x,y)(x,y) 為中心、邊長 Δx×Δy\Delta x\times\Delta y 的小長方形。四條邊的 flux:右邊流出 vx(x+Δx2,y)Δyv_x(x+\tfrac{\Delta x}2,y)\Delta y,左邊流入 vx(xΔx2,y)Δyv_x(x-\tfrac{\Delta x}2,y)\Delta y,兩者相減約是 vxxΔxΔy\dfrac{\partial v_x}{\partial x}\Delta x\Delta y;上下同理給 vyyΔxΔy\dfrac{\partial v_y}{\partial y}\Delta x\Delta y。除以面積、取極限:

 ⁣v  =  vxx+vyy  =  limΩ0Φ(Ω)Ω.\nabla\!\cdot v\;=\;\frac{\partial v_x}{\partial x}+\frac{\partial v_y}{\partial y} \;=\;\lim_{|\Omega|\to0}\frac{\Phi(\Omega)}{|\Omega|}.

divergence 就是每單位面積的淨流出。 符號 \nabla\cdot 是刻意的:把 M0.0=(x,y)\nabla=(\partial_x,\partial_y)vv 做內積,形式上就是這個和。

Gauss 定理(二維)。Ω\Omega 切成很多小格子。每個小格子的 flux 約是 (v)×(\nabla\cdot v)\times面積。把所有格子加起來時,每一條內部的格線被相鄰兩格各算一次、方向相反,剛好抵消,只剩最外圈的邊界。所以

Ωvnds  =  Ω ⁣v  dA.\oint_{\partial\Omega}v\cdot n\,ds\;=\;\int_\Omega\nabla\!\cdot v\;dA .

左邊只看邊界,右邊只看內部,兩者永遠相等。這就是「內部格線抵消」這一句話的正式版本。

展開細節抵消為什麼是精確的、而不是近似(離散版本一行就看得出來)

在一個 n×nn\times n 的格網上,把每條格線上的流量記成數字 FF。「格子 (i,j)(i,j) 的淨流出」定義為它四條邊的 FF 帶正負號相加。把所有格子的淨流出相加,每條內部格線出現兩次:對左邊那格是流出(+F+F),對右邊那格是流入(F-F),和為零。剩下的只有最外圈——這是一個 telescoping sum,沒有任何近似。連續版本的 Gauss 定理就是這個離散事實取極限,divergence 的定義正好讓「每格淨流出 (v)ΔxΔy\approx(\nabla\cdot v)\,\Delta x\Delta y」在極限下成為等式。

回到情境:直覺對了,但要說出它靠什麼

結論。 「進減出」正確,因為它就是 dN/dt=Φ(Ω)dN/dt=-\Phi(\Omega):站內人數的變化率等於邊界上的淨流入。這一行是恆等式,不是估計。

它依賴兩個假設。 第一,守恆:人不會在站內出現或消失——這在捷運站幾乎一定成立。第二,閘門就是全部的邊界:所有能穿過 Ω\partial\Omega 的地方都有計數器。這一條才是會出事的地方。站務員的員工門、緊急出口、還有月台邊的列車門——列車到站,一車人進了站內;列車開走,一車人離開。如果你的 Ω\Omega 是「整座站含月台」,列車門就是邊界的一部分,而閘門計數器沒有算它。「每分鐘淨進 40 人,月台卻空了」正是這種情形:40 人從閘門進來,一列車載走了更多人,而那條邊界你沒量。

Divergence 多給了什麼。 閘門版只回答「整站」的增減。若你有站內各處的人流方向與速度(例如手機定位的匿名統計),v\nabla\cdot v逐點告訴你哪裡在累積(v<0\nabla\cdot v<0,淨流入)、哪裡在疏散(v>0\nabla\cdot v>0);而 Gauss 定理保證:把整站的 v\nabla\cdot v 積分起來,一定等於閘門加列車門的總 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}")

第一行兩個數字完全相同;第二行差 0.50.5——正是暗門的量。

先消化一下

想一想

你有一張夜市的人流圖:每個位置有一支箭頭表示人往哪走、走多快。你想知道哪裡正在越來越擠。該看哪個量?

想一想

某座站的閘門計數器每分鐘顯示淨進 30 人,站務員卻回報人數持平。最可能的解釋是:

想一想

若一個流量場在某區域內處處 v=0\nabla\cdot v=0,可以推出:

參考文獻

  1. Strang, G. Calculus. Wellesley-Cambridge Press;MIT OpenCourseWare RES.18-001 免費全文。(Green / divergence theorem 的章節。)
  2. Feynman, R. P., Leighton, R. B., Sands, M. The Feynman Lectures on Physics, Vol. II, Ch. 3: Vector Integral Calculus.(用「小方塊的 flux」定義 divergence、以及 Gauss 定理的拼接論證。)
  3. Marsden, J. E., Tromba, A. J. Vector Calculus. W. H. Freeman.(二維與三維 divergence theorem 的正式敘述與證明。)