sympy - Sympy 基于自由参数简化总和
问题描述
我有一个同情的总和:
import sympy
x = sympy.IndexedBase('x')
n = sympy.symbols('n')
i = sympy.symbols('i', cls=sympy.Idx)
my_sum = sympy.summation(x[i], (i,1,n))
在我的各种计算中,我有时会得到嵌套的总和。有时,这些总和有“自由变量”,有时没有。例如,我可能会得到以下结果:
my_double_sum = sympy.summation(my_sum, (i,1,n))
现在,由于从外部总和的角度来看my_sum
没有“自由” ,那么这应该简化为:i
n*Sum(x[i], (i, 1, n))
但是,sympy.simplify(my_double_sum)
给出:
Sum(x[i], (i, 1, n), (i, 1, n))
我怎样才能sympy
智能地简化关于自由和指数的求和?
解决方案
这种行为确实看起来有点奇怪。这就是它发生的原因(看看底部什么是错误,什么不是)。
首先,summation
它只是创建Sum
和运行的语法糖.doit()
。Sum
的doit
使用在其余部分eval_sum
中,当限制变量不是函数的自由变量时提取限制边界,并且简单的检查表明这确实应该在这里成立!(正如你所展示的,它没有):
>>> i in my_sum.free_symbols
False
所以我对模块做了一些研究summation
。
现在,Sum
有一个叫AddWithLimits
. 在它的类创建器中,它使用了_common_new
对它接收到的函数进行嵌套的函数。
这变成Sum(Sum(x[i], (i, 1, n)), (i, 1, n))
(调用Sum(x[i], (i, 1, n), (i, 1, n))
之前doit
的方式),所以内部函数是x[i]
而不是Sum
你定义的对象my_sum
(乍一看不会弹出),所以限制变量实际上是函数的自由变量。
我尝试手动取消去嵌套,在评论下评论三行# denest any nested calls
,确实,我收到了
n*Sum(x[i], (i, 1, n))
当然,简单地改变它可能会损害代码的其他部分,因为在许多其他ExprWithLimits
函数中都假设了嵌套。这是否是一种预期的行为可以得到支持,但如果您认为应该涵盖它,则可能必须在内部明确指定它eval_sum
作为一种特殊情况。
但是,我希望与另一个变量的总和可以正常简化,例如
summation(x[i], (i, 1, n), (j, 1, n))
没有。我怀疑,这更像是一种预期的行为(这是因为第一次迭代eval_sum
返回None
,所以它跳过了j
符号扩展)。
推荐阅读
- javascript - Expressjs MVC 在路由器中无法让 listAll() 从猫鼬返回数据
- r - 在Stata中累计计算一个变量
- python - 如何让 python ruaml 保留长字符串?
- php - 使用 mktime 和 strtotime 的时间格式
- powershell - Powershell脚本交替启用禁用网卡
- ios - Obj-C - 以编程方式在视图中显示创建的图像视图?
- sql - 在 Postgres 中比较表和数组
- python - 为什么我的 for 循环会重写我正在循环的名称列表?
- r - 如何解决 tigris::call_geolocator() Internal Server Error (HTTP 500) 错误?
- python - 包含值的数据框不适用于“np.where”,并且存在 valueerror