编程功能包含切入负虚轴

时间:2014-07-09 21:28:00

标签: python numpy scipy sympy

最终更新

我通过电子邮件发送了论文的作者,事实证明sigma的等式中有一个错误。我给了pv最好的答案,因为他们帮助回答了所说的问题。

第一次尝试 我正在尝试编写下面函数的数值表示:

sigma

Dm

和'+'/' - '上标表示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图:

enter image description here

这是应该的情节(看右边的m = 11曲线):

enter image description here

用户光伏帮助我将Hankel函数的切割移动到负假想的半轴,但我的sigma图仍然是关闭的。我在论文中指出,它指出西格玛是“纯粹想象的”(第五页,第一栏)

这些方程式和图表来自本文第4页:http://arxiv.org/pdf/1302.0245v1.pdf

第二次尝试

文章的附录B说明了切割中Hankel函数的差异为

enter image description here

从这个关系中,我们也可以找到切割中Hankel函数的一阶导数的差异:

enter image description here

我用这些公式编写了一个脚本:

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会得到与第一种方法相同的结果。

1 个答案:

答案 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)。

基于此,您还可以计算衍生物。