评估mpmathγ功能的困难

时间:2018-08-24 14:18:06

标签: python numerical-integration mpmath gamma-function

我正在使用python库mpmath,尤其是评估不完整的gamma函数。 这是寻根例程的一部分,但是对于某些复数值自变量组合,其求值速度非常慢。

import mpmath as mp
from mpmath import gammainc
def Gamma(a,z0,z1):
    return gammainc(a,a=z0,b=z1,regularized=False)

此处mpmath.gammainc函数的求值卡住了:

>> Gamma(mp.mpc(12.5+17.5j), mp.mpf(0.0), mp.mpf(-12.5))

另一方面,Mathematica几乎立即将结果返回给我:

In[1]:= Gamma[12.5 + 17.5 I, 0, -12.5]
Out[1]:= 2.38012*10^-7 + 5.54827*10^-7 I

在其他情况下,对于不同的参数mpmathMathematica返回相同的输出:

Mathematica

In[2]: Gamma[3.5 I, 0, 10]
Out[2]:= 0.0054741 + 0.000409846 I

Python mpmath

>> Gamma(3.5j,0,10)
mpc(real='0.0054741038497352953', imag='0.00040984640431357779')

您知道这种行为的原因吗?可以认为这是mpmath的问题,还是数学上的正交问题? 不幸的是,scipy没有为复杂参数提供gamma函数的实现,因此不是一种选择。

1 个答案:

答案 0 :(得分:3)

很明显,在某些情况下,mpmath中的错误会导致它在评估gammainc时陷入无限循环。值得报告mpmath tracker。但是至少对于您提到的情况,一种解决方法是将三个参数的不完全伽马函数编写为两个上部不完全伽马函数(reference)之差。通过将两个参数传递给gammainc(即z1被隐式地视为正无穷大)来计算上部不完全伽马函数。

def Gamma(a, z0, z1):
    return gammainc(a, z0) - gammainc(a, z1)

print(Gamma(12.5+17.5j, 0.0, -12.5)) 

与WolframAlpha同意打印(2.3801203496987e-7 + 5.54827238374855e-7j)