python 中不完整的 gamma 函数?

问题描述 投票:0回答:4

scipy.special.gammainc
第一个参数不能取负值。 python 中还有其他实现吗?我肯定可以进行手动集成,但我想知道是否已经存在好的替代方案。

Correct result: 1 - Gamma[-1,1] = 0.85

Use Scipy: scipy.special.gammainc(-1, 1) = 0

谢谢。

python scipy
4个回答
9
投票

每当我需要特殊功能并且我不太关心性能时,我通常会使用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')

4
投票

我刚刚遇到了同样的问题,最终在以下情况下使用了函数的递归关系:http://en.wikipedia.org/wiki/Incomplete_gamma_function#Properties<0.

另请注意,scipy 函数 gammainc 和 gammaincc 给出正则化形式 Gamma(a,x)/Gamma(a)


1
投票
2021 年仍然是一个问题,他们仍然没有在 scipy 中改进这个问题。 尤其令人沮丧的是,

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


0
投票
根据 JoeZuntz 的回答,这是 $-1 的示例实现

import scipy.special as special def gamma_incomplete(a,x): return special.gamma(a) * special.gammainc(a,x) def gamma_incomplete_larger_domain(a, x): """ This corresponds to \gamma in https://en.wikipedia.org/wiki/Incomplete_gamma_function see also the identity in that wikipedia page for the transformation we apply below """ # because we want -1 < a, we use recurrance relation val = 1 / a * (gamma_incomplete(a + 1, x) + (x ** a) * np.exp(-x)) return val

    
© www.soinside.com 2019 - 2024. All rights reserved.