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')
scipy
甚至没有提供上下不完整 Gamma 函数的非正则版本。 我最终还使用了
mpmath
,它使用自己的数据类型(这里
mpf
表示 mpmath 浮动 - 支持任意精度)。 为了快速为与
numpy
数组一起使用的上部和下部不完整 Gamma 函数做一些事情,并且其行为就像人们从评估这些积分时所期望的那样,我想出了以下方法:
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中的方程8.2.1和8.2.2),正则化函数(方程8.2.3和8.2.4)可以在mpmath
中获得通过设置关键字
regularized=True
。