scipy.special.gamma#

scipy.special.gamma(z, out=None) = <ufunc 'gamma'>#

伽马函数。

伽马函数定义为

\[\Gamma(z) = \int_0^\infty t^{z-1} e^{-t} dt\]

对于 \(\Re(z) > 0\),并通过解析延拓扩展到复平面的其余部分。有关更多详细信息,请参阅 [dlmf]

参数:
zarray_like

实数或复数值参数

outndarray, optional

可选的输出数组,用于存储函数值

返回:
标量或 ndarray

伽马函数的值

附注

伽马函数通常被称为广义阶乘,因为对于自然数 \(n\)\(\Gamma(n + 1) = n!\)。更一般地,它满足递归关系 \(\Gamma(z + 1) = z \cdot \Gamma(z)\),适用于复数 \(z\),这与 \(\Gamma(1) = 1\) 结合,意味着对于 \(z = n\),上述恒等式成立。

伽马函数在非负整数处具有极点,并且当 z 接近每个极点时,无穷大的符号取决于接近极点的方式。因此,一致的做法是在负整数处返回 NaN,并在 x = -0.0 时返回 -inf,在 x = 0.0 时返回 +inf,使用零的符号位来表示接近原点的方向。例如,这是 Iso C 99 标准附录 F 条目 9.5.4 中对伽马函数的建议 [isoc99]

在 SciPy 1.15 版本之前,scipy.special.gamma(z) 在每个极点处返回 +inf。这在版本 1.15 中得到了修复,但由此产生了一个后果。包含伽马函数的表达式,例如

gamma(u) * gamma(v) / (gamma(w) * gamma(x))

如果分子定义良好但分母中存在极点,则不再评估为 0。相反,这些表达式评估为 NaN。我们建议使用 rgamma 函数来计算伽马函数的倒数,在这种情况下。例如,上述表达式可以写成

gamma(u) * gamma(v) * (rgamma(w) * rgamma(x))

数组 API 标准支持

gamma 具有对 Python Array API 标准兼容后端(除了 NumPy 之外)的实验性支持。请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

Dask

不适用

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

示例

>>> import numpy as np
>>> from scipy.special import gamma, factorial
>>> gamma([0, 0.5, 1, 5])
array([         inf,   1.77245385,   1.        ,  24.        ])
>>> z = 2.5 + 1j
>>> gamma(z)
(0.77476210455108352+0.70763120437959293j)
>>> gamma(z+1), z*gamma(z)  # Recurrence property
((1.2292740569981171+2.5438401155000685j),
 (1.2292740569981158+2.5438401155000658j))
>>> gamma(0.5)**2  # gamma(0.5) = sqrt(pi)
3.1415926535897927

绘制实数 x 的 gamma(x)

>>> x = np.linspace(-3.5, 5.5, 2251)
>>> y = gamma(x)
>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y, 'b', alpha=0.6, label='gamma(x)')
>>> k = np.arange(1, 7)
>>> plt.plot(k, factorial(k-1), 'k*', alpha=0.6,
...          label='(x-1)!, x = 1, 2, ...')
>>> plt.xlim(-3.5, 5.5)
>>> plt.ylim(-10, 25)
>>> plt.grid()
>>> plt.xlabel('x')
>>> plt.legend(loc='lower right')
>>> plt.show()
../../_images/scipy-special-gamma-1.png