1

我使用 SageMath 来象征性地整合一个表达式。结果包含一个gamma带有两个输入参数的函数:

gamma(-1, 2*((x - xp)^2 + (y - yp)^2)/s^2)

显然这被称为不完全伽马函数。现在我想在 Python 代码中使用这个表达式。我已将不完整的 gamma 函数追踪到scipy.special.gammainc. 不幸的是,这个函数不允许负输入参数,我必须使用-1它作为第一个输入参数。我该如何解决这个问题?

4

2 回答 2

3

根据维基百科,可以根据不正确的积分来定义下不完全伽马函数。这个积分可以与指数积分的广义形式有关。两页都给出了两者之间的这种关系:

E_n(x) = x^(n-1)*gamma(1-n, x)

因此,对于 OP 中的情况,我们将拥有n=2,它对应于-1gamma 函数的第一个输入参数。我已经在 SageMath 中用数字验证了上述关系成立。SageMath 中对应的函数有:

1. gamma(n, x) == gamma_inc(n, x)
2. E_n(x) == exp_integral_e(n, x)

根据维基百科的关系,这给了我们(除了舍入错误):

exp_integral_e(n, x) == x^(n-1)*gamma_inc(1-n, x)

对应的 Python 函数为:

1. gamma(n, x) == scipy.special.gammainc(n, x)
2. E_n(x) == scipy.special.expn(n, x)

根据维基百科的关系,这给了我们(除了舍入错误):

expn(n, x) == x**(n-1)*gammainc(1-n, x)

有一个小警告。SageMath中的gamma_inc函数接受负的第一个输入参数,而来自 SageMath 的gammainc函数scipy.special不接受。然而,expn函数 fromscipy.special没有这个限制,因为它可以被评估为n>=2对应于负的第一个输入参数gamma_inc

因此,OP 的答案是使用 Wikipedia 关系将下不完全伽马函数替换为广义指数积分,并scipy.special.expn用于 Python 中的评估。

于 2020-01-16T13:06:15.337 回答
-2

不能输入负数是有原因的,因为无法计算负整数的阶乘,因为对于 n = 0,递归关系为:

(n-1)! = n!/n  

这将导致除以零。
也许您应该将问题重新表述为您要实现的目标类型,然后交叉发布https://math.stackexchange.com/

于 2020-01-15T16:23:44.207 回答