Matlab中圆波导TE/TM模式绘图问题求助
嘿,刚好之前做过圆波导TE/TM模式的可视化脚本,碰到过和你一样的问题,给你分享下我的解决思路和踩过的坑!
核心要点先明确
首先得理清TE模式的关键公式:TE模式的截止波数 ( k_c = \frac{x'{mn}}{a} ),其中 ( x'{mn} ) 是m阶第一类贝塞尔函数导数的第n个正实根(别和TM模式搞混,TM用的是贝塞尔函数本身的根),而你要绘制的场矢量 ( e_{mn}'' ) 本质是电场的横向分量,由贝塞尔函数及其导数组合而来。
步骤1:正确提取贝塞尔函数导数的根 ( x'_{mn} )
这一步最容易踩坑,别用错根!
- 如果用Python,直接用
scipy.special里的jnp_zeros函数,它专门返回m阶第一类贝塞尔函数导数的前n个正根,比如要取第n个根:from scipy.special import jnp_zeros m = 1 # 贝塞尔函数阶数,对应TE模式的下标m n = 1 # 第n个根,对应TE模式的下标n x_mn_prime = jnp_zeros(m, n)[-1] # 取第n个根 - 如果不想依赖库,自己实现的话,可以用牛顿迭代法:先确定根的大致区间(比如m阶贝塞尔函数导数的第n个根在 ( j_{m,n} ) 和 ( j_{m+1,n} ) 之间,( j_{m,n} ) 是m阶贝塞尔函数的第n个根),然后迭代求解 ( J'_m(x)=0 )。
步骤2:构建方形网格并转换极坐标
因为波导是圆形,而你要在半径等于波导半径的方形网格里绘制,所以:
- 生成x和y方向从(-a)到(a)的网格(a是波导半径),用
numpy.meshgrid实现 - 把直角坐标转换成极坐标((r, \theta)),注意处理r=0的情况(避免后续除以零报错):
import numpy as np a = 1.0 # 波导半径 x = np.linspace(-a, a, 200) # 200是网格分辨率,越高细节越清晰 y = np.linspace(-a, a, 200) X, Y = np.meshgrid(x, y) r = np.sqrt(X**2 + Y**2) theta = np.arctan2(Y, X) r[r == 0] = 1e-10 # 给r=0的点加极小值,避免除以零
步骤3:计算场矢量并转换为直角坐标
TE模式的横向电场分量(极坐标下)公式如下(省略了时谐因子和常数系数,不影响分布):
( E_r = -\frac{j\omega\mu}{k_c^2} \cdot \frac{m}{r} \cdot J_m(k_c r) \cdot \sin(m\theta) )
( E_\theta = \frac{j\omega\mu}{k_c^2} \cdot k_c \cdot J'_m(k_c r) \cdot \cos(m\theta) )
转换成直角坐标分量:
( E_x = E_r \cos\theta - E_\theta \sin\theta )
( E_y = E_r \sin\theta + E_\theta \cos\theta )
代码实现(用scipy的贝塞尔函数和导数):
from scipy.special import jv, jvp k_c = x_mn_prime / a # 截止波数 # 计算极坐标下的电场分量 E_r = -1j * (m / r) * jv(m, k_c * r) * np.sin(m * theta) E_theta = 1j * k_c * jvp(m, k_c * r) * np.cos(m * theta) # 转换为直角坐标 E_x = E_r * np.cos(theta) - E_theta * np.sin(theta) E_y = E_r * np.sin(theta) + E_theta * np.cos(theta) # 掩码处理:波导外(r>a)的场为0 mask = r > a E_x[mask] = 0 E_y[mask] = 0
步骤4:绘制场矢量
用matplotlib.quiver绘制矢量场,记得取场的实部(因为是复数场,代表某一时刻的瞬时分布):
import matplotlib.pyplot as plt plt.figure(figsize=(8,8)) plt.quiver(X, Y, np.real(E_x), np.real(E_y), scale=20) plt.xlabel('x') plt.ylabel('y') plt.title(f'TE_{m}{n} Mode Electric Field in Circular Waveguide') plt.xlim(-a, a) plt.ylim(-a, a) plt.gca().set_aspect('equal', adjustable='box') plt.show()
常见坑点提醒
- 根的类型搞混:TE用贝塞尔函数导数的根,TM用贝塞尔函数本身的根,别搞反!
- r=0的处理:当m≠0时,E_r里的( \frac{m}{r} )会在r=0时报错,一定要给r=0加极小值;如果m=0,E_r项直接为0,可以单独判断处理。
- 网格分辨率:分辨率太低的话,场的细节会模糊,建议用200x200以上的网格。
内容的提问来源于stack exchange,提问作者Shika93

