最终更新
我通过电子邮件发送了论文的作者,事实证明sigma的等式中有一个错误。我给了pv最好的答案,因为他们帮助回答了所说的问题。
第一次尝试 我正在尝试编写下面函数的数值表示:
,
和'+'/' - '上标表示z接近分支切割时的极限,它位于负假想半轴上。 H和J是Hankel和Bessel函数。其余变量(n_r,m,R)取决于问题的几何形状。我希望沿着相对于k的负假想半轴绘制该函数。我当前的代码(添加了pv)如下所示)
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi
from scipy.special import jv, iv, kv, jvp, ivp, kvp
m = 11 # Mode number
nr = 2 # Index of refraction
R = 1 # Radius of cylinder
eps = 10e-8
def yv_imcut(n, z):
return -2/(pi*(1j)**n)*kv(n, -1j*z) + 2*(1j)**n/pi * (0.5j*pi) * iv(n,-1j*z)
def yvp_imcut(n, z):
return (n/z)*yv_imcut(n,z) - yv_imcut(n+1,z)
def hankel1_imcut(n, z):
return jv(n, z) + 1j*yv_imcut(n, z)
def h1vp_imcut(n, z):
return jvp(n, z, 1) + 1j*yvp_imcut(n, z)
# Define the characteristic equation
def Dm(n, z):
return nr*jvp(n, nr*z, 1) * hankel1_imcut(n, z) - jv(n, nr*z)*h1vp_imcut(n,z)
# Define the cut pole density function
def sigma(k,n):
return 4*(nr**2 - 1)*jv(n,nr*k*R)/(pi**2 * k * ((Dm(n, k*R-eps).real)**2 + (Dm(n, k*R+eps).imag)**2))
k = np.linspace(-eps*1j, -15j,1000)
y = sigma(k,m)
x = np.linspace(0,15,1000)
plt.plot(x, y.imag)
plt.show()
这是我在负虚轴上的sigma.imag图:
这是应该的情节(看右边的m = 11曲线):
用户光伏帮助我将Hankel函数的切割移动到负假想的半轴,但我的sigma图仍然是关闭的。我在论文中指出,它指出西格玛是“纯粹想象的”(第五页,第一栏)
这些方程式和图表来自本文第4页:http://arxiv.org/pdf/1302.0245v1.pdf
第二次尝试
文章的附录B说明了切割中Hankel函数的差异为
从这个关系中,我们也可以找到切割中Hankel函数的一阶导数的差异:
我用这些公式编写了一个脚本:
def hankel1_minus(n,z):
return hankel1(n,z) - 4*jv(n,z)
def h1vp_minus(n,z):
return (n/z)*hankel1_minus(n,z) - hankel1_minus(n+1,z)
def Dm_plus(n, z):
return nr *jvp(n, nr*z, 1) * hankel1(n, z) - jv(n, nr*z)*h1vp(n,z)
def Dm_minus(n, z):
return nr *jvp(n, nr*z, 1) * hankel1_minus(n,z) - jv(n, nr*z)*h1vp_minus(n,z)
def sigma(k,n):
return 4*(nr**2 - 1)*jv(n,nr*k*R)/(pi**2 * k * (Dm_plus(n, k*R) * Dm_minus(n,k*R)).real)
绘制此sigma会得到与第一种方法相同的结果。
答案 0 :(得分:1)
在scipy中H1的分支切割是(-inf,0)而不是(-1j * inf,0),正如您引用的论文所预期的那样,这解释了为什么您得到的结果不正确。
正如我在评论中指出的那样,问题可以通过argument transformation for Y_nu的一些创造性使用来解决。
让我们假设整数阶n。我们有
hankel1(n, z) = jv(n, z) + 1j*yv(n, z)
jv没有分支切割(整数顺序),但是yv有。转换公式为
yv(n, 1j*z) = -2/(pi*(1j)**n)*kv(n, z) + 2*(1j)**n/pi * (log(1j*z) - log(z))*iv(n,z)
或换句话说,
yv(n, z) = -2/(pi*(1j)**n)*kv(n, -1j*z) + 2*(1j)**n/pi * (log(z) - log(-1j*z))*iv(n,-1j*z)
kv(n,z)在Scipy中定义为在(-inf,0)处具有分支切割,并且iv(n,z)没有分支切割(整数顺序)。除了对数之外,RHS上的分支切口因此(-1j * inf,0),正好在我们想要的位置。剩下要做的就是适当选择对数项的分支切割。
然后
分支切入(-1j * inf,0)的正确分析延续def yv_imcut(n, z):
return -2/(pi*(1j)**n)*kv(n, -1j*z) + 2*(1j)**n/pi * (0.5j*pi) * iv(n,-1j*z)
这恰好与4个象限中的3个中的yv(n, z)
重合。它有一个分支切入(-1j * inf,0)。而且,它显然是一种分析功能。因此,它与yv
相同,但具有不同的分支切割选择。
然后我们
def hankel1_imcut(n, z):
return jv(n, z) + 1j*yv_imcut(n, z)
显然,Hankel函数的分支切入(-1j * inf,0)。
基于此,您还可以计算衍生物。