Skip to content
Published on

工程数学完全征服 4:向量微积分 - 从格林定理到斯托克斯定理

分享
Authors

工程数学完全征服 4:向量微积分

向量微积分(Vector Calculus)是贯穿物理学、电磁学、流体力学,乃至现代机器学习的核心数学工具。本文从梯度(gradient)、散度(divergence)、旋度(curl)等概念出发,系统梳理格林定理、高斯散度定理、斯托克斯定理这三大积分定理。


1. 向量函数与向量场

向量值函数

向量值函数(vector-valued function)接收标量参数 tt,输出空间中的一个向量。

r(t)=x(t)i+y(t)j+z(t)k\mathbf{r}(t) = x(t)\,\mathbf{i} + y(t)\,\mathbf{j} + z(t)\,\mathbf{k}

例如螺旋曲线(helix)可表示为:

r(t)=costi+sintj+tk\mathbf{r}(t) = \cos t\,\mathbf{i} + \sin t\,\mathbf{j} + t\,\mathbf{k}

切向量与法向量

曲线 r(t)\mathbf{r}(t) 的切向量(tangent vector)由微分求得。

r(t)=drdt=(dxdt,dydt,dzdt)\mathbf{r}'(t) = \frac{d\mathbf{r}}{dt} = \left(\frac{dx}{dt},\, \frac{dy}{dt},\, \frac{dz}{dt}\right)

单位切向量为 T(t)=r(t)r(t)\mathbf{T}(t) = \dfrac{\mathbf{r}'(t)}{|\mathbf{r}'(t)|},主法向量(principal normal vector)为 N(t)=T(t)T(t)\mathbf{N}(t) = \dfrac{\mathbf{T}'(t)}{|\mathbf{T}'(t)|}

向量场

向量场(vector field)是把空间中每一点对应到一个向量的函数。

F(x,y,z)=P(x,y,z)i+Q(x,y,z)j+R(x,y,z)k\mathbf{F}(x, y, z) = P(x,y,z)\,\mathbf{i} + Q(x,y,z)\,\mathbf{j} + R(x,y,z)\,\mathbf{k}

典型的向量场示例:

  • 重力场:g=gk\mathbf{g} = -g\,\mathbf{k}
  • 电场:E=keqr2r^\mathbf{E} = k_e \dfrac{q}{r^2}\hat{\mathbf{r}}
  • 流体速度场:v(x,y,z)\mathbf{v}(x,y,z)
import numpy as np
import matplotlib.pyplot as plt

# 2D 向量场可视化
x = np.linspace(-2, 2, 15)
y = np.linspace(-2, 2, 15)
X, Y = np.meshgrid(x, y)

# 旋转向量场: F = (-y, x)
U = -Y
V = X

fig, ax = plt.subplots(figsize=(6, 6))
ax.quiver(X, Y, U, V, color='steelblue', alpha=0.8)
ax.set_title('Rotational Vector Field F = (-y, x)')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.tight_layout()
plt.show()

2. 标量场与梯度 (Gradient)

方向导数

标量场 f(x,y,z)f(x,y,z) 沿单位向量 u^\hat{\mathbf{u}} 方向的方向导数定义为:

Du^f=fu^D_{\hat{u}} f = \nabla f \cdot \hat{\mathbf{u}}

梯度向量

梯度(gradient)表示标量场增长最快的方向及其大小。

f=fxi+fyj+fzk\nabla f = \frac{\partial f}{\partial x}\,\mathbf{i} + \frac{\partial f}{\partial y}\,\mathbf{j} + \frac{\partial f}{\partial z}\,\mathbf{k}

物理意义:

  • f\nabla f 的方向:ff 增长最快的方向
  • f|\nabla f|:该方向上的变化率(梯度大小)
  • 垂直于等值面(level surface)

示例:f(x,y)=x2+y2f(x,y) = x^2 + y^2,则 f=(2x,2y)\nabla f = (2x, 2y)

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp

# 用 SymPy 计算梯度
x_s, y_s = sp.symbols('x y')
f = x_s**2 + y_s**2 + x_s * y_s

grad_x = sp.diff(f, x_s)
grad_y = sp.diff(f, y_s)
print("grad_x =", grad_x)  # 2x + y
print("grad_y =", grad_y)  # x + 2y

# 用 NumPy 可视化
x = np.linspace(-2, 2, 20)
y = np.linspace(-2, 2, 20)
X, Y = np.meshgrid(x, y)

f_val = X**2 + Y**2
U = 2 * X   # df/dx
V = 2 * Y   # df/dy

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
c = axes[0].contourf(X, Y, f_val, 20, cmap='viridis')
axes[0].contour(X, Y, f_val, 10, colors='white', alpha=0.5)
plt.colorbar(c, ax=axes[0])
axes[0].set_title('f(x,y) = x² + y² (等高线)')

axes[1].quiver(X, Y, U, V, color='red', alpha=0.7)
axes[1].set_title('Gradient ∇f = (2x, 2y)')
plt.tight_layout()
plt.show()

3. 散度 (Divergence)

散度的定义

向量场 F=(P,Q,R)\mathbf{F} = (P, Q, R) 的散度(divergence)是一个标量值。

divF=F=Px+Qy+Rz\text{div}\,\mathbf{F} = \nabla \cdot \mathbf{F} = \frac{\partial P}{\partial x} + \frac{\partial Q}{\partial y} + \frac{\partial R}{\partial z}

物理意义

散度表示单位体积内流体流出(或被吸入)的量。

  • F>0\nabla \cdot \mathbf{F} > 0:该点是源(source) — 流体向外流出
  • F<0\nabla \cdot \mathbf{F} < 0:该点是汇(sink) — 流体向内流入
  • F=0\nabla \cdot \mathbf{F} = 0不可压缩流动(incompressible flow) — 流体守恒

示例:F=(x2,y2,z2)\mathbf{F} = (x^2, y^2, z^2),则

F=2x+2y+2z\nabla \cdot \mathbf{F} = 2x + 2y + 2z

不可压缩流动的典型例子:F=(y,x,0)\mathbf{F} = (-y, x, 0)F=0\nabla \cdot \mathbf{F} = 0

import sympy as sp

x, y, z = sp.symbols('x y z')

# 向量场 F = (x^2, y^2, z^2)
P = x**2
Q = y**2
R = z**2

divergence = sp.diff(P, x) + sp.diff(Q, y) + sp.diff(R, z)
print("div F =", divergence)  # 2x + 2y + 2z

4. 旋度 (Curl)

旋度的定义

向量场 F=(P,Q,R)\mathbf{F} = (P, Q, R) 的旋度(curl)是一个向量值。

curlF=×F=ijk/x/y/zPQR\text{curl}\,\mathbf{F} = \nabla \times \mathbf{F} = \begin{vmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ \partial/\partial x & \partial/\partial y & \partial/\partial z \\ P & Q & R \end{vmatrix}

展开后得到

×F=(RyQz)i(RxPz)j+(QxPy)k\nabla \times \mathbf{F} = \left(\frac{\partial R}{\partial y} - \frac{\partial Q}{\partial z}\right)\mathbf{i} - \left(\frac{\partial R}{\partial x} - \frac{\partial P}{\partial z}\right)\mathbf{j} + \left(\frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y}\right)\mathbf{k}

物理意义与保守场

  • 旋度表示流体质点局部的旋转(rotation)涡度(vorticity)。
  • ×F=0\nabla \times \mathbf{F} = \mathbf{0},则称为无旋(irrotational)保守场(conservative field)
  • 保守场必存在势函数 ϕ\phi,满足 F=ϕ\mathbf{F} = \nabla \phi

与麦克斯韦方程组的关系

法拉第定律:

×E=Bt\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t}

安培-麦克斯韦定律:

×B=μ0J+μ0ε0Et\nabla \times \mathbf{B} = \mu_0 \mathbf{J} + \mu_0 \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t}

import sympy as sp

x, y, z = sp.symbols('x y z')

# 向量场 F = (y*z, x*z, x*y)
P = y * z
Q = x * z
R = x * y

curl_x = sp.diff(R, y) - sp.diff(Q, z)
curl_y = sp.diff(P, z) - sp.diff(R, x)
curl_z = sp.diff(Q, x) - sp.diff(P, y)

print("curl F =", (curl_x, curl_y, curl_z))
# 结果: (0, 0, 0) => 保守场

5. 线积分 (Line Integrals)

标量函数的线积分

将曲线 CC 参数化为 r(t)=(x(t),y(t),z(t))\mathbf{r}(t) = (x(t), y(t), z(t))atba \le t \le b,则

Cfds=abf(r(t))r(t)dt\int_C f\,ds = \int_a^b f(\mathbf{r}(t))\,|\mathbf{r}'(t)|\,dt

向量场的线积分(功)

向量场 F\mathbf{F} 使质点沿曲线 CC 移动时所做的功(work)

W=CFdr=abF(r(t))r(t)dtW = \int_C \mathbf{F} \cdot d\mathbf{r} = \int_a^b \mathbf{F}(\mathbf{r}(t)) \cdot \mathbf{r}'(t)\,dt

路径无关性

在满足 F=ϕ\mathbf{F} = \nabla \phi 的保守场中,线积分与路径无关。

CFdr=ϕ(r(b))ϕ(r(a))\int_C \mathbf{F} \cdot d\mathbf{r} = \phi(\mathbf{r}(b)) - \phi(\mathbf{r}(a))

也就是说,只要知道起点和终点,就能计算出功。

import numpy as np
from scipy.integrate import quad

# F = (2x, 2y), 曲线: r(t) = (t, t^2), t in [0,1]
def work_integrand(t):
    x_t = t
    y_t = t**2
    # F(r(t)) = (2x, 2y) = (2t, 2t^2)
    Fx = 2 * x_t
    Fy = 2 * y_t
    # r'(t) = (1, 2t)
    dx = 1
    dy = 2 * t
    return Fx * dx + Fy * dy

work, _ = quad(work_integrand, 0, 1)
print(f"Work = {work:.4f}")  # = 2.0 (与路径无关: phi = x^2+y^2, phi(1,1)-phi(0,0) = 2)

6. 面积分 (Surface Integrals)

标量函数的面积分

对参数曲面 r(u,v)\mathbf{r}(u,v)

SfdS=Df(r(u,v))ru×rvdA\iint_S f\,dS = \iint_D f(\mathbf{r}(u,v))\,|\mathbf{r}_u \times \mathbf{r}_v|\,dA

通量 (Flux)

向量场 F\mathbf{F} 穿过曲面 SS通量(flux)

Φ=SFdS=DF(r(u,v))(ru×rv)dA\Phi = \iint_S \mathbf{F} \cdot d\mathbf{S} = \iint_D \mathbf{F}(\mathbf{r}(u,v)) \cdot (\mathbf{r}_u \times \mathbf{r}_v)\,dA

它表示单位时间内穿过曲面的流体量(体积流量)。


7. 格林定理 (Green's Theorem)

定理

对简单闭曲线 CC 及其所围区域 DD,若 PPQQ 具有连续偏导数,则

CPdx+Qdy=D(QxPy)dA\oint_C P\,dx + Q\,dy = \iint_D \left(\frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y}\right) dA

(其中 CC 沿 DD 的边界以逆时针方向环绕)

面积计算的应用

利用格林定理,可以把闭曲线内部的面积转化为线积分来求解。

A=12C(xdyydx)A = \frac{1}{2} \oint_C (x\,dy - y\,dx)

流体力学中的应用

在二维流动中,格林定理被用来定量描述环量(circulation)与通量。

import numpy as np
from scipy.integrate import dblquad

# Green's theorem 验证
# C: 以原点为中心、半径为 1 的单位圆
# P = -y, Q = x => dQ/dx - dP/dy = 1 + 1 = 2
# 二重积分: 2 * pi * 1^2 = 2*pi
# 线积分: ∮ (-y dx + x dy) = 2 * area = 2*pi

result, _ = dblquad(
    lambda y, x: 2.0,   # integrand = dQ/dx - dP/dy
    -1, 1,
    lambda x: -np.sqrt(1 - x**2),
    lambda x:  np.sqrt(1 - x**2)
)
print(f"Double integral = {result:.5f}")  # ≈ 6.28318 = 2*pi

8. 高斯散度定理 (Divergence Theorem)

定理

对体积 VV 及其边界面 S=VS = \partial V,若 F\mathbf{F} 具有连续偏导数,则

SFn^dS=V(F)dV\oiint_S \mathbf{F} \cdot \hat{\mathbf{n}}\,dS = \iiint_V (\nabla \cdot \mathbf{F})\,dV

其中 n^\hat{\mathbf{n}} 为外向单位法向量。

物理意义

体积内的总散度(源/汇之和) = 穿过边界面流出的总通量

电场高斯定律

SEdA=Qencε0\oiint_S \mathbf{E} \cdot d\mathbf{A} = \frac{Q_{enc}}{\varepsilon_0}

这是散度定理的直接应用,用于从电荷分布计算电场。

import sympy as sp

x, y, z = sp.symbols('x y z')

# F = (x^3, y^3, z^3), 半径为 1 的球
P, Q, R = x**3, y**3, z**3
div_F = sp.diff(P, x) + sp.diff(Q, y) + sp.diff(R, z)
print("div F =", div_F)  # 3x^2 + 3y^2 + 3z^2

# 用球坐标积分: 球内部 3*(x^2+y^2+z^2) dV = 3 * (4/5)*pi (半径为 1)
# 答案: 12*pi/5
print("Expected flux =", 12 * sp.pi / 5)

9. 斯托克斯定理 (Stokes' Theorem)

定理

对已定向的曲面 SS 及其边界曲线 C=SC = \partial S

CFdr=S(×F)n^dS\oint_C \mathbf{F} \cdot d\mathbf{r} = \iint_S (\nabla \times \mathbf{F}) \cdot \hat{\mathbf{n}}\,dS

  • 左边:F\mathbf{F} 沿 CC 的线积分(环量,circulation)
  • 右边:F\mathbf{F} 的旋度(curl)在 SS 上的面积分

与格林定理的关系

格林定理是斯托克斯定理在二维情形下的特例。当 SSxyxy-平面上的区域 DD、且 n^=k\hat{\mathbf{n}} = \mathbf{k}

CFdr=D(×F)kdA=D(QxPy)dA\oint_C \mathbf{F} \cdot d\mathbf{r} = \iint_D (\nabla \times \mathbf{F}) \cdot \mathbf{k}\,dA = \iint_D \left(\frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y}\right) dA

安培定律

CBdl=μ0Ienc\oint_C \mathbf{B} \cdot d\mathbf{l} = \mu_0 I_{enc}

利用斯托克斯定理,可以将其转化为微分形式 ×B=μ0J\nabla \times \mathbf{B} = \mu_0 \mathbf{J}

import numpy as np

# Stokes 定理数值验证
# F = (-y, x, 0), S: 半径 R=1 的半球面 (z >= 0), C: 单位圆
# curl F = (0, 0, dQ/dx - dP/dy) = (0, 0, 2)
# 面积分: 2 * area(S 投影) = 2 * pi
# 线积分: ∮ F·dr = ∮ (-y dx + x dy) = 2 * 面积(圆) = 2*pi

R = 1.0
# 线积分 (数值)
t = np.linspace(0, 2 * np.pi, 10000)
x_c = R * np.cos(t)
y_c = R * np.sin(t)
dx = np.gradient(x_c, t)
dy = np.gradient(y_c, t)
F_dot_dr = (-y_c) * dx + x_c * dy
line_integral = np.trapz(F_dot_dr, t)
print(f"Line integral ≈ {line_integral:.5f}")   # ≈ 2*pi ≈ 6.28318
print(f"2*pi = {2*np.pi:.5f}")

10. 工程与 AI 应用

流体力学 (CFD)

计算流体力学(Computational Fluid Dynamics)中,纳维-斯托克斯(Navier-Stokes)方程以散度和旋度为核心。

ρ(vt+(v)v)=p+μ2v+f\rho\left(\frac{\partial \mathbf{v}}{\partial t} + (\mathbf{v} \cdot \nabla)\mathbf{v}\right) = -\nabla p + \mu \nabla^2 \mathbf{v} + \mathbf{f}

不可压缩条件:v=0\nabla \cdot \mathbf{v} = 0

麦克斯韦方程组 (电磁学)

定律微分形式物理意义
高斯电场定律E=ρ/ε0\nabla \cdot \mathbf{E} = \rho/\varepsilon_0电荷是电场的源
高斯磁场定律B=0\nabla \cdot \mathbf{B} = 0不存在磁单极子
法拉第定律×E=B/t\nabla \times \mathbf{E} = -\partial\mathbf{B}/\partial t变化的磁场感应出电场
安培-麦克斯韦×B=μ0J+μ0ε0E/t\nabla \times \mathbf{B} = \mu_0\mathbf{J} + \mu_0\varepsilon_0\,\partial\mathbf{E}/\partial t电流与变化的电场感应出磁场

计算机图形学

3D渲染中用于光照计算的法向量(normal vector),与面积分中的 ru×rv\mathbf{r}_u \times \mathbf{r}_v 是同一个概念,直接应用于Phong着色、凹凸贴图等技术。

机器学习中的梯度下降法

梯度下降法(gradient descent)沿梯度 L\nabla \mathcal{L} 的反方向更新参数。

θn+1=θnηθL(θn)\theta_{n+1} = \theta_n - \eta\,\nabla_\theta \mathcal{L}(\theta_n)

这正是向量微积分中的梯度概念,被直接应用到高维参数空间。

Physics-Informed Neural Networks (PINNs)

PINNs 把物理方程(偏微分方程)纳入损失函数,用自动微分计算向量微积分算子(梯度、散度、旋度)。

L=Ldata+λLphysics\mathcal{L} = \mathcal{L}_{data} + \lambda\,\mathcal{L}_{physics}

其中 Lphysics\mathcal{L}_{physics} 例如是 v2\|\nabla \cdot \mathbf{v}\|^2 这样的不可压缩条件违反惩罚项。


11. Python 综合实现示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import dblquad, quad
import sympy as sp

print("=== 向量微积分 Python 计算示例 ===\n")

# --- 1. 梯度计算 ---
x_s, y_s, z_s = sp.symbols('x y z')
f = x_s**3 + y_s**2 * z_s - x_s * y_s

grad = [sp.diff(f, var) for var in (x_s, y_s, z_s)]
print("1. 梯度 (Gradient)")
print(f"   f = {f}")
print(f"   ∇f = {grad}\n")

# --- 2. 散度计算 ---
P = x_s**2 * y_s
Q = y_s**2 * z_s
R = z_s**2 * x_s
divergence = sp.diff(P, x_s) + sp.diff(Q, y_s) + sp.diff(R, z_s)
print("2. 散度 (Divergence)")
print(f"   F = ({P}, {Q}, {R})")
print(f"   div F = {divergence}\n")

# --- 3. 旋度计算 ---
curl_x = sp.diff(R, y_s) - sp.diff(Q, z_s)
curl_y = sp.diff(P, z_s) - sp.diff(R, x_s)
curl_z = sp.diff(Q, x_s) - sp.diff(P, y_s)
print("3. 旋度 (Curl)")
print(f"   curl F = ({sp.simplify(curl_x)}, {sp.simplify(curl_y)}, {sp.simplify(curl_z)})\n")

# --- 4. 格林定理数值验证 ---
# P = -y, Q = x, 单位圆盘
# 二重积分: ∬ (1 + 1) dA = 2 * pi
result, _ = dblquad(
    lambda y, x: 2.0,
    -1, 1,
    lambda x: -np.sqrt(max(0, 1 - x**2)),
    lambda x:  np.sqrt(max(0, 1 - x**2))
)
print("4. 格林定理验证")
print(f"   二重积分 ≈ {result:.5f}, 2π ≈ {2*np.pi:.5f}\n")

# --- 5. 可视化 ---
x_arr = np.linspace(-2, 2, 20)
y_arr = np.linspace(-2, 2, 20)
X, Y = np.meshgrid(x_arr, y_arr)

fig, axes = plt.subplots(1, 3, figsize=(15, 5))

# 梯度场
U1 = 2 * X
V1 = 2 * Y
axes[0].quiver(X, Y, U1, V1, color='crimson', alpha=0.7)
axes[0].set_title('Gradient of x²+y²')

# 涡旋场 (curl != 0)
U2 = -Y
V2 = X
axes[1].quiver(X, Y, U2, V2, color='steelblue', alpha=0.7)
axes[1].set_title('Rotational Field (-y, x)')

# 发散场 (source)
U3 = X
V3 = Y
axes[2].quiver(X, Y, U3, V3, color='forestgreen', alpha=0.7)
axes[2].set_title('Source Field (x, y)')

plt.tight_layout()
plt.savefig('vector_fields.png', dpi=120)
plt.show()

12. 小测验

Q1. 标量场 f 的梯度向量 ∇f 相对于等值面(level surface)指向什么方向?

答案:指向等值面的垂直(法线)方向。

解释:梯度向量 ∇f 指向 f 增长最快的方向,这个方向总是垂直于等值面 f = c。由方向导数公式 D_u f = ∇f · u 可知,对于等值面上的切线方向 t,有 D_t f = 0,因此 ∇f ⊥ t。

Q2. 若向量场 F 在所有点上的散度都为 0 (div F = 0),这种流动称为什么?

答案:称为不可压缩流动(incompressible flow),或称为无源(solenoidal)向量场。

解释:div F = ∇·F = 0 意味着单位体积内流体的净流入流出量为零。密度近乎恒定的流体(如水)的流动即属此类,这一条件源自连续性方程(continuity equation)。磁场 B 同样满足 ∇·B = 0,因此也是无源向量场。

Q3. 在格林定理 ∮C P dx + Q dy = ∬D (∂Q/∂x - ∂P/∂y) dA 中,如何求出闭曲线 C 所围内部的面积?

答案:令 P = -y/2、Q = x/2,即可得到 A = (1/2) ∮C (x dy - y dx) 来求出面积。

解释:取 P = -y/2、Q = x/2 时,∂Q/∂x - ∂P/∂y = 1/2 + 1/2 = 1。于是 ∬D 1 dA = A,面积被直接算出。这一方法是测量学(surveying)中仅凭顶点坐标计算多边形面积的鞋带公式(shoelace formula)的基础。

Q4. 在斯托克斯定理 ∮C F·dr = ∬S (∇×F)·n dS 中,若 curl F = 0,线积分等于多少?

答案:等于 0。

解释:若 curl F = ∇×F = 0,则右边的面积分为 0,因此对任意闭合路径的线积分也为 0。这意味着 F 是保守场(conservative field),存在势函数 φ 使得 F = ∇φ。因此功与路径无关,只取决于起点和终点 (∫C F·dr = φ(B) - φ(A))。

Q5. 高斯散度定理在电磁学中如何应用?

答案:用于推导高斯电场定律 ∯S E·dA = Q/ε₀。

解释:将散度定理 ∯S E·dA = ∭V (∇·E) dV 与微分形式的高斯定律 ∇·E = ρ/ε₀ 结合,可得 ∭V (ρ/ε₀) dV = Q_enc/ε₀。也就是说,穿过闭合曲面的总电通量等于内部总电荷量除以 ε₀。据此可以轻松计算具有高度对称性的电荷分布(球、圆柱、平面)所产生的电场。


参考资料

  • Kreyszig, E.Advanced Engineering Mathematics (第10版), Wiley. 向量微积分与工程数学的标准教材。
  • MIT OCW 18.02 — Multivariable Calculus (Denis Auroux). ocw.mit.edu
  • Stewart, J.Calculus: Early Transcendentals (第9版), Cengage. 线积分、面积分、向量定理相关章节。
  • SciPy Documentation — 用 scipy.integrate 模块进行多重积分的数值计算。scipy.org
  • SymPy Documentation — 符号微分/积分库。sympy.org
  • Griffiths, D.J.Introduction to Electrodynamics (第4版), Cambridge. 麦克斯韦方程组与向量微积分的物理应用。