跳轉到

03.2 散度與旋度#

本節目標#

上節會看場的「箭頭」了,本節要訓練兩個新的全局直覺:

  1. 散度 \(\nabla\cdot\mathbf{F}\) :這點是「源頭」還是「水溝」?箭頭在此膨脹還是收縮?
  2. 旋度 \(\nabla\times\mathbf{F}\) :這點在「打轉」嗎?放個小風車會往哪邊轉?
  3. 用 SymPy 完整驗證兩大恆等式: \(\nabla\times\nabla f = \mathbf{0}\) 與 \(\nabla\cdot(\nabla\times\mathbf{F}) = 0\) 。

3.2.1 散度:點源的膨脹量#

定義(三維):

\[ \operatorname{div}\,\mathbf{F} = \nabla\cdot\mathbf{F} = \frac{\partial P}{\partial x} + \frac{\partial Q}{\partial y} + \frac{\partial R}{\partial z} \]

直覺:在點 \(\mathbf{p}\) 附近放一個小氣球(半徑 \(\epsilon\) 的小球面 \(S\) ),觀察場向外流出多少:

\[ \frac{1}{\text{體積}(V)} \iint_S \mathbf{F}\cdot\mathbf{n}\,dS \;\xrightarrow{\epsilon \to 0}\; \nabla\cdot\mathbf{F}(\mathbf{p}) \]

也就是單位體積的淨流出量:

  • \(\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 旋度:小風車的自旋#

定義(分量式):

\[ \nabla\times\mathbf{F} = \begin{vmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ \partial_x & \partial_y & \partial_z \\ P & Q & R \end{vmatrix} = \left( \frac{\partial R}{\partial y} - \frac{\partial Q}{\partial z},\ \frac{\partial P}{\partial z} - \frac{\partial R}{\partial x},\ \frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y} \right) \]

直覺:放一個小風車(繞軸 \(\mathbf{n}\) 的微小圓盤 \(C\) ),量它單位面積的環流量:

\[ \frac{1}{\text{面積}(A)} \oint_C \mathbf{F}\cdot d\mathbf{r} \;\xrightarrow{\text{面積} \to 0}\; (\nabla\times\mathbf{F})\cdot\mathbf{n} \]

旋度向量在此點給出「轉得最猛的軸向 + 轉速」。以二維為例最容易算:

  • 渦旋場 \(\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}\) :局部自旋軸與強度;平行速度差也會產生旋度。
  • 兩大恆等式:梯度必無旋、旋度必無源(都源自混合偏導數相等)。
  • 散度與旋度都是局部量:點電荷場在原點外散度為零,源頭藏在奇點。

練習:

  1. 算 \(\mathbf{F} = (x^2, xy, z^2 e^{xz})\) 的散度與旋度,並用 SymPy 驗證。
  2. 對剪切流 \(\mathbf{F}=(y,0,0)\) :取一個小方形迴路手工計算環流量,證明其符號與理論 \(\nabla\times\mathbf{F}\cdot\mathbf{k} = -1\) 一致。
  3. 找一個散度不為零且旋度也不為零的場,例如 \(\mathbf{F}=(x, x y, x z)\) ?先猜再算,修正你的猜測。
  4. 證明(手算兩行): \(\nabla\cdot(f\,\nabla g) = \nabla f\cdot\nabla g + f\,\nabla^2 g\) ,並用 SymPy 驗證 \(f=x^2, g=e^{xyz}\) 的情形。
  5. 用 streamplot 畫 \(\mathbf{F} = (x-y, x+y)\) ,判讀散度與旋度的符號再計算驗證。