Python 包含负虚轴切入的编程函数

Python 包含负虚轴切入的编程函数,python,numpy,scipy,sympy,Python,Numpy,Scipy,Sympy,最终更新 我给论文作者发了电子邮件,结果发现西格玛方程中有一个错误。我给了pv最好的答案,因为他们确实帮助回答了前面提到的问题 第一次尝试 我正在尝试编程以下函数的数值表示: , “+”/“-”上标表示z接近分支切口时的极限,分支切口位于负虚半轴上。H和J是Hankel和Bessel函数。其余变量(n_r,m,r)取决于问题的几何结构。我想沿着负虚半轴画这个函数,关于k。我的当前代码(添加pv)如下所示) 这是我的sigma.imag沿负虚轴的图: 图应该是这样的(看右边的m=11曲线):

最终更新

我给论文作者发了电子邮件,结果发现西格玛方程中有一个错误。我给了pv最好的答案,因为他们确实帮助回答了前面提到的问题

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

,

“+”/“-”上标表示z接近分支切口时的极限,分支切口位于负虚半轴上。H和J是Hankel和Bessel函数。其余变量(n_r,m,r)取决于问题的几何结构。我想沿着负虚半轴画这个函数,关于k。我的当前代码(添加pv)如下所示)

这是我的sigma.imag沿负虚轴的图:

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

用户pv帮助我将Hankel函数的切面移到负的假想半轴上,但我的sigma图仍处于关闭状态。我在论文中指出,它指出西格玛是“纯粹虚构的”(第五页顶部,第一栏)

这些方程式和图表来自本文第4页:

第二次尝试

文章的附录B说明了汉克尔函数在整个切割中的差异,如下所示:

从这一关系中,我们还可以发现汉克尔函数的一阶导数在切口上的差异:

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

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

scipy中H1的分支切割为(-inf,0),而不是如您引用的论文中所预期的(-1j*inf,0),这解释了您得到错误结果的原因

正如我在上面的评论中指出的那样,这个问题可以通过创造性地使用an来解决

让我们假设整数阶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)
在Scipy中,kv(n,z)被定义为在(-inf,0)处有分支切割,而iv(n,z)没有分支切割(整数顺序)。因此,除了对数,RHS上的分支切割在(-1j*inf,0)中,正好在我们想要的位置。剩下要做的唯一一件事就是适当地选择对数项的分支截

然后使用分支切入(-1j*inf,0)得到正确的解析延拓

这与四个象限中的三个象限中的
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)


在此基础上,你还可以算出导数。

这个公式,如前所述,产生你得到的曲线。问题似乎是,本文对Hankel函数的分支切割使用了非标准选择。Scipy(和Mathematica)都沿着负实轴而不是本文假设的负虚轴进行切割。你可能可以创造性地使用感谢关于分支切割的提醒来绕过分支切割问题。我已经用这些信息更新了这个问题。考虑到这一点,我将对这个问题进行另一次尝试。将Neumann/Hankel函数及其参数乘以我确实会移动切割,但函数的值仍然与切割沿负实轴时相同。据我所知,SciPy中的Hankel函数是从(-pi,pi)定义的,将切割移动到负虚轴意味着在(-pi/2,3pi/2)上定义函数。我只是将现有曲面旋转到另一个位置,而不是使用新的切割在新的黎曼曲面上定义函数。有关如何使用转换来移动分支切割,请参见下面的答案。谢谢您的回答,这非常有帮助。我以为这可以解决整个问题,但我仍然无法绘制西格玛函数。我很抱歉从帖子中删除“已回复”状态。
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 hankel1_imcut(n, z):
    return jv(n, z) + 1j*yv_imcut(n, z)