ARTICLE DETAIL

资讯详情

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

用Matlab仿真无穷小偶极子:近场与远场可视化全解析

用Matlab仿真无穷小偶极子:近场与远场可视化全解析 简介本资源是面向本科及硕士阶段电磁场与天线课程教学、科研入门与仿真实验的Matlab专项工具包聚焦无穷小偶极子天线的电磁场建模与可视化分析解决近场感应场、辐射场共存与远场纯辐射场分布特性难以直观理解的教学难点。压缩包共6个文件含核心仿真脚本main.m、3幅关键结果图png格式展示电场强度空间分布、方向图及场强衰减趋势、说明文档txt及作者推广图整体仅1.08MB轻量易用适配Matlab 2014a/2019a环境附带可直接运行的完整代码与对应结果截图无需额外配置即可复现理论公式推导下的场分布规律。目前已有23人学习下载内容精炼、结构清晰特别适合初学者快速掌握天线近远场物理本质、验证课本结论并为后续复杂天线阵列或HFSS联合仿真奠定Matlab数值建模基础。 前段时间做天线课程的仿真作业遇到一个很有意思但又容易糊弄过去的问题老师让用Matlab模拟无穷小偶极子Hertzian Dipole电流元的近场和远场。刚开始我觉得这题目太“课本”了公式书上都写好了照着抄不就行了真动手之后才发现理论公式和能画出漂亮结果之间隔着一大堆细节球坐标网格怎么分、复数场怎么存、近场和远场怎么看、远场边界到底取多少米才算对。这篇文章就把我完整跑通这个项目的思路和代码整理出来重点放在场公式的物理含义、Matlab向量化实现、近远场可视化和三种远场判据的工程取舍上。如果你正好需要做天线理论验证、电小天线建模或者只是想用Matlab把电磁场课本里那张经典“甜甜圈”方向图画出来这篇内容可以帮你省掉不少折腾的时间。跟着做一遍你得到的不是一张图而是对近场储能、远场辐射和场衰减规律的实际手感。1. 一个“看不见”的辐射元无穷小偶极子在天线模拟里的地位1.1 为什么先从赫兹偶极子开始无穷小偶极子也叫赫兹偶极子是一段长度远小于工作波长的电流元通常写作 (I_0 dl)其中 (I_0) 是电流幅度(dl) 是偶极子长度要求 (dl \ll \lambda)。它不是一个真实存在的天线而是一个理想化的辐射元。但你千万别因为它“理想化”就小看它它是整个天线理论的地基。很多实际天线包括半波偶极子、微带贴片天线、甚至阵列天线的单元在数学上都可以看成无穷小偶极子的叠加或某种变形。用无穷小偶极子做近场和远场分析最大的优势是场方程有解析闭式解你可以直接看到每一项的物理来源而不是像全波仿真软件那样只能看结果、改参数、再跑一遍。我在用Matlab模拟时的第一个体会是把无穷小偶极子算明白等于同时理解了“天线为什么能辐射”“近场为什么有储能”“远场为什么是平面波”这三个电磁场核心问题。它把麦克斯韦方程组里一堆抽象的时间变化率关系压缩成几个清晰的 (1/r)、(1/r^2)、(1/r^3) 项这是任何数值仿真软件给不了你的直觉。1.2 适用范围理想化的极限不是偷懒可能有人会问既然实际天线的电流分布很复杂为什么要用一个“无穷小”的模型我当时的想法是这个模型的价值不在于精确模拟某根真实天线而在于作为“极限参考点”。比如你研究电小环天线或者设计一个工作频率远低于结构谐振频率的小型化天线你关心的核心问题是尺寸这么小它还能不能有效辐射这时候无穷小偶极子就是理论上限和下限的参照系。在Matlab里模拟它的近场和远场你可以快速检验自己设计的天线在电性能上和理想电流元有多大差距从而判断还有多少优化空间。所以这个项目看起来是“学术练习”实际是工程分析的基本功。你在Matlab里写的网格生成、复数场计算、远场判据判断这些代码后面分析任何天线结构都能复用。2. 场公式逐项拆解1/r、1/r²、1/r³ 各管一段2.1 三个场分量的来源假设偶极子沿z轴方向放置位于坐标原点电流复振幅为 (I_0)长度为 (dl)介质为自由空间。采用时谐因子 (e^{-jkr})球坐标系下三个非零场分量为磁场只有一个分量 (H_\phi)它在子午面内围绕z轴形成闭合磁力线电场有两个分量径向分量 (E_r) 和切向分量 (E_\theta)。把它们写成便于Matlab实现的形式[ H_\phi \frac{I_0 dl}{4\pi} \sin\theta \left( \frac{jk}{r} \frac{1}{r^2} \right) e^{-jkr} ][ E_r \frac{I_0 dl}{4\pi} \eta \cos\theta \left( \frac{1}{r^2} \frac{1}{jk r^3} \right) e^{-jkr} ][ E_\theta j\frac{I_0 dl}{4\pi} \eta \sin\theta \left( \frac{k}{r} \frac{1}{j r^2} - \frac{1}{k r^3} \right) e^{-jkr} ]其中 (\eta 120\pi \approx 377,\Omega) 是自由空间波阻抗(k 2\pi/\lambda) 是波数。第一次看到这三个式子我总觉得它们长得“差不多”但每一项的物理角色完全不同。核心区分点就是每一项分母中 (r) 的幂次。2.2 近场区谁占主导当天线附近满足 (r) 很小、也就是 (kr \ll 1) 时(1/r^3) 和 (1/r^2) 项会急剧增大。你可以想象在偶极子表面附近电荷积累产生静电场电流产生静磁场它们都还没有来得及“变成”辐射波。因为偶极子长度无限小源两端的电荷几乎同时出现所以近场行为近似于一个静态电偶极子加上一个静态电流元。从公式看(E_r) 中的 (1/(jkr^3)) 项来自电荷密度对应静电偶极子的库仑场(E_\theta) 中的 (1/(k r^3)) 项同样是静电场贡献(H_\phi) 中的 (1/r^2) 项来自恒定电流对应毕奥-萨伐尔定律形式的磁场。这三个近场项有一个共同特征它们随距离衰减非常快而且场强幅度远大于辐射场。更关键的是近场的电场和磁场相位接近正交功率流密度实部很小大部分能量在源周围反复振荡形成“电抗性近场区”。这也是为什么实际天线测量时探针不能离天线太近否则测到的不是辐射场而是储能场。在Matlab模拟时如果你用线性坐标画近场(1/r^3) 项会在距离零点很小的一段范围内压制所有其他项导致远场区域几乎看不见。所以我建议半径网格用对数分布后面会详细说。2.3 远场区为什么只剩横电磁波当观察距离远到 (kr \gg 1) 时(1/r^2) 和 (1/r^3) 项快速衰减可以忽略。此时场近似为[ H_\phi \approx j\frac{I_0 dl}{4\pi} k \sin\theta \frac{e^{-jkr}}{r} ][ E_\theta \approx j\frac{I_0 dl}{4\pi} \eta k \sin\theta \frac{e^{-jkr}}{r} ]注意两个关键信息。第一远场只有 (E_\theta) 和 (H_\phi) 两个分量没有径向分量所以波是横电磁波TEM波传播方向沿 (r)。第二电场和磁场幅度比恒定等于波阻抗 (\eta)这和平面波在自由空间中传播时 (E/H \eta) 的结论完全一致。远场还有一个重要特征是幅度衰减只有 (1/r)。这意味着功率密度正比于 (1/r^2)对半径球面积分后总辐射功率恒定——能量真的“跑出去”了。这就是辐射场和近场储能的本质区别。我在Matlab里绘制沿半径方向的衰减曲线时(1/r) 远场段在双对数坐标下是一条斜率为 -20 dB/十倍距 的直线非常好识别。3. Matlab实现从球坐标网格到复数场数据3.1 参数定义与网格划分写代码前先把参数定义清楚。我用的频率是300 MHz对应波长刚好1 m这样后面看坐标轴时可以直接用 (\lambda) 做单位不用换算。偶极子电流幅度取1 A长度取 (\lambda/100)保证满足“无穷小”条件。%% 无穷小偶极子近远场计算 clear; clc; % 基本参数 f 300e6; % 频率 300 MHz c 3e8; % 光速 lambda c / f; % 波长 1 m k 2*pi / lambda; % 波数 eta 120*pi; % 自由空间波阻抗约 377 欧姆 I0 1; % 电流幅度 1 A dl lambda / 100; % 偶极子长度满足 dl lambda网格生成是最容易被忽略的一步。近场变化非常剧烈远场变化平缓如果用均匀半径网格比如r linspace(0.01, 10, 1000)你会发现0.01到0.5这段近场只占了50个点不够解析尖锐的 (1/r^3) 峰而远场段被分配了几百个点其实没太大必要。我建议直接用对数分布% 球坐标计算网格 r logspace(-3, 1, 600) * lambda; % 0.001λ ~ 10λ对数均匀分布 theta linspace(0, pi, 181); % 极角 0~π [R, TH] meshgrid(r, theta); % 生成二维网格meshgrid生成两个二维矩阵(R) 的每一行都是相同的半径序列(TH) 的每一列都是相同的角度序列。这样后面所有公式都可以写成矩阵运算完全避开for循环。Matlab的数组运算优势在这一步体现得淋漓尽致。如果之后要做三维分布还应该定义方位角 (\phi) 网格但由于偶极子绕z轴对称(\phi) 方向场不变化多数情况下先做二维切面就足够。3.2 公式向量化填值把第二节的公式翻译成Matlab代码注意所有除法都用点除./所有乘法用点乘.*指数衰减项用exp(-1j*k*R)。% 电流矩系数 K I0 * dl / (4*pi); % 三个场分量复数 Hphi K * sin(TH) .* (1j*k./R 1./R.^2) .* exp(-1j*k*R); Er K * eta * cos(TH) .* (1./R.^2 1./(1j*k*R.^3)) .* exp(-1j*k*R); Etheta 1j * K * eta * sin(TH) .* ... (k./R 1./(1j*R.^2) - 1./(k*R.^3)) .* exp(-1j*k*R);写完之后我习惯先做一次量纲和极限检查。比如检查远场处Etheta ./ Hphi是否约等于eta如果偏差很大说明公式某个系数或符号写错了。这个检查成本极低能省下后面大量排查时间。另外注意1/(1j*k*R.^3)在Matlab里等价于 (-j/(kR^3))因为 (1/j -j)。这个负号在近场电场和磁场相位关系里很关键别随手消掉。3.3 保存结果与内存管理很多教材的示例代码喜欢把整个三维空间的所有场都算出来再画图。但如果你把 (r) 取600个点、(\theta) 取181个点、(\phi) 取361个点三个复场分量就是三个 (181 \times 361 \times 600) 的复数数组内存轻松超过2 GB普通笔记本直接卡死。我的做法是“算多少存多少”先在二维切面比如 (r-\theta) 平面算好全部场分量用于分析需要三维方向图时再用解析式在球面上单独算一层避免一次性铺满整个三维空间。对于这个项目二维切面已经能回答绝大多数物理问题三维图只是锦上添花。如果你必须要全空间数据建议用single精度Er single(Er);但要注意single精度下近场的动态范围可能超过7位有效数字靠近原点时依然会有截断误差。我个人不太推荐对近场数据用single除非你只是画方向图。4. 把近场和远场“画”出来一张图看清场的变化4.1 沿半径方向的幅度衰减曲线我画的第一张图是 (\theta 90^\circ)赤道面上电场幅度随半径的变化曲线。取对数纵坐标单位用dBfigure; semilogx(r/lambda, 20*log10(abs(Etheta(91,:)) eps), LineWidth, 1.5); hold on; semilogx(r/lambda, 20*log10(abs(Er(91,:)) eps), --, LineWidth, 1.5); grid on; xlabel(r / \lambda); ylabel(|E| (dB)); legend(|E_\theta|, |E_r|); title(θ 90° 平面电场幅度随距离衰减);加eps是为了防止log10(0)出现-Inf虽然理论上偶极子场不会严格为0但数值误差可能让你看到奇怪的断线。从图上你能非常直观地看到(E_\theta) 在近场区以 (1/r^3) 斜率急剧下降过了某个距离后过渡到 (1/r) 斜率而 (E_r) 因为 (\cos\theta0)在赤道面上恰好为0所以画出来是一条很低的数值噪声线。如果换成 (\theta 45^\circ)两个分量都会出现并且交叉点大致就是近远场的过渡区。这张图最能帮你理解“近场和远场不是一刀切而是连续过渡的”。4.2 xz平面二维云图二维切面图我用pcolor横轴是 (x) 方向位置纵轴是 (z) 方向位置颜色表示场强dB值。先要把球坐标的 (r) 和 (\theta) 转成直角坐标x R .* sin(TH); z R .* cos(TH); figure; pcolor(x/lambda, z/lambda, 20*log10(abs(Etheta) eps)); shading interp; colormap(jet); colorbar; xlabel(x / \lambda); ylabel(z / \lambda); axis equal;注意pcolor默认会把最后一行和最后一列空白掉shading interp可以缓解这个问题。另外z轴方向的偶极子在纸面上看起来是竖着的所以整个场图呈上下对称分布赤道面场最强极轴方向场为零。近场区域的颜色会非常亮因为场强极高远场区域颜色逐渐变暗。如果你觉得近场把整个色标压得太狠可以在画图时设置caxis把色标范围限制在比如[-60, 20]dB这样远场的空间分布也能看清。4.3 远场方向图的甜甜圈最后画那张经典的远场方向图——甜甜圈。这里只取固定半径 (r 5\lambda) 处在远区然后让 (\theta) 从0变到π、(\phi) 从0变到2π% 远场球面方向图 phi3d linspace(0, 2*pi, 200); [Phi3D, Theta3D] meshgrid(phi3d, theta); FF abs(sin(Theta3D)); % 远场方向图函数 |F(θ)| |sinθ| % 球坐标转直角坐标Matlab的sph2cart用仰角需转换 Xf FF .* sin(Theta3D) .* cos(Phi3D); Yf FF .* sin(Theta3D) .* sin(Phi3D); Zf FF .* cos(Theta3D); figure; surf(Xf, Yf, Zf, FF, EdgeColor, none); axis equal; colormap(jet); xlabel(x); ylabel(y); zlabel(z);如果你正确设置了视角会看到z轴方向上下两端幅度为0赤道面幅度最大整体像一个中间鼓起的甜甜圈。这正是无穷小偶极子最经典的远场特征它在轴向不辐射在赤道面辐射最强。这里顺便解释一个新手容易懵的点既然远场方向图是 (\sin\theta)为什么很多书上都画成“8字形”那是在二维极坐标下的切面图在三维球坐标下它绕z轴旋转一周后就变成了甜甜圈。Matlab的surf直接画三维就能看清这个旋转对称性。5. 远场边界到底从哪儿算起三条工程判据5.1 传统口径天线判据为什么会失效很多教材给出的远场判据是 (r 2D^2/\lambda)其中 (D) 是天线最大尺寸。这个公式的物理来源是口径天线两侧到观察点的波程差要小于 (\lambda/16)对应相位误差约22.5度。但对无穷小偶极子来说(D dl \to 0)(2D^2/\lambda) 几乎等于0。你能说处处都是远场吗显然不能因为近场储能是真实存在的。所以这一类“基于口径尺寸”的判据只适用于有明确大尺寸口径的天线对电小天线完全失效。你需要换一套基于场方程衰减项的判据。5.2 相位误差与幅值误差判据更通用的做法是看场表达式中非辐射项相对于辐射项的比值。以 (E_\theta) 为例远场主项是 (k/r) 项近场干扰项中最大的是 (1/(kr^3)) 项因为它比 (1/r^2) 项衰减得更慢不是衰减得更快当距离增大时干扰项快速下降。它们的幅度比值近似为[ \frac{|1/(k r^3)|}{|k/r|} \frac{1}{(kr)^2} ]如果你要求远场项比干扰项高40 dB也就是幅度误差小于1%那么需要[ \frac{1}{(kr)^2} 0.01 \quad \Rightarrow \quad kr 10 ]代回 (k 2\pi/\lambda)得到 (r 10/(2\pi)\lambda \approx 1.6\lambda)。如果只要求5%误差则 (kr \sqrt{20} \approx 4.47)约 (r 0.71\lambda)。这个计算过程在Matlab里很容易验证你在不同半径处计算 (E_\theta) 并和只有 (k/r) 项的近似式对比画出相对误差曲线误差下降到指定阈值的点就是工程远场起点。5.3 针对无穷小偶极子的推荐取值我实际操作下来给这个模型一个比较稳妥的经验取值应用场景距离要求依据感应近场区边界(r 0.159\lambda)(kr 1)近场储能与辐射场量级相当工程近场测试最低要求(r 1\lambda)(kr \approx 6.28)近场干扰项约2.5%高精度远场近似(r 1.6\lambda)(kr 10)误差小于1%测量标准中常用远场距离(r 2\lambda)留足裕量接近理想远场需要强调这里的 (\lambda) 是自由空间波长。如果你在Matlab里改了频率记得同步调整“远场取点”的距离。我在最初仿真时把 (r 5\lambda) 当作固定画方向图的半径改到2.4 GHz后忘记改坐标轴画出来的方向图出现了轻微近场污染方向图顶部变得不光滑排查半天才发现是距离没跟波长一起变。6. 仿真中的实战坑坐标、网格与复数数据6.1 度与弧度一次想清楚Matlab的sin、cos、exp默认接收弧度但画图时你总想用度做坐标轴。我的建议是计算一律用弧度只在画图标注坐标轴时转成度。不要来回切换也不要开着deg2rad到处套。最容易犯的错是在生成theta时写theta linspace(0, 180, 181)然后直接喂给sin(theta)。这样得到的是以“度”为单位的正弦函数结果和物理场完全不同。我发现这个问题是画方向图时“甜甜圈”变成了两个尖刺后来加了一行theta deg2rad(theta)才正常。6.2 网格密度对近场特征的影响近场区域的场强随距离变化非常快尤其是在 (r 0.1\lambda) 的区间。如果网格太粗峰值会被平滑掉画出来的衰减曲线斜率不对某些网格点之间甚至会出现振铃。我建议半径方向用对数网格并且近场区多分点。例如r logspace(-4, 1, 800) * lambda;这样 (0.0001\lambda) 到 (0.1\lambda) 之间有400个点足够分辨近场尖峰。代价是计算量稍大但对内存开销其实不大因为还是同一个二维网格。另外注意不要从 (r0) 开始生成网格。原点处场存在奇异性(E_r \propto 1/r^3) 在 (r0) 时无定义Matlab会给出Inf或NaN污染整个画图色标。从 (0.001\lambda) 甚至 (0.0001\lambda) 开始就可以避免这个问题。6.3 相位信息别丢近场不是球面波很多同学算完复数场后直接abs()取模画完幅度就收工。但近场和远场的一个核心区别恰恰藏在相位里。远场区域等相位面近似是球面相位随 (r) 线性变化(\phi \approx -kr \text{常数})。近场区域由于 (1/r^2) 和 (1/r^3) 项与 (1/r) 项叠加相位随距离变化不再是简单线性电场和磁场之间的相位差也不再是0这直接导致近场出现无功功率。如果你想验证这一点可以画一条相位曲线figure; plot(r/lambda, unwrap(angle(Etheta(91,:))), LineWidth, 1.5); xlabel(r / \lambda); ylabel(相位 (rad));在 (r 1\lambda) 后曲线会非常接近一条直线斜率为 (-k)。在近场区相位曲线会有明显弯曲。这就是“近场不是平面波”最直观的证据。如果你把相位信息丢掉只看幅度图很难建立这个认识。7. 从代码到报告数据验证的一点个人体会我最后想聊一个容易被忽略的环节拿到Matlab结果后怎么确认自己算对了我的做法是拿远场结果和理论极限值做对拍。在 (r 100\lambda)、(\theta 90^\circ) 处理论远场电场幅度约为[ |E_\theta| \approx \frac{I_0 dl}{4\pi} \eta k \frac{1}{r} ]代入 (I_01,\text{A})、(dl\lambda/100)、(r100\lambda)可以得到一个具体的数值再和Matlab代码算出来的结果比较误差应该在 (10^{-4}) 量级以下。如果误差很大十有八九是公式系数或复数符号写错了。第二点是用能量守恒做交叉验证。对远场 (E_\theta) 平方除以 (2\eta) 后在球面积分得到的总辐射功率应该等于电偶极子经典的辐射功率公式[ P_{rad} \eta \frac{|I_0|^2 (k dl)^2}{12\pi} ]这个积分在Matlab里用trapz做数值积分就能完成。我跑通这个验证时数值和理论值偏差在0.2%以内那一刻才真正觉得代码算出来的场是可信的。这个项目做完后我的最大收获反而不是“会画甜甜圈图”而是建立了一套随手能用的电磁场计算工作流先列公式、再选网格、然后向量化实现、最后多窗口对拍验证。这套流程不局限于偶极子后面算半波偶极子、微带贴片的近似模型都能直接迁移。如果你也想在这个基础上继续玩可以试试把多个无穷小偶极子排成阵列叠加它们的场观察阵因子如何改变方向图或者把偶极子放在理想导体平面附近用镜像法验证边界条件对近场的影响。这些扩展实验只用今天这篇的代码框架就能完成。本文还有配套的精品资源点击获取
返回列表