包含复函数的指数的数值积分

计算科学 matlab 数值建模
2021-12-24 12:07:08

我想得到菲涅尔-基尔霍夫积分在近轴近似的圆柱衍射波的结果,这是我的代码的一部分,如果解决了,将把其他部分带出去。这是一个 Matlab 代码。

vpa(int(exp(-1i*2*k*(n_cl-n_s)*sqrt(b^2-x_p^2))*exp(1i*k*((x-x_p)^2)/2z),-b,-a)) 

关于 x_p。在哪里

b = 62.5*e-6; % cladding radius
a = 4*e-6; % core radius
n_co = 1.473; % core ref index
n_cl = n_co - 0.016; % cladding ref index
n_s  = 1.37868e-5; % surrounding ref index
L = 457.9e-9; % wavelength
k = 2*pi/L; % wavenumber
z = 0.4 ; 
x =-0.0002;

哪个命令应该用作积分器?我一直在尝试使用int(),而不是quad因为quad不满足获得复杂结果的要求。除此之外,我还遇到了众所周知的错误

Explicit integral could not be found

不知道该怎么办。请帮我。

1个回答

int功能(更准确地说sym/int)主要是为符号集成而设计的。当它无法获得符号结果时,它将尝试使用 MuPAD 的数字解决方案numeric::int我不知道为什么这不会评估为数字结果,但是您可以使用 MuPAD's numeric::quadrature,它是以下内容的基础numeric::int

evalin(symengine,'numeric::quadrature(exp(-(pi*(4722366482869645/1208925819614629174706176 - x_p^2)^(1/2)*55043382873750776053760*i)/4324743225012021)*exp(((x_p + 1/5000)^2*7366803725989309*i)/2684354560), x_p == -1/16000..-4722366482869645/1180591620717411303424)')

但是,根据您所有的浮点参数值,我想您实际上正在寻找基于数字求积的解决方案。您应该使用integral(或可能quadgk在旧版本的 Matlab 中):

integral(@(x_p)exp(-1i*2*k*(n_cl-n_s)*sqrt(b^2-x_p.^2)).*exp(1i*k*((x-x_p).^2)/2*z),-b,-a)

两种方法返回的结果相互一致。


注意:您的等式中有一个错字。我假设你的意思...)/2*z是反对...)/(2*z)