电磁场仿真-主题059-电磁仿真软件对比
第059篇:电磁仿真软件对比
摘要
电磁仿真软件是现代电磁工程设计的核心工具,广泛应用于天线设计、微波电路、电磁兼容、雷达散射等领域。本主题系统对比分析主流电磁仿真软件的技术特点、算法原理、适用范围和性能表现,包括商业软件ANSYS HFSS、CST Studio Suite、FEKO、COMSOL Multiphysics,以及开源软件MEEP、OpenEMS、ElmerFEM等。通过理论分析和Python仿真对比,深入探讨不同数值方法(有限元法FEM、时域有限差分法FDTD、矩量法MoM、有限积分法FIT)的实现原理和适用场景,为工程师和研究人员选择合适的仿真工具提供科学依据。同时,本主题还将介绍电磁仿真软件的发展趋势,包括云计算集成、AI辅助设计、多物理场耦合等前沿技术。
关键词
电磁仿真软件, 有限元法, 时域有限差分法, 矩量法, ANSYS HFSS, CST Studio Suite, 软件对比, 数值算法, 计算电磁学, 开源仿真



1. 电磁仿真软件概述
1.1 电磁仿真软件的发展历史
电磁仿真软件的发展与计算电磁学的进步密不可分。20世纪60年代,随着计算机技术的发展,电磁场数值计算方法开始兴起。1966年,Kane Yee提出了时域有限差分法(FDTD),为电磁仿真奠定了重要基础。此后,有限元法(FEM)、矩量法(MoM)等数值方法相继被引入电磁场计算。
20世纪80-90年代是商业电磁仿真软件的快速发展期:
- 1984年:HP(现Keysight)推出Momentum,专注于平面电路仿真
- 1990年:Ansoft公司发布Maxwell 2D,后发展为Maxwell 3D
- 1996年:ANSYS收购HFSS(High Frequency Structure Simulator),成为高频电磁仿真的标杆
- 1998年:CST公司成立,推出CST Microwave Studio,以时域求解器著称
- 2000年后:COMSOL Multiphysics、FEKO等软件相继成熟,形成多元化竞争格局
进入21世纪,电磁仿真软件呈现以下发展趋势:
- 多物理场耦合:电磁-热-结构-流体多场协同仿真
- 系统级仿真:从组件级向系统级扩展,支持完整链路分析
- 云计算与HPC:支持大规模并行计算和云端部署
- AI集成:机器学习辅助优化、智能网格划分、代理模型构建
- 开源生态:MEEP、OpenEMS等开源软件推动技术普及
1.2 电磁仿真软件的分类
根据数值方法和应用特点,电磁仿真软件可分为以下几类:
1.2.1 按数值方法分类
频域方法:
- 有限元法(FEM):ANSYS HFSS、COMSOL、JMAG
- 矩量法(MoM):FEKO、ADS Momentum、IE3D
- 有限体积法(FVM):Fluent with EM模块
时域方法:
- 时域有限差分法(FDTD):CST、XFdtd、MEEP、OpenEMS
- 时域有限积分法(FIT):CST、MAFIA
- 传输线矩阵法(TLM):MicroStripes、MEFiSTo
混合方法:
- FEM-MoM混合:ANSYS HFSS、FEKO
- FDTD-MoM混合:CST、XFdtd
- PO-UTD混合:FEKO、GRASP
1.2.2 按应用频率分类
低频电磁(准静态):
- 电机、变压器、传感器设计
- 代表软件:ANSYS Maxwell、JMAG、Opera、Infolytica MagNet
高频电磁(全波):
- 天线、微波电路、雷达散射
- 代表软件:ANSYS HFSS、CST、FEKO、ADS
光频电磁:
- 光子器件、纳米光学、等离子体
- 代表软件:Lumerical、COMSOL、MEEP、JCMsuite
1.2.3 按软件类型分类
商业软件:
- 综合型:ANSYS HFSS、CST Studio Suite、COMSOL Multiphysics
- 专用型:FEKO(天线/RCS)、ADS(电路)、Maxwell(低频)
开源软件:
- FDTD:MEEP(MIT)、OpenEMS(GPL)、gprMax(GPR专用)
- FEM:ElmerFEM、FEniCS、deal.II
- MoM:NEC2、ASAP
1.3 电磁仿真软件选型原则
选择合适的电磁仿真软件需要考虑以下因素:
1. 物理问题特性
- 频率范围:低频(准静态)vs 高频(全波)
- 几何复杂度:简单结构 vs 精细细节
- 材料特性:均匀材料 vs 各向异性/非线性/色散材料
- 尺寸规模:电小尺寸 vs 电大尺寸
2. 数值方法适用性
- 频域 vs 时域:宽带响应 vs 窄带谐振
- 计算效率:矩阵求解 vs 迭代求解
- 内存需求:稠密矩阵 vs 稀疏矩阵
3. 软件功能需求
- 优化能力:参数化扫描、遗传算法、粒子群优化
- 多物理场:电磁-热-结构耦合
- 系统级仿真:电路协同仿真、链路分析
- 后处理:远场计算、S参数提取、场可视化
4. 实际约束条件
- 预算限制:商业软件许可费用
- 计算资源:单机 vs 集群 vs 云计算
- 学习曲线:专业培训需求
- 技术支持:厂商支持 vs 社区支持
2. 主流商业电磁仿真软件详解
2.1 ANSYS HFSS
2.1.1 软件概述
ANSYS HFSS(High Frequency Structure Simulator)是业界公认的三维全波电磁场仿真黄金标准,采用有限元法(FEM)求解麦克斯韦方程组。HFSS最初由Ansoft公司开发,2008年被ANSYS收购后整合到ANSYS仿真平台中。
核心特点:
- 频域有限元法:基于变分原理的FEM求解器,精度高、收敛性好
- 自适应网格技术:自动加密网格直至收敛,保证结果精度
- 多种求解器:频域求解器、时域求解器(Transient)、本征模求解器
- 多物理场耦合:与ANSYS热、结构、流体模块无缝集成
2.1.2 数值方法原理
HFSS的核心是频域有限元法,其数学基础是求解以下矢量波动方程:
∇×(1μr∇×E)−k02εrE=0\nabla \times \left( \frac{1}{\mu_r} \nabla \times \mathbf{E} \right) - k_0^2 \varepsilon_r \mathbf{E} = 0∇×(μr1∇×E)−k02εrE=0
其中,E\mathbf{E}E为电场强度,μr\mu_rμr为相对磁导率,εr\varepsilon_rεr为相对介电常数,k0=ωμ0ε0k_0 = \omega\sqrt{\mu_0\varepsilon_0}k0=ωμ0ε0为自由空间波数。
有限元离散过程:
- 区域剖分:将计算域离散为四面体单元网格
- 基函数选择:采用矢量棱边元(Edge Element)基函数:
Ni(e)=li(e)6V(e)(ri(e)−r)×li(e)\mathbf{N}_i^{(e)} = \frac{l_i^{(e)}}{6V^{(e)}} \left( \mathbf{r}_i^{(e)} - \mathbf{r} \right) \times \mathbf{l}_i^{(e)}Ni(e)=6V(e)li(e)(ri(e)−r)×li(e) - 伽辽金加权:建立弱形式方程
- 矩阵组装:形成大型稀疏线性方程组
- 求解器:直接求解器(MUMPS、PARDISO)或迭代求解器
自适应网格加密算法:
HFSS采用基于后验误差估计的自适应网格加密策略:
ηK=∥rK∥L2(K)∥∇×E∥L2(K)\eta_K = \frac{\|\mathbf{r}_K\|_{L^2(K)}}{\|\nabla \times \mathbf{E}\|_{L^2(K)}}ηK=∥∇×E∥L2(K)∥rK∥L2(K)
其中ηK\eta_KηK为单元KKK的误差指示器,rK\mathbf{r}_KrK为残差。网格在误差较大的区域自动加密,直至全局误差满足收敛准则。
2.1.3 主要功能模块
1. 3D Layout
- 针对PCB和封装设计的专用界面
- 支持层叠结构快速建模
- 集成ECAD数据导入(ODB++、IPC-2581)
2. SBR+(射线弹跳法)
- 适用于电大尺寸目标
- 基于几何光学和物理光学近似
- 支持天线安装性能分析
3. 本征模求解器
- 计算谐振腔的谐振频率和Q值
- 用于滤波器、谐振器设计
4. 瞬态求解器
- 时域有限元法(FETD)
- 适用于宽带信号分析和非线性材料
2.1.4 优势与局限
优势:
- 高精度:有限元法在复杂几何和材料建模方面精度最高
- 自适应网格:自动保证结果收敛,减少人工干预
- 材料建模:支持各向异性、色散、非线性材料
- 多物理场:与ANSYS平台深度集成
- 行业标准:天线、微波器件设计的基准工具
局限:
- 计算成本:频域求解器对宽带问题效率较低
- 内存需求:直接求解器内存消耗大
- 电大尺寸:对电大尺寸问题(>10λ)效率下降
- 学习曲线:功能复杂,需要专业培训
2.2 CST Studio Suite
2.2.1 软件概述
CST Studio Suite是达索系统(Dassault Systèmes)旗下的三维电磁仿真软件,以时域有限积分法(FIT)为核心算法。CST在时域仿真领域具有显著优势,特别适合宽带、瞬态电磁问题。
核心特点:
- 时域有限积分法(FIT):基于麦克斯韦网格方程的时域求解
- 多种求解器集成:FIT、FEM、MoM、MLFMM、PO/UTD
- 高效宽带仿真:一次时域仿真获得全频段响应
- 电路协同仿真:内置电路仿真器,支持场路协同
2.2.2 数值方法原理
时域有限积分法(FIT):
FIT由Thomas Weiland于1977年提出,将麦克斯韦方程组在空间和时间上离散:
空间离散(对偶网格):
- 主网格(Grid):定义电场分量(棱边)和磁通量(面)
- 对偶网格(Dual Grid):定义磁场分量(棱边)和电通量(面)
离散麦克斯韦方程组:
Ce=−ddtbC~h=ddtd+jSb=0S~d=q\begin{aligned} \mathbf{C} \mathbf{e} &= -\frac{d}{dt} \mathbf{b} \\ \tilde{\mathbf{C}} \mathbf{h} &= \frac{d}{dt} \mathbf{d} + \mathbf{j} \\ \mathbf{S} \mathbf{b} &= 0 \\ \tilde{\mathbf{S}} \mathbf{d} &= \mathbf{q} \end{aligned}CeC~hSbS~d=−dtdb=dtdd+j=0=q
其中,C\mathbf{C}C和C~\tilde{\mathbf{C}}C~为离散旋度算子,S\mathbf{S}S和S~\tilde{\mathbf{S}}S~为离散散度算子,e\mathbf{e}e、h\mathbf{h}h、b\mathbf{b}b、d\mathbf{d}d、j\mathbf{j}j为离散场分量。
材料矩阵:
d=Mεe,b=Mμh,j=Mσe\mathbf{d} = \mathbf{M}_\varepsilon \mathbf{e}, \quad \mathbf{b} = \mathbf{M}_\mu \mathbf{h}, \quad \mathbf{j} = \mathbf{M}_\sigma \mathbf{e}d=Mεe,b=Mμh,j=Mσe
时域推进(蛙跳格式):
hn+1/2=hn−1/2−ΔtMμ−1C~enen+1=en+ΔtMε−1(C~hn+1/2−jn+1/2)\begin{aligned} \mathbf{h}^{n+1/2} &= \mathbf{h}^{n-1/2} - \Delta t \mathbf{M}_\mu^{-1} \tilde{\mathbf{C}} \mathbf{e}^n \\ \mathbf{e}^{n+1} &= \mathbf{e}^n + \Delta t \mathbf{M}_\varepsilon^{-1} (\tilde{\mathbf{C}} \mathbf{h}^{n+1/2} - \mathbf{j}^{n+1/2}) \end{aligned}hn+1/2en+1=hn−1/2−ΔtMμ−1C~en=en+ΔtMε−1(C~hn+1/2−jn+1/2)
稳定性条件(CFL条件):
Δt≤1c1Δx2+1Δy2+1Δz2\Delta t \leq \frac{1}{c \sqrt{\frac{1}{\Delta x^2} + \frac{1}{\Delta y^2} + \frac{1}{\Delta z^2}}}Δt≤cΔx21+Δy21+Δz211
2.2.3 求解器体系
CST提供多种求解器以应对不同应用场景:
1. 时域求解器(Transient Solver)
- 基于FIT的时域全波仿真
- 适用于宽带、非线性、瞬态问题
- 支持GPU加速
2. 频域求解器(Frequency Domain Solver)
- 基于FEM的频域求解
- 适用于谐振结构、窄带问题
- 支持自适应网格
3. 积分方程求解器(Integral Equation Solver)
- 基于MoM和MLFMM
- 适用于天线、RCS分析
- 高效处理开放边界问题
4. 渐近求解器(Asymptotic Solver)
- 基于PO/PTD/UTD
- 适用于电大尺寸目标(>10λ)
- 快速天线安装性能评估
5. 本征模求解器(Eigenmode Solver)
- 计算谐振腔模式
- 用于滤波器、谐振器设计
2.2.4 优势与局限
优势:
- 宽带效率:一次时域仿真获得全频段S参数
- 多种求解器:根据问题特点选择最优算法
- GPU加速:支持NVIDIA GPU显著加速时域仿真
- 电路协同:内置电路仿真器,支持场路协同
- 易用性:界面友好,建模效率高
局限:
- 精度权衡:时域方法在谐振结构分析中需要足够长的仿真时间
- 色散材料:时域方法处理复杂色散材料较困难
- 网格依赖:六面体网格对复杂几何适应性不如四面体
2.3 FEKO
2.3.1 软件概述
FEKO是Altair公司开发的三维全波电磁仿真软件,以矩量法(MoM)为核心,结合多层快速多极子方法(MLFMM)和渐近方法(PO/UTD),在天线设计和电磁散射分析领域具有显著优势。
核心特点:
- 矩量法(MoM):基于积分方程的精确全波方法
- MLFMM加速:高效处理电大尺寸问题
- 混合方法:MoM-PO、MoM-UTD、FEM-MoM混合
- 专用天线工具:丰富的天线建模和分析功能
2.3.2 数值方法原理
矩量法(MoM):
MoM基于电场积分方程(EFIE)或磁场积分方程(MFIE):
电场积分方程(EFIE):
Ei(r)=∫S[jωμ0Js(r′)G(r,r′)+1jωε0∇′⋅Js(r′)∇G(r,r′)]dS′\mathbf{E}^i(\mathbf{r}) = \int_S \left[ j\omega\mu_0 \mathbf{J}_s(\mathbf{r}') G(\mathbf{r},\mathbf{r}') + \frac{1}{j\omega\varepsilon_0} \nabla' \cdot \mathbf{J}_s(\mathbf{r}') \nabla G(\mathbf{r},\mathbf{r}') \right] dS'Ei(r)=∫S[jωμ0Js(r′)G(r,r′)+jωε01∇′⋅Js(r′)∇G(r,r′)]dS′
其中,G(r,r′)=e−jk∣r−r′∣4π∣r−r′∣G(\mathbf{r},\mathbf{r}') = \frac{e^{-jk|\mathbf{r}-\mathbf{r}'|}}{4\pi|\mathbf{r}-\mathbf{r}'|}G(r,r′)=4π∣r−r′∣e−jk∣r−r′∣为自由空间格林函数。
离散过程:
-
基函数展开:表面电流用RWG(Rao-Wilton-Glisson)基函数展开:
Js(r)=∑n=1NInfn(r)\mathbf{J}_s(\mathbf{r}) = \sum_{n=1}^{N} I_n \mathbf{f}_n(\mathbf{r})Js(r)=n=1∑NInfn(r) -
伽辽金测试:用相同基函数作为测试函数
-
矩阵方程:形成阻抗矩阵方程
ZI=V\mathbf{Z} \mathbf{I} = \mathbf{V}ZI=V
其中,阻抗矩阵元素:
Zmn=∫Tmfm(r)⋅∫Tn[jωμ0fn(r′)G−1jωε0∇′⋅fn∇G]dS′dSZ_{mn} = \int_{T_m} \mathbf{f}_m(\mathbf{r}) \cdot \int_{T_n} \left[ j\omega\mu_0 \mathbf{f}_n(\mathbf{r}') G - \frac{1}{j\omega\varepsilon_0} \nabla' \cdot \mathbf{f}_n \nabla G \right] dS' dSZmn=∫Tmfm(r)⋅∫Tn[jωμ0fn(r′)G−jωε01∇′⋅fn∇G]dS′dS
多层快速多极子方法(MLFMM):
对于电大尺寸问题,直接求解MoM矩阵计算复杂度高(O(N²)或O(N³))。MLFMM通过快速多极子展开将复杂度降至O(N log N):
多极子展开:
e−jk∣r−r′∣∣r−r′∣≈ik(4π)2∫d2k^e−ikk^⋅(r−rc)TL(k^,rc−rc′)eikk^⋅(r′−rc′)\frac{e^{-jk|\mathbf{r}-\mathbf{r}'|}}{|\mathbf{r}-\mathbf{r}'|} \approx \frac{ik}{(4\pi)^2} \int d^2\hat{k} e^{-ik\hat{k}\cdot(\mathbf{r}-\mathbf{r}_c)} T_L(\hat{k}, \mathbf{r}_c-\mathbf{r}_c') e^{ik\hat{k}\cdot(\mathbf{r}'-\mathbf{r}_c')}∣r−r′∣e−jk∣r−r′∣≈(4π)2ik∫d2k^e−ikk^⋅(r−rc)TL(k^,rc−rc′)eikk^⋅(r′−rc′)
其中,TLT_LTL为转移函数,rc\mathbf{r}_crc和rc′\mathbf{r}_c'rc′为组中心。
2.3.3 混合方法
FEKO支持多种混合方法以高效处理复杂问题:
1. MoM-PO混合
- 天线附近用MoM精确建模
- 电大平台用PO近似
- 适用于天线安装性能分析
2. MoM-UTD混合
- 结合MoM和一致性绕射理论
- 处理大型平台和边缘绕射
3. FEM-MoM混合
- 非均匀介质区域用FEM
- 均匀区域用MoM
- 适用于含复杂介质的辐射问题
2.3.4 优势与局限
优势:
- 开放边界:MoM天然处理开放辐射问题
- 电大尺寸:MLFMM可处理数百波长规模问题
- 天线专用:丰富的天线建模和分析工具
- 混合方法:灵活组合多种算法
- 计算效率:矩阵维度仅与表面网格相关
局限:
- 材料限制:MoM对非均匀、各向异性材料建模困难
- 矩阵求解:稠密矩阵求解内存需求大
- 宽带效率:频域方法需逐点计算
- 几何建模:表面网格生成较复杂
2.4 COMSOL Multiphysics
2.4.1 软件概述
COMSOL Multiphysics是多物理场仿真平台的代表,其RF模块和波动光学模块提供强大的电磁场仿真能力。COMSOL以有限元法为基础,最大特点是灵活的多物理场耦合能力。
核心特点:
- 多物理场耦合:电磁-热-结构-流体-化学多场协同
- 有限元法:基于弱形式的FEM求解器
- 方程自定义:支持用户自定义偏微分方程
- 应用导向:丰富的物理场接口和材料库
2.4.2 数值方法原理
COMSOL基于有限元法的弱形式求解。对于电磁问题,从麦克斯韦方程组出发建立弱形式:
矢量波动方程弱形式:
∫Ω(1μr∇×E⋅∇×v−k02εrE⋅v)dΩ=∫∂Ωv⋅(n^×∇×E)dS\int_\Omega \left( \frac{1}{\mu_r} \nabla \times \mathbf{E} \cdot \nabla \times \mathbf{v} - k_0^2 \varepsilon_r \mathbf{E} \cdot \mathbf{v} \right) d\Omega = \int_{\partial\Omega} \mathbf{v} \cdot (\hat{n} \times \nabla \times \mathbf{E}) dS∫Ω(μr1∇×E⋅∇×v−k02εrE⋅v)dΩ=∫∂Ωv⋅(n^×∇×E)dS
其中,v\mathbf{v}v为测试函数。
多物理场耦合:
COMSOL通过耦合变量实现多物理场协同:
电磁-热耦合:
ρCp∂T∂t−∇⋅(k∇T)=Qem\rho C_p \frac{\partial T}{\partial t} - \nabla \cdot (k \nabla T) = Q_{em}ρCp∂t∂T−∇⋅(k∇T)=Qem
其中,Qem=12ωε0ε′′∣E∣2Q_{em} = \frac{1}{2} \omega \varepsilon_0 \varepsilon'' |\mathbf{E}|^2Qem=21ωε0ε′′∣E∣2为电磁损耗功率密度。
电磁-结构耦合:
∇⋅σ+fem=ρ∂2u∂t2\nabla \cdot \boldsymbol{\sigma} + \mathbf{f}_{em} = \rho \frac{\partial^2 \mathbf{u}}{\partial t^2}∇⋅σ+fem=ρ∂t2∂2u
其中,fem=J×B\mathbf{f}_{em} = \mathbf{J} \times \mathbf{B}fem=J×B为电磁力密度。
2.4.3 主要功能模块
1. RF模块
- 电磁波频域接口
- 端口激励和S参数计算
- 远场辐射分析
2. 波动光学模块
- 波束包络接口(大尺度光学)
- 电磁波瞬态接口
- 非线性光学材料支持
3. AC/DC模块
- 静电、静磁、准静态电磁
- 电机、变压器、传感器仿真
4. 等离子体模块
- 等离子体波仿真
- 放电过程模拟
2.4.4 优势与局限
优势:
- 多物理场:业界领先的多场耦合能力
- 灵活性:支持用户自定义方程和材料
- 应用广泛:从低频到光频全覆盖
- 教育友好:直观的物理场设置界面
- 材料库:丰富的材料数据库
局限:
- 计算效率:通用性导致特定问题效率不如专用软件
- 电大尺寸:对电大尺寸问题处理能力有限
- 学习曲线:多物理场概念需要理解
- 内存需求:多物理场耦合增加计算负担
2.5 其他商业软件
2.5.1 Keysight ADS
ADS(Advanced Design System)是Keysight Technologies的射频/微波电路仿真平台,以电路仿真和电磁协同仿真著称。
核心特点:
- 电路仿真:谐波平衡、包络仿真、瞬态仿真
- Momentum:2.5D MoM电磁仿真器
- EMPro:3D FEM电磁仿真器
- 系统集成:从电路到系统的完整链路仿真
适用场景:
- 微波集成电路(MMIC)设计
- 射频前端系统仿真
- 电路-电磁协同优化
2.5.2 Altair Flux
Flux是Altair公司的低频电磁仿真软件,专注于电机、变压器、传感器等设备的电磁场分析。
核心特点:
- 有限元法:2D/3D FEM求解器
- 运动仿真:支持旋转和直线运动
- 多物理场:电磁-热-结构耦合
- 电路耦合:与电路仿真器协同
适用场景:
- 旋转电机设计
- 变压器和电感器
- 电磁执行器和传感器
2.5.3 JMAG
JMAG是日本JSOL公司开发的电磁场仿真软件,在电机设计领域具有领先地位。
核心特点:
- 电机专用:针对电机优化的求解器和界面
- 材料建模:先进的铁损模型和磁滞模型
- 控制耦合:与MATLAB/Simulink协同仿真
- 快速求解:高效的时间步进算法
适用场景:
- 各类电机(感应、永磁、同步磁阻)
- 电机控制系统
- 电磁振动噪声分析
3. 开源电磁仿真软件
3.1 MEEP
3.1.1 软件概述
MEEP(MIT Electromagnetic Equation Propagation)是麻省理工学院开发的免费FDTD仿真软件,采用C++编写,提供Python接口。MEEP在光子学、纳米光学、等离子体学等领域广泛应用。
核心特点:
- 免费开源:GPL许可证,完全免费
- 亚像素平滑:提高材料界面精度
- 并行计算:支持MPI和OpenMP并行
- 材料库:支持多种色散材料模型
3.1.2 技术特点
亚像素平均:
MEEP采用亚像素平均技术提高材料界面精度:
εeff=∫Vpixelε(r)dVVpixel\varepsilon_{eff} = \frac{\int_{V_{pixel}} \varepsilon(\mathbf{r}) dV}{V_{pixel}}εeff=Vpixel∫Vpixelε(r)dV
对于曲面界面,通过面积加权平均减少阶梯近似误差。
材料模型:
支持多种色散材料模型:
洛伦兹模型:
ε(ω)=ε∞+∑nσnωn2ωn2−ω2−iωγn\varepsilon(\omega) = \varepsilon_\infty + \sum_n \frac{\sigma_n \omega_n^2}{\omega_n^2 - \omega^2 - i\omega\gamma_n}ε(ω)=ε∞+n∑ωn2−ω2−iωγnσnωn2
Drude模型:
ε(ω)=ε∞−ωp2ω2+iωγ\varepsilon(\omega) = \varepsilon_\infty - \frac{\omega_p^2}{\omega^2 + i\omega\gamma}ε(ω)=ε∞−ω2+iωγωp2
3.1.3 Python接口示例
import meep as mp
# 定义计算单元
cell = mp.Vector3(16, 8, 0)
# 定义几何结构
geometry = [
mp.Block(mp.Vector3(mp.inf, 1, mp.inf),
center=mp.Vector3(0, 0),
material=mp.Medium(epsilon=12))
]
# 定义光源
sources = [
mp.Source(mp.ContinuousSource(frequency=0.15),
component=mp.Ez,
center=mp.Vector3(-7, 0))
]
# 定义边界条件
pml_layers = [mp.PML(1.0)]
# 设置分辨率
resolution = 10
# 创建仿真对象
sim = mp.Simulation(cell_size=cell,
boundary_layers=pml_layers,
geometry=geometry,
sources=sources,
resolution=resolution)
# 运行仿真
sim.run(until=200)
3.2 OpenEMS
3.2.1 软件概述
OpenEMS是德国TU Darmstadt开发的免费FDTD仿真软件,采用C++编写,提供MATLAB/Octave和Python接口。OpenEMS专注于高频电磁仿真,支持复杂材料和结构。
核心特点:
- 免费开源:GPL许可证
- ECAD集成:支持KiCad、Cadence等PCB设计导入
- 材料模型:支持各向异性、色散、非线性材料
- 并行计算:支持MPI并行
3.2.2 技术特点
完美匹配层(PML):
OpenEMS实现Berenger PML和UPML吸收边界:
εPML(x)=ε(1+σx(x)jωε0)\varepsilon_{PML}(x) = \varepsilon \left( 1 + \frac{\sigma_x(x)}{j\omega\varepsilon_0} \right)εPML(x)=ε(1+jωε0σx(x))
其中,σx(x)=σmax(xd)m\sigma_x(x) = \sigma_{max} \left( \frac{x}{d} \right)^mσx(x)=σmax(dx)m为电导率剖面。
近远场变换:
支持近场到远场的变换计算辐射方向图:
Efar(θ,ϕ)=jke−jkr4πr∫S[r^×Ms(r′)+r^×(r^×Js(r′))]ejkr^⋅r′dS′\mathbf{E}_{far}(\theta, \phi) = \frac{jk e^{-jkr}}{4\pi r} \int_S \left[ \hat{r} \times \mathbf{M}_s(\mathbf{r}') + \hat{r} \times (\hat{r} \times \mathbf{J}_s(\mathbf{r}')) \right] e^{jk\hat{r}\cdot\mathbf{r}'} dS'Efar(θ,ϕ)=4πrjke−jkr∫S[r^×Ms(r′)+r^×(r^×Js(r′))]ejkr^⋅r′dS′
3.3 ElmerFEM
3.3.1 软件概述
ElmerFEM是芬兰CSC开发的免费多物理场有限元软件,包含电磁场求解器。ElmerFEM采用有限元法,支持低频和高频电磁仿真。
核心特点:
- 免费开源:GPL许可证
- 多物理场:电磁-热-结构-流体耦合
- 并行计算:支持MPI并行
- GUI界面:提供图形用户界面
3.3.2 电磁求解器
静磁求解器:
求解矢量泊松方程:
∇×(1μ∇×A)=J\nabla \times \left( \frac{1}{\mu} \nabla \times \mathbf{A} \right) = \mathbf{J}∇×(μ1∇×A)=J
涡流求解器:
求解时谐涡流方程:
∇×(1μ∇×E)+jωσE=−jωJs\nabla \times \left( \frac{1}{\mu} \nabla \times \mathbf{E} \right) + j\omega\sigma \mathbf{E} = -j\omega\mathbf{J}_s∇×(μ1∇×E)+jωσE=−jωJs
波求解器:
求解矢量波动方程:
∇×(1μr∇×E)−k02εrE=0\nabla \times \left( \frac{1}{\mu_r} \nabla \times \mathbf{E} \right) - k_0^2 \varepsilon_r \mathbf{E} = 0∇×(μr1∇×E)−k02εrE=0
3.4 其他开源软件
3.4.1 gprMax
gprMax是专门用于探地雷达(GPR)仿真的FDTD软件,采用Python/Cython编写。
特点:
- GPR专用:针对探地雷达优化
- 复杂介质:支持复杂土壤模型
- 天线建模:内置天线模型库
3.4.2 FEniCS
FEniCS是自动化有限元求解平台,支持用户以接近数学描述的方式定义和求解PDE。
特点:
- 高度自动化:从变分形式自动生成求解器
- 多语言接口:Python和C++接口
- 并行计算:支持大规模并行
4. 数值方法对比分析
4.1 有限元法(FEM)vs 时域有限差分法(FDTD)
4.1.1 理论基础对比
| 特性 | FEM | FDTD |
|---|---|---|
| 数学基础 | 变分原理/加权残差 | 差分近似/直接离散 |
| 网格类型 | 非结构化(四面体) | 结构化(六面体/Yee网格) |
| 场表示 | 连续基函数 | 离散网格点 |
| 求解域 | 频域为主 | 时域为主 |
| 矩阵类型 | 稀疏对称矩阵 | 显式迭代,无矩阵求解 |
4.1.2 计算特性对比
内存需求:
FEM:O(N)O(N)O(N),其中NNN为网格单元数,稀疏矩阵存储
FDTD:O(N)O(N)O(N),仅需存储场分量,内存效率高
计算复杂度:
FEM:直接求解O(N1.5)O(N^{1.5})O(N1.5)-O(N2)O(N^2)O(N2),迭代求解O(N)O(N)O(N)-O(N1.5)O(N^{1.5})O(N1.5)
FDTD:O(N×Nt)O(N \times N_t)O(N×Nt),NtN_tNt为时间步数,线性复杂度
宽带效率:
FEM:需逐频点计算,宽带问题效率低
FDTD:一次时域仿真+FFT获得全频段响应,宽带效率高
4.1.3 适用场景对比
FEM优势场景:
- 复杂几何结构(曲面、精细细节)
- 非均匀、各向异性材料
- 谐振结构(高Q值腔体)
- 窄带问题
FDTD优势场景:
- 宽带响应分析
- 瞬态电磁脉冲
- 非线性材料
- 周期性结构
4.2 矩量法(MoM)vs 有限元法(FEM)
4.2.1 理论基础对比
| 特性 | MoM | FEM |
|---|---|---|
| 方程类型 | 积分方程 | 微分方程 |
| 离散对象 | 表面电流 | 体积场分布 |
| 矩阵类型 | 稠密矩阵 | 稀疏矩阵 |
| 边界处理 | 自动满足辐射条件 | 需设置吸收边界 |
| 未知数 | 表面网格数 | 体积网格数 |
4.2.2 计算特性对比
矩阵维度:
MoM:Ns×NsN_s \times N_sNs×Ns,NsN_sNs为表面网格数
FEM:Nv×NvN_v \times N_vNv×Nv,NvN_vNv为体积网格数,但稀疏
求解复杂度:
MoM:直接求解O(Ns3)O(N_s^3)O(Ns3),MLFMM加速后O(NslogNs)O(N_s \log N_s)O(NslogNs)
FEM:迭代求解O(Nv)O(N_v)O(Nv)-O(Nv1.5)O(N_v^{1.5})O(Nv1.5)
内存需求:
MoM:O(Ns2)O(N_s^2)O(Ns2)(稠密矩阵),MLFMM可降低至O(NslogNs)O(N_s \log N_s)O(NslogNs)
FEM:O(Nv)O(N_v)O(Nv)(稀疏矩阵)
4.2.3 适用场景对比
MoM优势场景:
- 开放辐射问题(天线、RCS)
- 电大尺寸金属结构
- 均匀介质或分层介质
- 远场计算
FEM优势场景:
- 封闭或半封闭结构
- 复杂非均匀介质
- 谐振腔分析
- 多物理场耦合
4.3 各种方法的计算复杂度总结
| 方法 | 内存复杂度 | 时间复杂度 | 适用规模 |
|---|---|---|---|
| FEM(直接) | O(N)O(N)O(N) | O(N1.5)O(N^{1.5})O(N1.5)-O(N2)O(N^2)O(N2) | 中小规模(<100万网格) |
| FEM(迭代) | O(N)O(N)O(N) | O(N)O(N)O(N)-O(N1.5)O(N^{1.5})O(N1.5) | 大规模(<1000万网格) |
| FDTD | O(N)O(N)O(N) | O(N×Nt)O(N \times N_t)O(N×Nt) | 大规模(<10亿网格) |
| MoM(直接) | O(N2)O(N^2)O(N2) | O(N3)O(N^3)O(N3) | 小规模(<1万未知量) |
| MoM(MLFMM) | O(NlogN)O(N \log N)O(NlogN) | O(NlogN)O(N \log N)O(NlogN) | 电大尺寸(<1000万未知量) |
| PO/UTD | O(N)O(N)O(N) | O(N)O(N)O(N) | 超电大(>100λ) |
5. Python仿真:软件性能对比分析
5.1 数值方法精度对比
以下Python代码对比FEM、FDTD、MoM三种方法在不同网格密度下的计算精度。
# -*- coding: utf-8 -*-
"""
电磁仿真方法精度对比
主题059:电磁仿真软件对比
"""
import matplotlib
matplotlib.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
from scipy import linalg, sparse
from scipy.sparse import linalg as sparse_linalg
import warnings
warnings.filterwarnings('ignore')
import os
output_dir = r'd:\文档\500仿真领域\工程仿真\电磁场仿真\主题059'
os.makedirs(output_dir, exist_ok=True)
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 150
class MethodComparison:
"""电磁仿真方法对比分析类"""
def __init__(self):
self.c = 3e8 # 光速
self.mu_0 = 4 * np.pi * 1e-7
self.eps_0 = 8.854e-12
def fem_accuracy(self, mesh_density, wavelength):
"""
FEM精度分析
基于有限元理论误差估计
参数:
mesh_density: 每波长网格数
wavelength: 波长 (m)
返回:
error: 相对误差 (%)
"""
# FEM误差与h^2成正比(二阶元)
h = wavelength / mesh_density
# 误差模型:误差 ~ C * (h/λ)^2
C = 5.0 # 经验常数
error = C * (h / wavelength)**2 * 100
return error
def fdtd_accuracy(self, mesh_density, time_steps_per_period):
"""
FDTD精度分析
参数:
mesh_density: 每波长网格数
time_steps_per_period: 每周期时间步数
返回:
error: 相对误差 (%)
"""
# 空间离散误差
dx_error = 1.0 / mesh_density**2 * 100
# 时间离散误差
dt_error = 1.0 / time_steps_per_period**2 * 100
# 数值色散误差
dispersion_error = 0.5 * (np.pi / mesh_density)**2 * 100
total_error = np.sqrt(dx_error**2 + dt_error**2 + dispersion_error**2)
return total_error
def mom_accuracy(self, mesh_density, electrical_size):
"""
MoM精度分析
参数:
mesh_density: 每波长网格数
electrical_size: 电尺寸 (波长)
返回:
error: 相对误差 (%)
"""
# MoM误差与基函数近似精度相关
# 对于RWG基函数,误差 ~ C / N^1.5
N = mesh_density**2 * electrical_size**2 # 表面网格数
C = 2.0
error = C / N**0.75 * 100
return error
def compute_time_fem(self, N, solver_type='direct'):
"""
FEM计算时间估计
参数:
N: 网格单元数
solver_type: 'direct' 或 'iterative'
返回:
time: 计算时间 (相对单位)
"""
if solver_type == 'direct':
# 直接求解器: O(N^1.5)
time = N**1.5 / 1000
else:
# 迭代求解器: O(N)
time = N / 100
return time
def compute_time_fdtd(self, N, time_steps):
"""
FDTD计算时间估计
参数:
N: 网格单元数
time_steps: 时间步数
返回:
time: 计算时间 (相对单位)
"""
# FDTD: O(N * Nt)
time = N * time_steps / 10000
return time
def compute_time_mom(self, N, method='direct'):
"""
MoM计算时间估计
参数:
N: 未知量数
method: 'direct' 或 'MLFMM'
返回:
time: 计算时间 (相对单位)
"""
if method == 'direct':
# 直接求解: O(N^3)
time = N**3 / 1e9
else:
# MLFMM: O(N log N)
time = N * np.log(N + 1) / 1000
return time
def memory_requirement_fem(self, N):
"""FEM内存需求"""
# 稀疏矩阵存储
nnz = N * 20 # 每行非零元数(估计)
memory = nnz * 16 / 1e9 # GB (complex double)
return memory
def memory_requirement_fdtd(self, N):
"""FDTD内存需求"""
# 存储6个场分量
memory = N * 6 * 8 / 1e9 # GB (double)
return memory
def memory_requirement_mom(self, N, method='direct'):
"""MoM内存需求"""
if method == 'direct':
# 稠密矩阵
memory = N**2 * 16 / 1e9 # GB
else:
# MLFMM
memory = N * np.log(N + 1) * 16 / 1e9 # GB
return memory
# 创建对比分析实例
comparison = MethodComparison()
# 1. 精度对比图
fig, axes = plt.subplots(2, 2, figsize=(14, 12))
# 1.1 不同网格密度下的精度
mesh_densities = np.array([5, 10, 15, 20, 30, 40, 50])
wavelength = 1.0 # 1m
fem_errors = [comparison.fem_accuracy(md, wavelength) for md in mesh_densities]
fdtd_errors = [comparison.fdtd_accuracy(md, 20) for md in mesh_densities] # 每周期20步
mom_errors = [comparison.mom_accuracy(md, 1.0) for md in mesh_densities]
axes[0, 0].semilogy(mesh_densities, fem_errors, 'b-o', linewidth=2.5, markersize=8, label='FEM (HFSS/COMSOL)')
axes[0, 0].semilogy(mesh_densities, fdtd_errors, 'r-s', linewidth=2.5, markersize=8, label='FDTD (CST/MEEP)')
axes[0, 0].semilogy(mesh_densities, mom_errors, 'g-^', linewidth=2.5, markersize=8, label='MoM (FEKO)')
axes[0, 0].axhline(y=1.0, color='k', linestyle='--', alpha=0.5, label='1% target')
axes[0, 0].axhline(y=0.1, color='k', linestyle=':', alpha=0.5, label='0.1% target')
axes[0, 0].set_xlabel('Mesh Density (cells/λ)', fontsize=11)
axes[0, 0].set_ylabel('Relative Error (%)', fontsize=11)
axes[0, 0].set_title('Accuracy vs Mesh Density', fontsize=12, fontweight='bold')
axes[0, 0].legend(fontsize=9)
axes[0, 0].grid(True, alpha=0.3)
# 1.2 计算时间对比
problem_sizes = np.logspace(3, 7, 50) # 1K到10M网格
fem_direct_time = [comparison.compute_time_fem(N, 'direct') for N in problem_sizes]
fem_iter_time = [comparison.compute_time_fem(N, 'iterative') for N in problem_sizes]
fdtd_time = [comparison.compute_time_fdtd(N, 1000) for N in problem_sizes]
mom_direct_time = [comparison.compute_time_mom(int(N**0.67), 'direct') for N in problem_sizes]
mom_mlfmm_time = [comparison.compute_time_mom(int(N**0.67), 'MLFMM') for N in problem_sizes]
axes[0, 1].loglog(problem_sizes, fem_direct_time, 'b-', linewidth=2.5, label='FEM (Direct)')
axes[0, 1].loglog(problem_sizes, fem_iter_time, 'b--', linewidth=2.5, label='FEM (Iterative)')
axes[0, 1].loglog(problem_sizes, fdtd_time, 'r-', linewidth=2.5, label='FDTD')
axes[0, 1].loglog(problem_sizes, mom_mlfmm_time, 'g-', linewidth=2.5, label='MoM (MLFMM)')
axes[0, 1].set_xlabel('Problem Size (Number of Cells)', fontsize=11)
axes[0, 1].set_ylabel('Relative Compute Time', fontsize=11)
axes[0, 1].set_title('Compute Time vs Problem Size', fontsize=12, fontweight='bold')
axes[0, 1].legend(fontsize=9)
axes[0, 1].grid(True, alpha=0.3)
# 1.3 内存需求对比
fem_memory = [comparison.memory_requirement_fem(N) for N in problem_sizes]
fdtd_memory = [comparison.memory_requirement_fdtd(N) for N in problem_sizes]
mom_direct_memory = [comparison.memory_requirement_mom(int(N**0.67), 'direct') for N in problem_sizes]
mom_mlfmm_memory = [comparison.memory_requirement_mom(int(N**0.67), 'MLFMM') for N in problem_sizes]
axes[1, 0].loglog(problem_sizes, fem_memory, 'b-', linewidth=2.5, label='FEM')
axes[1, 0].loglog(problem_sizes, fdtd_memory, 'r-', linewidth=2.5, label='FDTD')
axes[1, 0].loglog(problem_sizes, mom_direct_memory, 'g-', linewidth=2.5, label='MoM (Direct)')
axes[1, 0].loglog(problem_sizes, mom_mlfmm_memory, 'g--', linewidth=2.5, label='MoM (MLFMM)')
axes[1, 0].axhline(y=64, color='k', linestyle='--', alpha=0.5, label='64 GB')
axes[1, 0].axhline(y=256, color='k', linestyle=':', alpha=0.5, label='256 GB')
axes[1, 0].set_xlabel('Problem Size (Number of Cells)', fontsize=11)
axes[1, 0].set_ylabel('Memory Requirement (GB)', fontsize=11)
axes[1, 0].set_title('Memory Requirement vs Problem Size', fontsize=12, fontweight='bold')
axes[1, 0].legend(fontsize=9)
axes[1, 0].grid(True, alpha=0.3)
# 1.4 不同应用场景的方法选择
scenarios = ['Antenna\nDesign', 'PCB Signal\nIntegrity', 'Radar\nCross Section',
'Microwave\nFilter', 'EMC/EMI\nAnalysis', 'Photonics\nDevice']
# 评分矩阵 (1-10分)
fem_scores = [8, 9, 5, 9, 7, 8]
fdtd_scores = [7, 8, 6, 6, 9, 9]
mom_scores = [9, 6, 9, 5, 6, 4]
x = np.arange(len(scenarios))
width = 0.25
axes[1, 1].bar(x - width, fem_scores, width, label='FEM', color='blue', alpha=0.7)
axes[1, 1].bar(x, fdtd_scores, width, label='FDTD', color='red', alpha=0.7)
axes[1, 1].bar(x + width, mom_scores, width, label='MoM', color='green', alpha=0.7)
axes[1, 1].set_xlabel('Application Scenario', fontsize=11)
axes[1, 1].set_ylabel('Suitability Score (1-10)', fontsize=11)
axes[1, 1].set_title('Method Suitability by Application', fontsize=12, fontweight='bold')
axes[1, 1].set_xticks(x)
axes[1, 1].set_xticklabels(scenarios, fontsize=9)
axes[1, 1].legend(fontsize=9)
axes[1, 1].grid(True, alpha=0.3, axis='y')
axes[1, 1].set_ylim(0, 10)
plt.tight_layout()
plt.savefig(f'{output_dir}/method_comparison.png', dpi=150, bbox_inches='tight')
plt.close()
print("Method comparison plot saved")
# 2. 商业软件功能对比雷达图
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(projection='polar'))
categories = ['Accuracy', 'Speed', 'Ease of Use', 'Material\nModeling',
'Multi-physics', 'Optimization', 'HPC Support', 'Price']
N = len(categories)
# 各软件评分 (1-10)
hfss_scores = [10, 6, 7, 9, 10, 9, 9, 4]
cst_scores = [9, 9, 8, 8, 7, 8, 9, 4]
feko_scores = [9, 8, 7, 6, 5, 7, 8, 5]
comsol_scores = [8, 6, 8, 9, 10, 7, 7, 3]
meep_scores = [7, 7, 5, 7, 4, 5, 7, 10]
angles = [n / float(N) * 2 * np.pi for n in range(N)]
angles += angles[:1]
hfss_scores += hfss_scores[:1]
cst_scores += cst_scores[:1]
feko_scores += feko_scores[:1]
comsol_scores += comsol_scores[:1]
meep_scores += meep_scores[:1]
ax.plot(angles, hfss_scores, 'b-o', linewidth=2.5, label='ANSYS HFSS')
ax.fill(angles, hfss_scores, 'b', alpha=0.1)
ax.plot(angles, cst_scores, 'r-s', linewidth=2.5, label='CST Studio')
ax.fill(angles, cst_scores, 'r', alpha=0.1)
ax.plot(angles, feko_scores, 'g-^', linewidth=2.5, label='FEKO')
ax.fill(angles, feko_scores, 'g', alpha=0.1)
ax.plot(angles, comsol_scores, 'm-d', linewidth=2.5, label='COMSOL')
ax.fill(angles, comsol_scores, 'm', alpha=0.1)
ax.plot(angles, meep_scores, 'c-p', linewidth=2.5, label='MEEP (Open)')
ax.fill(angles, meep_scores, 'c', alpha=0.1)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories, fontsize=10)
ax.set_ylim(0, 10)
ax.set_title('Electromagnetic Simulation Software Comparison', fontsize=14, fontweight='bold', pad=20)
ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1), fontsize=10)
ax.grid(True)
plt.tight_layout()
plt.savefig(f'{output_dir}/software_radar.png', dpi=150, bbox_inches='tight')
plt.close()
print("Software radar plot saved")
# 3. 不同频率范围的方法效率
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
frequencies = np.logspace(6, 12, 100) # 1MHz到1THz
# 3.1 各方法在不同频率的效率指数
# 假设固定几何尺寸,频率增加意味着电尺寸增加
base_size = 0.1 # 0.1m物理尺寸
fem_efficiency = []
fdtd_efficiency = []
mom_efficiency = []
for f in frequencies:
wavelength = 3e8 / f
electrical_size = base_size / wavelength
# FEM效率随电尺寸增加而降低(需要更多网格)
fem_eff = 100 / (1 + electrical_size**3)
fem_efficiency.append(fem_eff)
# FDTD效率相对稳定
fdtd_eff = 100 / (1 + electrical_size**2 * 0.1)
fdtd_efficiency.append(fdtd_eff)
# MoM效率随电尺寸增加先升后降(MLFMM优势区间)
if electrical_size < 1:
mom_eff = 50 * electrical_size
else:
mom_eff = 100 / (1 + np.log(electrical_size + 1))
mom_efficiency.append(mom_eff)
axes[0].semilogx(frequencies/1e9, fem_efficiency, 'b-', linewidth=2.5, label='FEM')
axes[0].semilogx(frequencies/1e9, fdtd_efficiency, 'r-', linewidth=2.5, label='FDTD')
axes[0].semilogx(frequencies/1e9, mom_efficiency, 'g-', linewidth=2.5, label='MoM')
axes[0].axvline(x=0.3, color='gray', linestyle='--', alpha=0.5)
axes[0].axvline(x=3, color='gray', linestyle='--', alpha=0.5)
axes[0].axvline(x=30, color='gray', linestyle='--', alpha=0.5)
axes[0].text(0.1, 90, 'RF', fontsize=10, alpha=0.7)
axes[0].text(1, 90, 'Microwave', fontsize=10, alpha=0.7)
axes[0].text(10, 90, 'mmWave', fontsize=10, alpha=0.7)
axes[0].text(100, 90, 'THz', fontsize=10, alpha=0.7)
axes[0].set_xlabel('Frequency (GHz)', fontsize=11)
axes[0].set_ylabel('Efficiency Index', fontsize=11)
axes[0].set_title('Method Efficiency vs Frequency', fontsize=12, fontweight='bold')
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)
axes[0].set_xlim(0.001, 1000)
# 3.2 不同电尺寸下的方法选择
electrical_sizes = np.logspace(-1, 2, 100) # 0.1λ到100λ
fem_score = [max(0, 10 - 3*np.log10(es + 0.1)) for es in electrical_sizes]
fdtd_score = [8 for _ in electrical_sizes] # FDTD相对稳定
mom_score = [min(10, 2 + 4*np.log10(es + 0.1)) for es in electrical_sizes]
po_score = [min(10, max(0, 3*np.log10(es) - 3)) for es in electrical_sizes]
axes[1].semilogx(electrical_sizes, fem_score, 'b-', linewidth=2.5, label='FEM')
axes[1].semilogx(electrical_sizes, fdtd_score, 'r-', linewidth=2.5, label='FDTD')
axes[1].semilogx(electrical_sizes, mom_score, 'g-', linewidth=2.5, label='MoM')
axes[1].semilogx(electrical_sizes, po_score, 'm-', linewidth=2.5, label='PO/UTD')
axes[1].axvline(x=1, color='gray', linestyle='--', alpha=0.5)
axes[1].axvline(x=10, color='gray', linestyle='--', alpha=0.5)
axes[1].text(0.3, 1, 'Electrically Small', fontsize=10, alpha=0.7)
axes[1].text(3, 1, 'Resonant', fontsize=10, alpha=0.7)
axes[1].text(30, 1, 'Electrically Large', fontsize=10, alpha=0.7)
axes[1].set_xlabel('Electrical Size (wavelengths)', fontsize=11)
axes[1].set_ylabel('Suitability Score', fontsize=11)
axes[1].set_title('Method Suitability vs Electrical Size', fontsize=12, fontweight='bold')
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)
axes[1].set_xlim(0.1, 100)
axes[1].set_ylim(0, 12)
plt.tight_layout()
plt.savefig(f'{output_dir}/frequency_size_analysis.png', dpi=150, bbox_inches='tight')
plt.close()
print("Frequency and size analysis plot saved")
print("\n" + "="*60)
print("电磁仿真方法对比分析完成")
print("="*60)
print(f"\n精度对比 (20 cells/λ):")
print(f" FEM误差: {comparison.fem_accuracy(20, 1.0):.3f}%")
print(f" FDTD误差: {comparison.fdtd_accuracy(20, 20):.3f}%")
print(f" MoM误差: {comparison.mom_accuracy(20, 1.0):.3f}%")
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)