
一句话介绍:程序在 50 × 24 × 10 的三维 Yee 网格上,以 2 mm 空间步长和约 3.336 ps 时间步长推进电磁场,用 z 向微分高斯脉冲激励 Ez,在 PEC 外边界内迭代 500 步并生成两个 Ez 截面的动画;但源码中没有球体几何、空间高斯波束、散射场分离、近远场变换和 RCS 后处理,因此按当前文件事实,它更准确地说是一套三维 FDTD 场传播与 PEC 边界演示程序,而不是已经闭环完成的球体 RCS 求解器。
三维自由空间网格 → 初始化 E/H 六个场分量 → 在固定 x-y 位置向整条 z 方向加入微分高斯脉冲 → 交替更新电场和磁场 → PEC 外边界反射 → 提取两个Ez截面 → 记录并播放时域动画
这里最需要先分清的一点是:
1. 当前工程里到底有什么?
文件 | 当前实际作用 |
|---|---|
FDTD_3D_RCS.m | 建立三维 Yee 网格,更新 Ex/Ey/Ez/Hx/Hy/Hz,加入微分高斯脉冲源,并显示两个 Ez 截面的时域变化 |
2. 三维计算区域有多大?
程序直接在脚本开头写死了网格与时间参数。
项目 | 当前值 | 含义 |
|---|---|---|
ie | 50 | x 方向网格单元数 |
je | 24 | y 方向网格单元数 |
ke | 10 | z 方向网格单元数 |
dx | 0.002 m | 三个方向统一使用 2 mm 立方网格 |
dt | dx/(2c) | 时间步长约 3.336 ps |
nmax | 500 | 总时间步数 |
eps | 1.0 | 相对介电常数按自由空间处理 |
sig | 0 | 电导率为 0 |
按单元数量乘以 2 mm 估算,名义计算区域约为:
100 mm × 48 mm × 20 mm
500 个时间步对应的总时长约为:
1.668 ns
这个尺度说明当前脚本本质上是在一个很小的三维电磁计算盒内观察瞬态场传播。
3. 为什么六个场分量的数组尺寸不一样?
程序使用的是典型 Yee 交错网格。电场和磁场并不存放在同一个几何位置,而是分别放在网格边和网格面附近,因此六个数组维度会彼此错开一格。
场分量 | 数组尺寸 |
|---|---|
Ex | 50 × 25 × 11 |
Ey | 51 × 24 × 11 |
Ez | 51 × 25 × 10 |
Hx | 51 × 24 × 10 |
Hy | 50 × 25 × 10 |
Hz | 50 × 24 × 11 |
这种交错存储正是 FDTD 能直接用邻近差分近似旋度的关键。
简单理解就是:
每个电场分量都利用周围磁场分量的差分更新,每个磁场分量又利用周围电场分量的差分更新,E 和 H 在空间与时间上交错推进。
4. 这套 FDTD 的核心更新关系是什么?
当前脚本直接来自 Maxwell 旋度方程的时域离散思想。连续关系可以概括为:
∂E/∂t = (∇×H - σE) / ε
∂H/∂t = -(∇×E) / μ
程序把它们离散后写成六组数组更新。以 Ez 为例,新的 Ez 由三部分共同决定:
上一时刻的Ez+ x 方向附近Hy的差分 + y 方向附近Hx的差分
由于当前设置 sig = 0,电场衰减系数 ca 实际等于 1,因此介质本身没有欧姆损耗。
整个单步推进顺序非常清楚:
更新Ex/Ey/Ez→ 给Ez加入源 → 更新Hx/Hy/Hz→ 必要时绘图并保存帧
这就是当前程序最核心、也最完整的一条数值主线。
5. 当前时间步长为什么是稳定的?
三维显式 FDTD 不能随意增大时间步长,否则数值波会发散。对于三个方向都使用同一空间步长 dx 的立方网格,常见 Courant 稳定条件可写成:
c·dt/dx ≤ 1/√3 ≈ 0.577
当前代码取:
dt = dx/(2c)
所以 Courant 数为:
c·dt/dx = 0.5
0.5 小于约 0.577,说明当前 dt 与 dx 的组合满足三维立方 Yee 网格的稳定性要求。
这也是源码里最值得保留的一个参数关系:如果以后改 dx,dt 不能脱离稳定条件单独随意增大。
6. 源码中的“高斯激励”实际是什么?
源码注释写得很明确:
Differentiated Gaussian pulse excitation
也就是微分高斯脉冲,不是普通单频正弦波。
程序设置:
rtau = 50 ps;
tau = rtau/dt ≈ 14.99 个时间步;
ndelay = 3tau ≈ 44.97 个时间步;
源项形状与 (n - ndelay)·exp[-((n - ndelay)/tau)²] 成正比。
微分高斯脉冲是宽带瞬态激励,因此一次时域推进可以同时包含一段频带内的响应信息。
但当前代码并没有继续把场信号做 FFT、提取指定频点或者计算各频率的散射强度,所以这个“宽带”优势在现有脚本里只用于产生瞬态传播,并没有真正转化成频域 RCS 曲线。
7. 它是“高斯波束”吗?
不是,至少当前源码没有实现空间上的高斯波束分布。
源位置写成:
is = 26,js = 13
随后程序执行的是:
ez(is,js,1:ke) = ez(is,js,1:ke) + source
也就是说,在固定的 x-y 网格位置上,从k=1到k=10的整条 z 方向同时加入同一个源值。
这更接近一个 z 向线状软源,而不是横截面幅度满足高斯函数分布的空间波束。
真正的高斯波束通常至少需要在横向坐标上建立类似“中心最强、离轴逐渐衰减”的空间包络,而当前脚本没有任何关于源横向半径、束腰、传播方向相位或空间高斯权重的计算。
所以这里必须区分两个概念:
时间上是微分高斯脉冲;空间上不是高斯波束。
8. PEC 边界在程序里是怎样形成的?
源码没有单独写一行“把边界电场设为 0”,而是通过只更新内部允许位置、让外层切向电场保持初始化零值来形成 PEC 边界。
所有场数组一开始都由 zeros 初始化。随后电场更新时,边界上的相关切向分量被排除在更新索引之外,于是它们一直保持 0。
PEC 的基本边界条件就是:
导体表面切向电场为 0。
因此当前计算盒的外边界相当于理想导体墙。
这里还有一个非常重要的后果:
PEC 外边界会把传播到边缘的电磁波反射回来。当前程序没有 PML、Mur 或其他吸收边界,所以它不是一个模拟“无限自由空间”的开放散射区域。
这会让后期时域场逐渐混入边界反射,对于真正做开放空间 RCS 是一个必须解决的问题。
9. 程序最终实际观察的是什么结果?
当前脚本没有输出 RCS 数值,而是观察 Ez 的两个二维截面。
第一个截面固定:k = 5
显示 Ez(i,j,k=5),也就是 x-y 平面上的场分布。
第二个截面固定:j = 13
显示 Ez(i,j=13,k),也就是 x-z 平面上的场分布。
程序每隔 2 个时间步刷新一次图像,因此 500 步一共会记录:250 帧
每一帧通过 getframe 保存,最后再调用 movie 播放。
所以当前程序真正可见的输出是:
微分高斯脉冲激励后,Ez在 PEC 三维计算盒中的传播与反射动画。
另外,绘图色轴被固定为 [-1, 1]。这有利于不同时间步使用统一颜色尺度,但如果实际场幅超过这个范围,颜色会出现饱和,图像不能继续反映更大的幅值差异。
10. 为什么当前源码里其实没有“球体散射”?
如果要计算 PEC 球的散射,程序至少要知道:
球心在哪里;
球半径是多少;
哪些 Yee 网格点落在球体内部或球面附近;
球体区域如何施加 PEC 条件;
入射波怎样照射球体。
但当前源码中的材料参数只有全局常数:
eps = 1.0
sig = 0.0
没有任何根据 (x,y,z) 判断“是否位于球内”的几何逻辑,也没有球半径、球心或球面掩膜。
因此整个内部区域实际上都是均匀自由空间,PEC 只体现在计算盒外边界,而不是一个嵌入自由空间中的 PEC 球体。
11. 为什么当前源码也没有真正的 RCS 计算?
RCS 不是“看到场被反射”就自动得到的量。
在远场条件下,RCS 的核心思想可以概括为:
σ ≈ 4πr²·|Eₛ|² / |Eᵢ|²
其中 Eₛ 是散射场,Eᵢ 是入射场,还必须明确频率、观察方向和极化条件。
而当前脚本没有出现下面这些环节:
入射场与散射场分离:没有 Total-Field/Scattered-Field 区域或等价处理;
目标散射场采样:没有包围目标的近场采样面;
频域变换:没有把宽带时域结果变成指定频率的复数场;
近远场变换:没有从有限区域场值推到远场角分布;
归一化:没有用入射场强度归一化得到 σ;
RCS 输出:没有 m²、dBsm、角度曲线或频率曲线。
12. 如果要把它补成真正的球体 RCS,缺哪几步?
从当前脚本继续扩展,比较自然的完整链路应当是:
建立三维 Yee 网格 → 在自由空间中放置 PEC 球体 → 设置可控入射波 → 使用 PML 等吸收边界 → 记录球体附近散射场 → 时域转频域 → 近场转远场 → 按入射场归一化 → 输出不同频率/角度下的 RCS
其中最关键的不是“多画几张图”,而是补齐四个当前完全缺失的模块:
根据球心和半径建立三维掩膜,让球体内部/表面的电场满足 PEC 条件,而不是只让计算盒外墙是 PEC。
RCS 描述的是目标在开放空间中的散射。计算域边缘如果仍然是 PEC,边界反射会重新进入目标附近,污染散射场,因此通常需要 PML 等吸收边界。
只有知道“没有目标时的入射场”和“有目标后的总场”,才能可靠得到目标引入的散射贡献。TFSF 是 FDTD 中常用的一类处理方法。
RCS 最终关心的是远场散射强度,而当前 pcolor 只画近场截面。必须增加采样、傅里叶变换、远场积分/变换和归一化,才会真正得到 RCS。
13. 当前程序更适合用在哪里?
程序只有一个脚本,六个场分量和三组电场/磁场更新式都集中在一起,比较适合观察 Yee 网格的基本写法。
微分高斯脉冲进入计算盒后,可以通过两个 Ez 截面直观看到波的传播以及边界反射。
网格、时间推进、六分量更新和基本源已经搭起来,可以继续增加材料、目标、吸收边界和远场后处理。
但按当前源码,不适合直接把它当作:
已完成的 PEC 球 RCS 求解器;
高斯波束散射程序;
可直接输出 dBsm 曲线的工程工具;
开放空间高精度散射仿真平台。
14. 当前源码还有哪些值得注意的实现边界?
程序只在内存中推进场并生成动画,没有把某个观察点的时域波形、频谱或 RCS 保存到文件。
Ez 的软源源码把源项直接加到 ez(is,js,1:ke),没有单独建立带物理单位的电流密度数组,因此更适合作为数值激励来理解,不应把当前场幅直接解释成已经标定的实际天线辐射场。
由于没有吸收层,计算时间越长,边界返回波对域内场分布的影响越明显。
15. 哪些参数最值得修改?
当前脚本里真正会改变数值行为的参数主要是下面这些。
参数 | 当前值 | 为什么值得改 | 调整后的主要影响 |
|---|---|---|---|
dx | 0.002 m | 决定空间分辨率,也是时间步长设计的基础 | 减小后能解析更细空间变化,但三维网格量和计算成本快速增加 |
dt | dx/(2c) | 直接决定稳定性和时间分辨率 | 应与 dx 联动并满足 Courant 条件,不能只为加速而任意放大 |
ie,je,ke | 50, 24, 10 | 决定计算域实际尺寸 | 增大可把边界推远,但内存、更新量和动画数据都会增加 |
nmax | 500 | 决定仿真的总时长 | 增大能观察更晚的传播过程,同时也会看到更多 PEC 边界反射 |
rtau | 50 ps | 决定微分高斯脉冲的时间宽度与频谱范围 | 改变后会改变激励的主要频率尺度和带宽 |
is,js | 26, 13 | 决定 z 向线源在 x-y 平面的位置 | 改变后会改变波从域内哪个位置发出,以及与边界的传播距离 |
如果最终目标是球体 RCS,那么优先级更高的不是继续微调这些现有数值,而是先把球体、吸收边界、散射场分离和 RCS 后处理补齐。
16. 怎么运行?
主入口就是:FDTD_3D_RCS.m
按源码默认流程,程序会:
清空工作区 → 初始化常数和网格 → 分配六个场数组 → 建立初始Ez截面 → 迭代 500 个时间步 → 每 2 步保存一次动画帧 → 调用movie播放
当前脚本没有参数输入界面,想改变计算条件需要直接修改源码开头的网格、时间步数、源参数和观察截面位置。
需要特别注意:如果运行目标是“复现当前源码”,不要预期程序结束后自动出现球体 RCS 数值或 dBsm 曲线;当前版本的输出就是 Ez 截面动画。
17. 一句话看懂这个项目
这是一个三维 FDTD 时域电磁场演示程序:它在 50 × 24 × 10 个 2 mm 立方 Yee 网格上,以约 3.336 ps 的稳定时间步长推进Ex/Ey/Ez/Hx/Hy/Hz,在i=26、j=13位置沿 z 方向加入 50 ps 微分高斯脉冲,并在 PEC 外边界内迭代 500 步,通过k=5和j=13两个Ez截面观察场传播与反射。需要特别注意,当前源码没有球体几何、空间高斯波束、吸收边界、散射场分离、近远场变换和 RCS 归一化,所以它可以作为三维 FDTD 与 PEC 边界的学习/扩展基础,但不能按现有文件直接视为已经完成的球体 RCS 计算程序。