Sympy 无法评估涉及伽马函数的无穷和

Sympy cannot evaluate an infinite sum involving gamma functions

我正在使用 Sympy 来评估一些涉及 gamma 函数操作的符号和,但我注意到在这种情况下它没有评估总和并保持未评估。

import sympy as sp
a = sp.Symbol('a',real=True)
b = sp.Symbol('b',real=True)
d = sp.Symbol('d',real=True)
c = sp.Symbol('c',integer=True)
z = sp.Symbol('z',complex=True)
t = sp.Symbol('t',complex=True)
sp.simplify(t-sp.summation((sp.exp(-d)*(d**c)/sp.gamma(c+1))/(z-c-a*t),(c,0,sp.oo)))

然后我需要对这个表达式进行 lambdify,不幸的是,这变得不可能了。

使用 Matlab 符号工具箱但是我得到以下答案:

Matlab

>> a=sym('a') 
>> b=sym('b');
>> c=sym('c')
>> d=sym('d');
>> z=sym('z');
>> t=sym('t');
>> symsum((exp(-d)*(d^c)/factorial(c))/(z-c-a*t),c,0,inf)
ans = 
(-d)^(z - a*t)*exp(-d)*(gamma(a*t - z) - igamma(a*t - z, -d))

正如预期的那样,该公式涉及较低的不完全伽马函数。 知道为什么会出现这种行为吗?我以为 sympy 能够象征性地做这个求和。

运行 您使用 SymPy 1.2 的代码导致

d**(-a*t + z)*exp(-I*pi*a*t - d + I*pi*z)*lowergamma(a*t - z, d*exp_polar(I*pi)) + t

顺便说一下,summation 已经尝试计算总和(并且在 SymPy 1.2 的情况下成功),随后的简化是表面的。 (有时可能有害)。

exp_polar 的存在意味着 SymPy 发现有必要考虑对数函数黎曼曲面上的点而不是常规复数。 (Related bit of docs)。函数 lower_gamma 是分支的,因此我们必须区分 "the value at -1, if we arrive to -1 from 1 going clockwise" 和 "the value at -1, if we arrive to -1 from 1 going counterclockwise"。前者是exp_polar(-I*pi),后者是exp_polar(I*pi)

所有这些都非常有趣,但在您需要对表达式进行具体计算时并没有多大帮助。我们必须取消对这个表达式的极化,从 Matlab 显示的情况来看,简单地将 exp_polar 替换为 exp 是一种正确的方法。

rv = sp.simplify(t-sp.summation((sp.exp(-d)*(d**c)/sp.gamma(c+1))/(z-c-a*t),(c,0,sp.oo)))
rv = rv.subs(sp.exp_polar, sp.exp)

结果:d**(-a*t + z)*exp(-I*pi*a*t - d + I*pi*z)*lowergamma(a*t - z, -d) + t

这里还有一些东西要考虑,有复数之类的。 d 是正数还是负数?提高它的-a*t+z次方是什么意思,我们取多值幂函数的哪个分支? Matlab 输出中存在相同的问题,其中 -d 被提升为幂。

我建议使用浮点输入对此进行测试(序列的直接求和与对它的 SymPy 表达式的求值),并在可能的情况下在 d 的符号上添加假设。