第scipy.special.gammainc
一个参数不能取负值。在 python 中还有其他实现吗?我可以肯定地进行手动集成,但我想知道是否已经存在好的替代方案。
Correct result: 1 - Gamma[-1,1] = 0.85
Use Scipy: scipy.special.gammainc(-1, 1) = 0
谢谢。
每当我需要特殊功能并且我不太关心性能时,我通常会使用mpmath 。(尽管它在许多情况下的性能还是相当不错的。)
例如:
>>> import mpmath
>>> mpmath.gammainc(-1,1)
mpf('0.14849550677592205')
>>> 1-mpmath.gammainc(-1,1)
mpf('0.85150449322407795')
>>> mpmath.mp.dps = 50 # arbitrary precision!
>>> 1-mpmath.gammainc(-1,1)
mpf('0.85150449322407795208164000529866078158523616237514084')
我刚刚遇到了同样的问题,最终在 a<0 时使用了函数的递归关系。 http://en.wikipedia.org/wiki/Incomplete_gamma_function#Properties
另请注意,scipy 函数 gammainc 和 gammaincc 给出正则化形式 Gamma(a,x)/Gamma(a)
在 2021 年仍然是一个问题,他们仍然没有在 scipy 中对此进行改进。尤其令人沮丧的是,scipy
甚至不提供上下不完全 Gamma 函数的非正则化版本。我也最终使用了mpmath
,它使用自己的数据类型(这里mpf
是 mpmath 浮点数 - 支持任意精度)。为了快速为适用于数组的上下不完全 Gamma 函数制作一些东西numpy
,并且其行为类似于评估这些积分时所期望的那样,我想出了以下内容:
import numpy as np
from mpmath import gammainc
"""
In both functinos below a is a float and z is a numpy.array.
"""
def gammainc_up(a,z):
return np.asarray([gammainc(a, zi, regularized=False)
for zi in z]).astype(float)
def gammainc_low(a,z):
return np.asarray([gamainc(a, 0, zi, regularized=False)
for zi in z]).astype(float)
再次注意,这是针对非正则化函数(DLMF中的 Eq. 8.2.1 和 8.2.2 ),正则化函数(Eq. 8.2.3 和 8.2.4)可以mpmath
通过设置关键字来获得regularized=True
。