我使用 SageMath 来象征性地整合一个表达式。结果包含一个gamma
带有两个输入参数的函数:
gamma(-1, 2*((x - xp)^2 + (y - yp)^2)/s^2)
显然这被称为不完全伽马函数。现在我想在 Python 代码中使用这个表达式。我已将不完整的 gamma 函数追踪到scipy.special.gammainc
. 不幸的是,这个函数不允许负输入参数,我必须使用-1
它作为第一个输入参数。我该如何解决这个问题?
我使用 SageMath 来象征性地整合一个表达式。结果包含一个gamma
带有两个输入参数的函数:
gamma(-1, 2*((x - xp)^2 + (y - yp)^2)/s^2)
显然这被称为不完全伽马函数。现在我想在 Python 代码中使用这个表达式。我已将不完整的 gamma 函数追踪到scipy.special.gammainc
. 不幸的是,这个函数不允许负输入参数,我必须使用-1
它作为第一个输入参数。我该如何解决这个问题?
根据维基百科,可以根据不正确的积分来定义下不完全伽马函数。这个积分可以与指数积分的广义形式有关。两页都给出了两者之间的这种关系:
E_n(x) = x^(n-1)*gamma(1-n, x)
因此,对于 OP 中的情况,我们将拥有n=2
,它对应于-1
gamma 函数的第一个输入参数。我已经在 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 中的评估。
不能输入负数是有原因的,因为无法计算负整数的阶乘,因为对于 n = 0,递归关系为:
(n-1)! = n!/n
这将导致除以零。
也许您应该将问题重新表述为您要实现的目标类型,然后交叉发布https://math.stackexchange.com/