03.2 散度與旋度#
本節目標#
上節會看場的「箭頭」了,本節要訓練兩個新的全局直覺:
- 散度 \(\nabla\cdot\mathbf{F}\) :這點是「源頭」還是「水溝」?箭頭在此膨脹還是收縮?
- 旋度 \(\nabla\times\mathbf{F}\) :這點在「打轉」嗎?放個小風車會往哪邊轉?
- 用 SymPy 完整驗證兩大恆等式: \(\nabla\times\nabla f = \mathbf{0}\) 與 \(\nabla\cdot(\nabla\times\mathbf{F}) = 0\) 。
3.2.1 散度:點源的膨脹量#
定義(三維):
直覺:在點 \(\mathbf{p}\) 附近放一個小氣球(半徑 \(\epsilon\) 的小球面 \(S\) ),觀察場向外流出多少:
也就是單位體積的淨流出量:
- \(\nabla\cdot\mathbf{F} > 0\) :箭頭從此湧出(水龍頭、正電荷、點火源)。
- \(\nabla\cdot\mathbf{F} < 0\) :箭頭匯聚於此(排水口、負電荷)。
- \(\nabla\cdot\mathbf{F} = 0\) :不可壓縮,流入多少就流出多少。
經典例子:放射場 \(\mathbf{F} = \dfrac{\mathbf{r}}{\|\mathbf{r}\|^3}\) (點電荷的電場)。直接計算可證它在 \(\mathbf{r}\neq 0\) 處散度為 \(0\) ,但任何包住原點的曲面上通量都是 \(4\pi\) ——源頭全部藏在原點那個「奇點」上。水壓系統的比喻:水源在山裡連續降雨(源頭分散開, \(\nabla\cdot\mathbf{F}>0\) 區域);水到處流動但總量不變(懸崖與河床都只是導管,不生水)。
看圖訓練:對 \(\mathbf{F} = (x, y)\) ,每個箭頭都比左邊的鄰居長一點,箭尾粗箭頭細→淨流出, \(\nabla\cdot\mathbf{F} = 2 > 0\) 。對 \(\mathbf{F} = (-x,-y)\) 則是匯聚,散度 \(-2\) 。
3.2.2 旋度:小風車的自旋#
定義(分量式):
直覺:放一個小風車(繞軸 \(\mathbf{n}\) 的微小圓盤 \(C\) ),量它單位面積的環流量:
旋度向量在此點給出「轉得最猛的軸向 + 轉速」。以二維為例最容易算:
- 渦旋場 \(\mathbf{F} = (-y, x, 0)\) : \(\ \nabla\times\mathbf{F} = (0,0,2)\) ,處處以角速度均勻旋轉(剛體旋轉)。
- 剪切流 \(\mathbf{F} = (y, 0, 0)\) (下方快上方慢,像咖啡杯面上的風): \(\nabla\times\mathbf{F} = (0,0,-1)\) ,即使在無「圓形軌跡」的直線流中,風車仍會轉!
- 放射場 \(\mathbf{F} = (x, y, 0)\) : \(\nabla\times\mathbf{F} = \mathbf{0}\) ,箭頭放射但不旋轉,風車原地不動。
用 quiver 畫 \(\mathbf{F} = (-y, x)\) 就「看見」旋度:全場箭頭逆時針排列。旋度把這種視覺上的打轉量化成一個數(一個向量)。
3.2.3 兩大恆等式(SymPy 完整驗證)#
恆等式一:梯度場無旋。 \(\nabla\times\nabla f = \mathbf{0}\) 。理由:混合偏導數對稱, \(\partial_y \partial_x f = \partial_x \partial_y f\) ,k 分量恰為 \(\partial_y\partial_x f - \partial_x\partial_y f = 0\) 。
恆等式二:旋度場無源。 \(\nabla\cdot(\nabla\times\mathbf{F}) = 0\) 。展開是六項交錯的偏導數,兩兩正負相消(Clairaut 定理)。
用 SymPy 做符號驗證:
import sympy as sp
x, y, z = sp.symbols("x y z")
def grad(f):
return sp.Matrix([sp.diff(f, v) for v in (x, y, z)])
def curl(F):
P, Q, R = F
return sp.Matrix([
sp.diff(R, y) - sp.diff(Q, z),
sp.diff(P, z) - sp.diff(R, x),
sp.diff(Q, x) - sp.diff(P, y),
])
def div(F):
P, Q, R = F
return sp.diff(P, x) + sp.diff(Q, y) + sp.diff(R, z)
f = x*y*z**2 + sp.sin(x*y)
print(curl(grad(f)).applyfunc(sp.simplify)) # [0, 0, 0]
P, Q, R = x*y, y*z*sp.exp(z), z*x**2
F = (P, Q, R)
print(sp.simplify(div(curl(F)))) # 0
3.2.4 流量視覺化:從箭頭圖讀出散度與旋度#
畫三個場的 streamplot,訓練一眼判讀:
import numpy as np
import matplotlib.pyplot as plt
x, y = np.meshgrid(np.linspace(-3, 3, 20), np.linspace(-3, 3, 20))
fields = [
("放射場 (x,y):div=2, curl=0", x, y),
("渦旋場 (-y,x):div=0, curl=2", -y, x),
("剪切流 (y,0):div=0, curl=-1", y, np.zeros_like(x)),
]
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
for ax, (title, u, v) in zip(axes, fields):
ax.streamplot(x, y, u, v, density=1.0)
ax.set_title(title); ax.set_aspect("equal")
plt.show()
判讀口訣:
- 流線從某點爆開 / 灌進某點 ⇒ 該處散度不為零。
- 流線繞圈、或上下排速度不同造成剪力 ⇒ 旋度不為零。
- 放射場流線筆直輻射但不繞圈(curl=0);渦旋場流線全圓但不爆開(div=0);剪切流線全平行線依然有旋度——別被「直線」騙了,旋度看的是局部速度差。
3.2.5 更多 SymPy 計算#
# 點電荷場 r / |r|^3 在非原點處:div = 0, curl = 0
r2 = x**2 + y**2 + z**2
F = (x/r2**sp.Rational(3,2), y/r2**sp.Rational(3,2), z/r2**sp.Rational(3,2))
print(sp.simplify(div(F)), curl(F).applyfunc(sp.simplify))
# 0, [0,0,0] —— 源全部在原點,由後續章節的高斯/斯托克斯定理量化
# 法蘭克角向場 F = (0, 0, c) 疊圓柱:驗證 Maxwell 之一 div B = 0
B = (0, 0, sp.Symbol("c", positive=True))
print(div(B)) # 0
小結與練習#
- \(\nabla\cdot\mathbf{F}\) :局部膨脹率,正=湧出、負=匯入、零=不可壓縮。
- \(\nabla\times\mathbf{F}\) :局部自旋軸與強度;平行速度差也會產生旋度。
- 兩大恆等式:梯度必無旋、旋度必無源(都源自混合偏導數相等)。
- 散度與旋度都是局部量:點電荷場在原點外散度為零,源頭藏在奇點。
練習:
- 算 \(\mathbf{F} = (x^2, xy, z^2 e^{xz})\) 的散度與旋度,並用 SymPy 驗證。
- 對剪切流 \(\mathbf{F}=(y,0,0)\) :取一個小方形迴路手工計算環流量,證明其符號與理論 \(\nabla\times\mathbf{F}\cdot\mathbf{k} = -1\) 一致。
- 找一個散度不為零且旋度也不為零的場,例如 \(\mathbf{F}=(x, x y, x z)\) ?先猜再算,修正你的猜測。
- 證明(手算兩行): \(\nabla\cdot(f\,\nabla g) = \nabla f\cdot\nabla g + f\,\nabla^2 g\) ,並用 SymPy 驗證 \(f=x^2, g=e^{xyz}\) 的情形。
- 用 streamplot 畫 \(\mathbf{F} = (x-y, x+y)\) ,判讀散度與旋度的符號再計算驗證。