python - Sympy 无法评估涉及伽马函数的无限和
问题描述
我正在使用 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 的情况下成功),随后的简化是装饰性的。(有时可能是有害的)。
SymPy 发现有exp_polar
必要考虑对数函数黎曼曲面上的点而不是常规复数。(相关的文档)。该函数lower_gamma
是分支的,因此我们必须区分“-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
可能的情况下添加对符号的假设。
推荐阅读
- c - 为什么变量 input2 = -1?
- vue.js - 在 Vue 中访问异步加载的组件
- php - 在 WooCommerce 中设置除产品标签以外的最低订单价值
- cmake - 创建我自己的“clang-format”样式,可以通过“BasedOnStyle”设置在多个项目中使用
- python - 我如何优化这个简单的 python pygame 代码
- api - Axios 获得授权不在 Vue 中工作,但在 POSTMAN 上工作(vue 上的 Post 方法工作)
- mysql - 如何快速更新单表中超过 5000 万行?
- postgresql - 从 Postgres 数据库检索后如何处理不同的分辨率 time.Time 对象
- javascript - React Navigation 5 真的很慢并且在 Expo 上丢掉了 JS FPS
- graph - 我们如何比较图聚类结果以在蛋白质-蛋白质相互作用网络中找到相似的基因?