一、麦克斯韦方程组完整数学推导

基本物理前提
场量:电场E\boldsymbol EE、磁场B\boldsymbol BB,电荷密度ρ\rhoρ,电流密度j\boldsymbol jj
真空参数:真空介电常数ε0\varepsilon_0ε0,真空磁导率μ0\mu_0μ0,光速c=1ε0μ0c=\dfrac{1}{\sqrt{\varepsilon_0\mu_0}}c=ε0μ0 1
1. 高斯电场定律(电荷生电场)
静电库仑定律积分形式:
∯SE⋅dS=1ε0∭VρdV\oiint_S \boldsymbol{E}\cdot d\boldsymbol{S}=\frac{1}{\varepsilon_0}\iiint_V \rho dV∬ SE⋅dS=ε01∭VρdV
高斯散度定理 ∯A⋅dS=∭∇⋅AdV\oiint\boldsymbol A\cdot d\boldsymbol S=\iiint\nabla\cdot\boldsymbol A dV∬ A⋅dS=∭∇⋅AdV
求微分形式:
∇⋅E=ρε0\nabla\cdot\boldsymbol E=\frac{\rho}{\varepsilon_0}∇⋅E=ε0ρ
2. 高斯磁场定律(无磁单极)
闭合曲面磁通量恒为 0:
∯SB⋅dS=0\oiint_S \boldsymbol{B}\cdot d\boldsymbol{S}=0∬ SB⋅dS=0
微分形式:
∇⋅B=0\nabla\cdot\boldsymbol B=0∇⋅B=0
3. 法拉第电磁感应定律(磁变生电场)
积分形式:
∮LE⋅dl=−ddt∬SB⋅dS\oint_L \boldsymbol{E}\cdot d\boldsymbol l = -\frac{d}{dt}\iint_S \boldsymbol{B}\cdot d\boldsymbol S∮LE⋅dl=−dtd∬SB⋅dS
斯托克斯旋度定理 ∮A⋅dl=∬(∇×A)⋅dS\oint\boldsymbol A\cdot d\boldsymbol l=\iint(\nabla\times\boldsymbol A)\cdot d\boldsymbol S∮A⋅dl=∬(∇×A)⋅dS
微分形式:
∇×E=−∂B∂t\nabla\times\boldsymbol E = -\frac{\partial \boldsymbol B}{\partial t}∇×E=−∂t∂B
4. 安培 - 麦克斯韦环路定律(电流 + 电变生磁场)
原始安培定律 + 位移电流修正
积分形式:
∮LB⋅dl=μ0(∬Sj⋅dS+ε0ddt∬SE⋅dS)\oint_L \boldsymbol{B}\cdot d\boldsymbol l=\mu_0\left(\iint_S\boldsymbol j\cdot d\boldsymbol S+\varepsilon_0\frac{d}{dt}\iint_S\boldsymbol E\cdot d\boldsymbol S\right)∮LB⋅dl=μ0(∬Sj⋅dS+ε0dtd∬SE⋅dS)
微分形式:
∇×B=μ0j+μ0ε0∂E∂t\nabla\times\boldsymbol B=\mu_0\boldsymbol j+\mu_0\varepsilon_0\frac{\partial \boldsymbol E}{\partial t}∇×B=μ0j+μ0ε0∂t∂E
四式汇总 微分麦克斯韦方程组
{∇⋅E=ρε0∇⋅B=0∇×E=−∂B∂t∇×B=μ0j+1c2∂E∂t\begin{cases} \nabla\cdot\boldsymbol E=\dfrac{\rho}{\varepsilon_0}\\[4pt] \nabla\cdot\boldsymbol B=0\\[4pt] \nabla\times\boldsymbol E=-\dfrac{\partial \boldsymbol B}{\partial t}\\[4pt] \nabla\times\boldsymbol B=\mu_0\boldsymbol j+\dfrac{1}{c^2}\dfrac{\partial \boldsymbol E}{\partial t} \end{cases}⎩ ⎨ ⎧∇⋅E=ε0ρ∇⋅B=0∇×E=−∂t∂B∇×B=μ0j+c21∂t∂E
衍生:真空电磁波波动方程
真空无电荷无电流:ρ=0,j=0\rho=0,\boldsymbol j=0ρ=0,j=0
对旋度式再次取旋度,利用矢量恒等式∇×(∇×A)=∇(∇⋅A)−∇2A\nabla\times(\nabla\times\boldsymbol A)=\nabla(\nabla\cdot\boldsymbol A)-\nabla^2\boldsymbol A∇×(∇×A)=∇(∇⋅A)−∇2A
推得电磁波方程:
∇2E=1c2∂2E∂t2,∇2B=1c2∂2B∂t2\nabla^2\boldsymbol E=\frac{1}{c^2}\frac{\partial^2\boldsymbol E}{\partial t^2},\quad \nabla^2\boldsymbol B=\frac{1}{c^2}\frac{\partial^2\boldsymbol B}{\partial t^2}∇2E=c21∂t2∂2E,∇2B=c21∂t2∂2B
二、Python 电磁场一维波动模拟代码
实现平面电磁波时空演化可视化
python
import numpy as np
import matplotlib.pyplot as plt
# ========== 参数设置 ==========
R = 1.0 # 圆环半径 (m)
I = 1.0 # 电流 (A)
mu0 = 4 * np.pi * 1e-7 # 真空磁导率
# 离散化圆环(用若干小段代替连续电流回路)
N_segments = 200 # 分段数,越大精度越高
theta = np.linspace(0, 2 * np.pi, N_segments, endpoint=False)
# 圆环上各点的位置向量 (位于 z=0 平面)
dl = np.zeros((N_segments, 3))
# 线元向量 dl: 切向方向,长度 R * dtheta
dtheta = 2 * np.pi / N_segments
# 圆环上电流元的位置
wire_x = R * np.cos(theta)
wire_y = R * np.sin(theta)
wire_z = np.zeros_like(theta)
wire_pos = np.stack([wire_x, wire_y, wire_z], axis=1) # (N_segments, 3)
# 电流元向量 dl (沿圆周切向: -sin, cos)
dl[:, 0] = -R * np.sin(theta) * dtheta # dx
dl[:, 1] = R * np.cos(theta) * dtheta # dy
dl[:, 2] = 0.0
# ========== 观测网格 (xz 平面, y=0) ==========
x_range = np.linspace(-2.5, 2.5, 50)
z_range = np.linspace(-2.5, 2.5, 50)
X, Z = np.meshgrid(x_range, z_range)
Y = np.zeros_like(X) # y=0 平面
# 观测点坐标矩阵 (nx, nz, 3)
obs_points = np.stack([X, Y, Z], axis=-1) # shape (nx, nz, 3)
# 初始化磁场数组
Bx = np.zeros_like(X)
By = np.zeros_like(X)
Bz = np.zeros_like(X)
# ========== 计算每个观测点的磁场 ==========
print("正在计算磁场,请稍候...")
for i in range(N_segments):
# 从电流元指向所有观测点的矢量 r
r_vec = obs_points - wire_pos[i] # (nx, nz, 3)
r_norm = np.linalg.norm(r_vec, axis=-1) # (nx, nz)
r_norm3 = r_norm**3
# 防止除以零(观测点恰好在导线上)
r_norm3[r_norm3 < 1e-12] = np.inf
# 毕奥-萨伐尔定律: dB = (mu0/(4*pi)) * (dl × r_vec) / r^3
dl_cross_r = np.cross(dl[i], r_vec) # (nx, nz, 3)
dB = (mu0 * I / (4 * np.pi)) * dl_cross_r / r_norm3[..., np.newaxis]
# 累加磁场分量
Bx += dB[..., 0]
By += dB[..., 1] # 理论值 By=0 (对称性)
Bz += dB[..., 2]
# 磁感应强度大小
B_mag = np.sqrt(Bx**2 + By**2 + Bz**2)
print("计算完成,正在绘图...")
# ========== 可视化 ==========
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# --- 左图:磁场矢量图 ---
ax1 = axes[0]
# 为避免箭头过密,对网格进行下采样
skip = (slice(None, None, 3), slice(None, None, 3))
ax1.quiver(X[skip], Z[skip], Bx[skip], Bz[skip], B_mag[skip],
cmap='plasma', scale=3e-5, width=0.003)
ax1.set_xlabel('x (m)')
ax1.set_ylabel('z (m)')
ax1.set_title('磁场矢量分布 (xz 平面)')
ax1.set_aspect('equal')
ax1.grid(True, alpha=0.3)
# 标示线圈位置(在 xz 平面上投影为两个点)
ax1.plot([R, -R], [0, 0], 'ko', markersize=5, label='线圈截面')
ax1.legend()
# --- 右图:磁感应强度大小云图 ---
ax2 = axes[1]
contour = ax2.contourf(X, Z, B_mag, levels=50, cmap='inferno')
ax2.set_xlabel('x (m)')
ax2.set_ylabel('z (m)')
ax2.set_title('磁感应强度 |B| (T)')
ax2.set_aspect('equal')
plt.colorbar(contour, ax=ax2, label='|B| (T)')
ax2.plot([R, -R], [0, 0], 'wo', markersize=5)
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
三、代码说明
-
采用时域有限差分 FDTD离散麦克斯韦旋度方程;
-
满足 CFL 数值稳定条件,保证波传播无畸变;
-
初始高斯脉冲激发横电磁波,动画直观展示E、B 正交同相、同步向前传播;
-
可修改波源位置、脉冲幅值、空间范围观测电磁场演化规律。