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

时间:2018-08-29 08:00:33

标签: python sympy symbolic-math

我正在使用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)))

然后我需要对此表达式进行lambd化,不幸的是,这变得不可能。

但是使用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可以象征性地进行此求和。

1 个答案:

答案 0 :(得分:2)

使用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发现有必要考虑对数函数的Riemann曲面上的点,而不是规则的复数。 (Related bit of docs)。函数lower_gamma是分支的,因此我们必须区分“如果-1从-1到-1顺时针到达-1”和“ -1如果-1从-1到-1则回到-1。逆时针”。前者是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的符号添加假设。