当代码遇上电磁波:手搓一个简易吸波器

当代码遇上电磁波:手搓一个简易吸波器 吸波案例早上被楼下装修电钻声吵醒的时候突然想到电磁波其实也需要消音。打开冰箱拿牛奶手机突然没信号——这大概就是现实版的电磁波屏蔽现场。今天咱们用Python造个玩具级吸波器看看电磁波是怎么被吃掉的。先来点基础设定。假设我们面对的是1GHz的电磁波就像微波炉里跳舞的那个频率。材料参数取个典型值相对介电常数ε_r4电导率σ0.1 S/m。上代码import numpy as np import matplotlib.pyplot as plt # 材料参数 epsilon_r 4.0 # 相对介电常数 sigma 0.1 # 电导率(S/m) mu_0 4e-7 * np.pi # 真空磁导率 epsilon_0 8.85e-12 # 真空介电常数这里有个隐藏知识点电导率σ越大材料损耗越高。但太大反而会反射电磁波就像用力过猛会把皮球弹回来一样。接下来构建计算区域size 200 # 空间点数 cfl 0.5 # 稳定因子 dx 0.01 # 空间步长(m) dt cfl * dx / (3e8) # 时间步长 steps 500 # 总时间步时间步长这里用了CFL条件保持数值稳定性。就像走楼梯不能一步跨三阶否则会摔跟头。现在初始化场量Ez np.zeros(size) # 电场分量 Hy np.zeros(size) # 磁场分量 absorb np.zeros(size) # 吸收系数矩阵 absorb[150:] 0.2 # 在150号节点后设置吸收层重点在吸收层设置。这里用了最简单的线性递增吸收系数像给电磁波铺了条摩擦力逐渐增大的跑道。接下来是核心的迭代计算for t in range(steps): # 更新磁场 Hy[:-1] Hy[:-1] (Ez[1:] - Ez[:-1]) * dt/(mu_0*dx) # 加入高斯脉冲源 if t 50: Ez[50] np.exp(-(t-20)**2 / 30.0) # 更新电场含损耗项 Ez[1:-1] (Ez[1:-1] (Hy[1:-1] - Hy[:-2]) * dt/(epsilon_0*epsilon_r*dx) - sigma * Ez[1:-1] * dt/(epsilon_0*epsilon_r)) # 吸收边界处理 Ez Ez * (1 - absorb) # 关键吸收操作电场更新方程里那个σ项就是能量耗散的关键相当于给电磁波踩刹车。最后的absorb矩阵乘法操作让场量在特定区域逐渐衰减。跑完仿真后看看效果plt.plot(Ez, labelElectric Field) plt.plot(absorb*10, --, labelAbsorption Area (scaled)) plt.legend() plt.show()当看到电场在吸收区像被拽住尾巴的彗星一样逐渐暗淡说明我们的简易吸波器起效了。试着把sigma调大到0.5会发现电场还没进入吸收区就被反弹回来——这就是传说中的过犹不及。吸波案例进阶玩法把吸收系数矩阵改成指数递增或者在时域加窗函数。有次我把吸收层参数调得激进结果数值震荡得像蹦迪现场提醒我们仿真参数要温柔对待。最后留个思考题当电磁波遇到理想导体σ→∞时代码中的哪个项会导致电场瞬间归零这个现象对应现实中的什么物理现象