麦克斯韦方程组(电磁效应Python展示)

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

基本物理前提

场量:电场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()

三、代码说明

  1. 采用时域有限差分 FDTD离散麦克斯韦旋度方程;

  2. 满足 CFL 数值稳定条件,保证波传播无畸变;

  3. 初始高斯脉冲激发横电磁波,动画直观展示E、B 正交同相、同步向前传播

  4. 可修改波源位置、脉冲幅值、空间范围观测电磁场演化规律。

相关推荐
计算机安禾4 小时前
【c++面向对象编程】第41篇:函数模板与类模板:泛型编程的基石
开发语言·c++·算法
SilentSamsara5 小时前
属性查找顺序:实例 → 类 → 父类的完整 MRO
开发语言·python·算法·青少年编程
甄心爱学习5 小时前
【项目实训】法律文书智能摘要系统6
python·个人开发
运维行者_5 小时前
云计算连接性与互操作性
服务器·开发语言·网络·web安全·网络基础设施
郝学胜-神的一滴5 小时前
Qt 高级开发 010: 从跨界面传值到自定义信号
开发语言·c++·qt·程序人生·用户界面
社交怪人5 小时前
【浮点数相除的余】信息学奥赛一本通C语言解法(题号1029)
c语言·开发语言
努力弹琴的大风天5 小时前
如何用AI开发matlab/Simulink工具栏模块,实现相关的功能
开发语言·人工智能·matlab
小白学大数据5 小时前
Scrapling:极简高效的 Python 智能爬虫框架
开发语言·爬虫·python·数据分析
辣椒思密达5 小时前
Python爬虫中如何正确配置住宅IP代理?新手避坑指南
c语言·python