【问题标题】:Plotting modes of circular waveguide in MatlabMatlab中圆形波导的绘制模式
【发布时间】:2019-02-15 23:15:08
【问题描述】:

我在绘制圆形波导的 TE 和 TM 模式时遇到了一些问题。
一切都基于这些公式:

现在我专注于 TE 模式,而我必须绘制的是等于波导半径的平方网格内的场矢量 e_mn''。
为此,我需要计算第一类贝塞尔函数并提取对应于函数等于零的第 n 个根的 x_mn。这些观点应该是真实的但积极的。
我按照这个例子
https://www.mathworks.com/examples/matlab/community/22719-roots-of-a-bessel-function 但我收到一个错误:

未定义函数 'isfinite' 用于类型> 'function_handle' 的输入参数。
如果 ~all(isfinite(c))
在根中出错(第 26 行)
错误 在循环中(第 20 行)
x_mn=roots(J0)

这是我的代码。你能帮帮我吗?

clc
clear all
close all
a=20; %radius
m=0;    
n=1;


%%
if m==0
    ki_m=1;
else
ki_m=sqrt(2); 
end

r=0:0.1:a;
J0 = @(r) besselj(0,r);
    %J0 = besselj(m,r);
    %plot(J0)
    x_mn=roots(J0)
    %plot(J0(x_mn))
    %x_mn=abs(x_mn);
k_mn=x_mn./a;
F_mn=(ki_m*k_mn)./(J0(x_mn)*sqrt(pi*(x_mn^2-m^2)));

for r=0:1:a
    for phi=0:1*pi/180:2*pi
        e_mnR=-F_mn.*(J0(k_mn*r)/(k_mn.*r))*sin(m*phi);
        e_mnPHI=F_mn.*J0(k_mn*r)*cos(m*phi);
    end
end
e_mnR=abs(e_mnR);
e_mnPHI=abs(e_mnPHI);
X=0:1:a;
[X,Y] = meshgrid(1:1:a);
quiver(X,Y,e_mnR,e_mnPHI);
hold on

【问题讨论】:

  • 此错误是因为 J0 包含 besselj 函数句柄而不是其结果。如果你想让 besselj 计算 r 只需使用 J0 = besselj(0,r);

标签: matlab


【解决方案1】:

这不是我的专业领域,所以对此持保留态度,但我做了一些谷歌搜索并认为我知道发生了什么:

您在提供的link 中使用的代码定义:

J0 = chebfun(@(x) besselj(0,x),[0 100]);

请注意,您引用 Chebfun 示例的链接已失效,但我读到 here

Chebfun 是一个用于计算的开源软件包,其函数精度约为 15 位。大多数 Chebfun 命令都是熟悉的 MATLAB 命令的重载...

您引用的示例有效的唯一原因是因为J0 是使用Chebfun 定义的,它使用自己的适用于函数句柄的版本重载了matlab 命令roots。如果您想复制该代码示例,请阅读更多here 并尝试使用此工具。希望这会有所帮助...

【讨论】:

    【解决方案2】:

    您可以使用 fzero 代替根,但是您在绘图部分混淆了极坐标和笛卡尔坐标,并且向量的尺寸不一致

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-25
      • 2013-04-01
      • 2014-12-29
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      相关资源
      最近更新 更多