第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世纪,电磁仿真软件呈现以下发展趋势:

  1. 多物理场耦合:电磁-热-结构-流体多场协同仿真
  2. 系统级仿真:从组件级向系统级扩展,支持完整链路分析
  3. 云计算与HPC:支持大规模并行计算和云端部署
  4. AI集成:机器学习辅助优化、智能网格划分、代理模型构建
  5. 开源生态: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 为自由空间波数。

有限元离散过程

  1. 区域剖分:将计算域离散为四面体单元网格
  2. 基函数选择:采用矢量棱边元(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)
  3. 伽辽金加权:建立弱形式方程
  4. 矩阵组装:形成大型稀疏线性方程组
  5. 求解器:直接求解器(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=∥∇×EL2(K)rKL2(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}CC~\tilde{\mathbf{C}}C~为离散旋度算子,S\mathbf{S}SS~\tilde{\mathbf{S}}S~为离散散度算子,e\mathbf{e}eh\mathbf{h}hb\mathbf{b}bd\mathbf{d}dj\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=hn1/2ΔtMμ1C~en=en+ΔtMε1(C~hn+1/2jn+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}}}ΔtcΔx21+Δy21+Δz21 1

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ωε01Js(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πrrejkrr为自由空间格林函数。

离散过程

  1. 基函数展开:表面电流用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=1NInfn(r)

  2. 伽辽金测试:用相同基函数作为测试函数

  3. 矩阵方程:形成阻抗矩阵方程
    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)Gjωε01fnG]dSdS

多层快速多极子方法(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')}rrejkrr(4π)2ikd2k^eikk^(rrc)TL(k^,rcrc)eikk^(rrc)

其中,TLT_LTL为转移函数,rc\mathbf{r}_crcrc′\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×vk02εrEv)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}ρCptT(kT)=Qem

其中,Qem=12ωε0ε′′∣E∣2Q_{em} = \frac{1}{2} \omega \varepsilon_0 \varepsilon'' |\mathbf{E}|^2Qem=21ωε0ε′′E2为电磁损耗功率密度。

电磁-结构耦合
∇⋅σ+fem=ρ∂2u∂t2\nabla \cdot \boldsymbol{\sigma} + \mathbf{f}_{em} = \rho \frac{\partial^2 \mathbf{u}}{\partial t^2}σ+fem=ρt22u

其中,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=VpixelVpixelε(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γnσnωn2

Drude模型
ε(ω)=ε∞−ωp2ω2+iωγ\varepsilon(\omega) = \varepsilon_\infty - \frac{\omega_p^2}{\omega^2 + i\omega\gamma}ε(ω)=εω2+γω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πrjkejkrS[r^×Ms(r)+r^×(r^×Js(r))]ejkr^rdS

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×NsNsN_sNs为表面网格数

FEM:Nv×NvN_v \times N_vNv×NvNvN_vNv为体积网格数,但稀疏

求解复杂度

MoM:直接求解O(Ns3)O(N_s^3)O(Ns3),MLFMM加速后O(Nslog⁡Ns)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(Nslog⁡Ns)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(Nlog⁡N)O(N \log N)O(NlogN) O(Nlog⁡N)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}%")
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐