ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

矩量法实现二维金属体散射:EFIE/MFIE离散与MATLAB仿真

矩量法实现二维金属体散射:EFIE/MFIE离散与MATLAB仿真 简介一份面向电磁场与微波技术方向学习者与研究者的MATLAB数值计算资料聚焦矩量法在二维金属体散射问题中的应用。文档从麦克斯韦方程组出发推导电场积分方程与磁场积分方程并结合金属表面边界条件说明TM波、TE波入射时的离散化与求解流程程序部分覆盖圆柱体与椭圆柱体截面剖分、点匹配法构建矩阵、LU分解计算表面电流及散射截面/回波宽度适合需要快速上手矩量法编程或复现经典电磁散射算例的读者。压缩包共1个文件为带详细注释与公式推导的DOC文档大小434KB可在MATLAB环境中对照实现并修改几何参数。已有228人学习内容兼顾理论推导、精度验证与数值实验分析对理解矩量法收敛性、结果校验及散射特性规律具有直接帮助。1. 矩量法在手二维金属体散射的离散思路二维金属圆柱的散射能用模式展开解析一旦换成椭圆柱截面解析解立刻失效。矩量法把表面电流离散成 N 个未知数解一个稠密复线性方程组几何形状只影响矩阵元素的组装方式。这套要拆的资源就是基于矩量法的二维金属体散射 MATLAB 程序入射波垂直 z 轴TM 或 TE 极化通过电场积分方程或磁场积分方程求表面电流再推回波宽度。配套程序覆盖圆柱、椭圆柱、TM、TE 四种组合可以直接改参数复现适合做电磁场数值计算入门、目标散射特性分析也适合课程设计里需要出图出数据的人。文中会逐步拆解 EFIE 和 MFIE 的离散过程、Hankel 函数组装、解析对角元、LU 求解并指出复数转置和 log10 这两个容易翻车的细节。2. 电场积分方程离散化从麦克斯韦方程到 P 矩阵组装2.1 EFIE 的物理边界条件金属表面切向电场为零垂直 z 轴入射的 TM 平面波电场只有 Ez 分量感应电流也只有 z 方向。设入射场为 Ei散射场为 Es金属表面切向电场为零边界条件给出 Ei Es 0在截面周长 C 上处处成立。散射场用二维 Green 函数表示为Es(r) -(kZ/4) ∮ Jz(r) H0^(2)(k|r-r|) dl其中 H0^(2) 是零阶第二类 Hankel 函数代表从 r 处的线电流源发出的柱面波在 r 处的贡献。把边界条件代回得到电场积分方程。注意 Es 前面的负号来自 Green 函数渐近展开的符号约定不同教材可能不同。如果程序算出的电流实部全部变号先检查这一项。之所以 TM 入射时优先选 EFIE 而不是 MFIE是因为 EFIE 的积分核是标量 Hankel 函数离散后直接得到满秩复矩阵MFIE 需要处理边界上的法向导数和柯西主值积分奇异项处理不当会直接污染对角元。但 EFIE 在内部谐振频率附近会失效这个留到第 5 章展开。文档的 TM 程序都用 EFIETE 程序才用 MFIE正是基于这个选型逻辑。2.2 点匹配法与脉冲基函数的选择依据离散化第一步是把截面周长 C 分成 N 段。圆柱每段弧长相等椭圆柱则需要先用角度均匀划分再用弧长积分求每一段的实际长度。选脉冲函数作为基函数fn(r) 在第 n 段上为 1其余为 0。电流密度展开为 Jz(r) Σ Jn fn(r)。点匹配法的含义是取狄拉克 δ 函数为检验函数让积分方程在每一段中点精确满足。这样原来的积分方程被强制为 N 个离散方程得到复线性方程组 [P]{J}{b}。N 的选择与波长直接相关每个子段长度 Δ 尽量控制在 λ/15 以内。以程序默认的 win(3,1.5) 为例实际半径是 1.5λ4.5m周长约 28.27mN180 时 Δ≈0.16m约 λ/19已经不粗N720 时 Δ≈0.039m约 λ/77精度足够。剖分过稀时矩阵方程解出的电流会出现明显振荡总电流也收敛不到解析值。2.3 P 矩阵组装Hankel 函数、对角元解析积分与参数表当 m≠n 时积分核在子段上变化平缓用中点值近似即可Pmn (ZkΔ/4) H0^(2)(k|rm-rn|)当 mn 时Hankel 函数自变量趋于 0对数发散不能简单取中点值。把小参数展开代入并在脉冲区间积分得到对角元的解析表达Pnn (ZkΔ/4)[1 - i(2/π)ln(e^γ kΔ/4)]e^γ≈1.781γ0.57721 是欧拉常数。这个式子是全程序最容易出错的地方。原文程序写成 log10(1.781Kh/(4*2.718))把常用对数和自然对数混用了。MATLAB 里 log 才是自然对数log10 是常用对数两者数值相差约 2.3026 倍会直接污染对角元虚部。复现时如果电流相位和文献对不上第一件事就是检查这里。代码变量物理含义实验取值NU入射波波长 λ3 mL圆柱半径以 λ 为单位1.5K波数 2π/λ2.094 rad/mfai入射方向与 x 轴夹角0°Z自由空间波阻抗377 Ωm剖分份数 N720组装代码用矩阵化的方式写m 720; R L * NU; % 实际半径注意L以波长为单位 h 2 * pi * R / m; % 每段弧长 Q (pi/m : 2*pi/m : 2*pi*(m-1/2)/m); X R * cos(Q); Y R * sin(Q); P zeros(m, m); dx zeros(m, m); dy zeros(m, m); for n 1:m dx(n,:) (X - X(n)).^2; dy(n,:) (Y - Y(n)).^2; end d dx dy eye(m); % 对角线加1防止Hankel函数自变量为0 x K * sqrt(d); H besselh(0, 2, x); % 零阶第二类Hankel函数 P Z * K * h * H / 4; % 非对角元统一组装besselh(0,2,x) 返回复数数组对应每个观测点和源点之间的格林函数值。d 矩阵对角线用 eye(m) 置成 1避免了自变量为 0 时的奇异性对角元等会儿用解析式覆盖。P 是 N×N 稠密复矩阵N720 时占 720×720×16 字节约 8.3MBN2000 时约 64MB内存是实际运行中最先遇到的瓶颈。对角元和右端项的处理Pnn Z*K*h*(1 - i*2*log(1.781*K*h/(4*exp(1)))/pi)/4; for n 1:m P(n,n) Pnn; end b exp(-i*K*(X*cos(fai) Y*sin(fai))); M b.; % 复数转置必须用.不能用否则相位反向 j P \ M; % 求解复线性方程组b 是入射平面波在剖分点上的相位负号来自 e^{-ik·r} 的行波约定。Mb. 是普通转置如果误写成 bMATLAB 会对每个元素取共轭后续电流分布会出现 180° 相移。P\M 内部用 LU 分解对稠密矩阵直接求解即可。3. win 函数实战圆柱体剖分、复线性方程组与回波宽度3.1 win 函数的输入与几何约定win(NU,L) 接受两个参数NU 是波长L 是半径但 L 不是长度而是波长的倍数。程序内部用 RL*NU 换算实际半径这个约定和文档文字部分不一致文字说半径 1.5m程序示例 win(3,1.5) 算出的实际半径却是 4.5m。如果照文字参数传 win(3,1.5)Hankel 函数自变量会差一个量级解出的电流分布完全不对。复现时建议把几何尺寸先换算成波长倍数再传入比如实际半径 1.5m、波长 3m 时应该写 win(3,0.5)并保留一份自己的变量说明。剖分份数在程序里写死为 m720。入射波频率 100MHz、波长 3m。剖分方式是从角度 π/m 到 2π-π/(2m) 取 m 个中点这样不在 0° 处设置节点避免首尾相接处重复计算。X 和 Y 是子段中点坐标P 矩阵元素就是这些中点之间的格林函数值。3.2 圆柱表面剖分与电流求解圆柱各段弧长相等h2πR/m 可以提到 P 矩阵组装外面这是圆柱程序比椭圆柱程序简单的原因。求解部分核心代码在前面已经给出jP\M 得到 N×1 复电流列向量。总电流用 Izsum(h*j) 计算h 是弧长电流密度乘弧长才是线电流。如果误写成 sum(j)相当于把段长当成 1数值上差两个数量级。文档给了两组剖分精度的总电流N180 时 Iz-0.00840.0083iN720 时 Iz-0.00790.0083i解析解是 -0.00770.0083i。这个对照很有信息量虚部三者几乎一致说明电流相位对剖分不敏感实部从 -0.0084 逐步逼近 -0.0077剖分越细实部越准。如果算出的总电流实部差一个符号不要急着加剖分先检查是不是用了共轭转置。3.3 回波宽度从表面电流到远场方向图回波宽度对应二维问题的雷达散射截面单位是波长平方。程序在 0° 到 179° 的离散观察角上计算核心逻辑如下w (0:pi/180:pi*179/180); for n 1:180 g exp(i*K*(X*cos(w(n)fai) Y*sin(w(n)fai)))*h; G g .* j.; % 逐元素相乘注意转置方式 T abs(sum(G)); out(n) K*Z^2*T^2/4; end W (0:1:179); plot(W, 20*log10(out/NU^2), .);g 是每个剖分单元上的电流元在远区观察方向的相位权重即远场积分中的 exp(ik·r) 项。Gg.j. 把相位权重和电流逐元素相乘后求和得到总散射场。out(n)KZ²T²/4 是回波宽度的离散公式。20log10(out/NU²) 把结果归一化到波长并转成 dB。这里用点样式画图是 matlab 画图里比较实用的技巧剖分密时曲线叠加不会把细节糊掉文档里的电流分布图和回波宽度图都用的是这个画法。3.4 LU 分解与 P\b 的等价性P\M 本质上是 LU 分解后求解。也可以显式写 [L,U]lu(P); jU(L\M)两种方式数值结果一致。显式展开的好处是如果需要对同一个几何重复求解多次L 和 U 可以复用省掉重复分解。另一个实际场景是扫频计算每个频率都要重新组装 P 矩阵但几何信息可以预计算。对于课程设计级别的需求直接用 P\M 即可不需要手动管理 LU 分解。4. 椭圆柱体推广win1 数值积分与 TE 波 MFIE 实现4.1 椭圆柱的弧长积分与 quadl椭圆柱剖分按角度均匀划分但每段对应的实际弧长不一样不能像圆柱那样把 Δ 提到矩阵外面。椭圆参数方程 r(θ)(a cosθ, b sinθ)弧长微元 ds√(a²sin²θb²cos²θ)dθ。程序用 quadl 对每一段做数值积分fun inline(sqrt((a)^2*(sin(x).^2) (b)^2*(cos(x).^2)), x, a, b); for n 1:N x1 (n-1)*h; x2 n*h; delta(n) quadl(fun, x1, x2, {},{}, a, b); endquadl 是自适应 Lobatto 求积法对光滑周期函数精度很高。这里传 a、b 的方式偏老现代 MATLAB 推荐用匿名函数捕获工作区变量fun(x)sqrt((asin(x)).^2(bcos(x)).^2)代码更清晰。delta(n) 就是第 n 段的弧长对应圆柱场景里的常数 h。之后 P 矩阵组装里所有 h 都要替换成 delta 的逐元素版本。程序里 aNU/40.75λbNU3λy 方向明显更长。注意程序注释写的是椭圆半长轴实际几何是 x 方向 0.75λ、y 方向 3λ注释和变量的对应有歧义。椭圆在 y 端点附近曲率更大段长也更大θπ/2 处 dsb·dθθ0 处 dsa·dθ两者相差 4 倍。如果仍按均匀段长处理P 矩阵元素误差会很大所以必须对每段单独积分。4.2 归一化电流分布与画图椭圆柱程序里as(j./M)Z 把电流相对入射场做了相位归一化再乘波阻抗得到归一化电流。坐标 S 把 0 到 π 映射到 0 到 1S0 对应椭圆一端S1 对应另一端。画图用 plot(w22/m, abs(as(m/2:-1:1)), .)取 as 的一半然后倒序因为剖分从 0 到 2π归一化坐标只需要 0 到 π 部分另一半由对称性决定。电流归一化的实际意义是消除入射波相位的影响不同入射角时绝对电流无法直接比较归一化后才能观察电流角分布的形态差异。文档图 3 里剖分 1000 和 2000 的结果几乎重合就是这个归一化做得好的表现。4.3 TE 波与 MFIE1/2 对角元与一阶 Hankel 函数TE 波入射时边界上感应电流沿横向磁场积分方程的离散结果和 EFIE 有两个关键差异。第一对角元是 1/2来自柯西主值积分不再是 EFIE 里的对数解析积分。第二非对角核函数用一阶 Hankel 函数且方程里出现了边界单位法向量与源点到观测点方向的点积for n 1:N sinn sign(cos(Q(n)h/2)) * sqrt(1/((a*tan(Q(n)h/2)/b)^2 1)); cosn -sign(sin(Q(n)h/2)) * sqrt(1/(1 (b^2/(a*tan(Q(n)h/2))^2))); for m 1:N Rmn sqrt((Xm-Xn)^2 (Ym-Yn)^2); if m n P(m,n) 1/2; else P(m,n) -K*delta(n)*(sinn*(Xm-Xn)/Rmn - cosn*(Ym-Yn)/Rmn) ... * besselh(1,2,K*Rmn) / (4i); end end endsinn 和 cosn 是边界单位外法向的分量由椭圆参数方程求导再旋转得到。符号函数 sign 的作用是保证开方取到正确的象限这个细节容易出错如果去掉 sign法向量的方向会在某些象限反转矩阵元素符号错乱。一阶 Hankel 函数 besselh(1,2,...) 来自磁场积分方程的二维 Green 函数求导。距离 Rmn 直接逐点计算没有用矩阵化所以 TE 程序比 TM 程序慢不少。留意 TE 程序里回波宽度是 out(m)KT²/4没有 Z² 因子。因为 MFIE 中的电流已经相对入射磁场做了归一化Z 被吸收掉了。EFIE 程序里则是 outKZ²*T²/4对照公式时不要被这个差异搞混。MFIE 在 N720 时电流分布与解析解存在可见偏差但回波宽度几乎重合这是电流的连续性泛函特性J 在精确解附近的扰动对最终积分影响很小。5. 数值验证与进阶模式展开对照、CFIE 与 MATLAB 求解效率5.1 用模式展开法验证 EFIE 程序文档附带的 current 函数用模式展开计算圆柱面电流的解析解把 Jz 展开成 Hankel 函数与指数函数乘积之和累加范围 n-36 到 36。这个范围对半径 1.5λ 的圆柱偏保守但足以验证数值解。验证时把两个结果画在同一坐标系hold on; plot(w*180/pi, abs(Jz), -); plot(w2*360/m, abs(j), .); legend(解析解,矩量法);如果两条曲线重合度高说明 EFIE 程序正确。如果只差相位优先检查对角元里的对数函数和转置运算符。如果幅度差一个常数检查 P 矩阵系数是 ZKh/4 还是 K*h/4。模式展开本身也有数值边界项数取得太大Hankel 函数会溢出或下溢所以并不存在无限精确的解析解可对照。5.2 内谐振与 CFIE 的引入文档明确提到没考虑内谐振。EFIE 或 MFIE 在内部谐振频率附近积分算子存在零空间矩阵条件数极大解出的电流会振荡。常见做法是把 EFIE 和 MFIE 加权组合成 CFIEP_CFIE α·P_EFIE (1-α)·Z_ref·P_MFIEα 取 0.5 或 0.7Z_ref 是参考阻抗。CFIE 的条件数更平稳不会在谐振频率崩溃。代价是同时实现两套积分方程的离散工作量翻倍。入门课题可以先画出矩阵条件数随频率变化的曲线避开谐振点再从 EFIE 切到 CFIE。5.3 MATLAB 运行效率与内存优化文档提到的 MATLAB 6.5 和 128M 内存已经是十多年前的环境现代机器主要瓶颈变成内存带宽。N2000 时 P 矩阵占 64MB加上临时数组峰值会到 200MB 以上交换到磁盘后性能断崖式下降。两个实际优化方向一是用 meshgrid 向量化坐标差矩阵的构造替代双重循环二是把组装函数写成 MEX用 C 语言实现双重循环后用 mex 命令编译这也是matlab 怎么运行 C 程序最常见的落地路径。向量化只需要改一小段[Xg, Yg] meshgrid(X, Y); d (Xg - Xg).^2 (Yg - Yg).^2 eye(N); P Z * K * h / 4 * besselh(0, 2, K*sqrt(d));meshgrid 生成坐标网格后一行就能算出全部距离平方比原来两个 for 循环快一个量级。TE 程序里的法向量计算同样可以用向量化改写但涉及 sign 和 atan 的分支判断向量化后可读性下降明显。如果 N 超过 3000建议直接考虑快速多极子算法把矩阵乘法的复杂度从 O(N²) 降到 O(N log N)这时 MATLAB 的向量化已经救不了内存。本文还有配套的精品资源点击获取
返回列表