Sympy:使用"假设"评估Piecewise,特别是IndexedBase

时间:2016-09-02 19:34:25

标签: sympy evaluation

我试图在考虑假设的情况下评估某个表达式。具体来说,我的问题与indexedBase对象有关。

请参阅以下代码:

from sympy import *
init_printing(use_latex="mathjax")


ntot = symbols("n_tot", integer = True)
i = Idx("i",(1,ntot))
k = Idx("k", (1,ntot))
j = Idx("j",(1,ntot))
x = IndexedBase("x")

作为一个例子,让我们在x [i]上得到两个求和的导数。

expr = Sum(Sum(x[i],(i,1,ntot)),(k,1,ntot)).diff(x[j])

注意:这在当前的SymPy版本1.0中是不可能的,可以使用开发版本,并且将在未来的SymPy稳定版本中使用。)

我想评估表达式并得到一个分段答案:

print(expr.doit())
OUTPUT: n_tot*Piecewise((1, And(1 <= j, j <= n_tot)), (0, True))

所以我的问题是,我怎么能告诉同意我确定j在1和ntot之间。所以我的结果是1:

我试过以下但没有运气:

with assuming(j==2):
     expr=Sum(Sum(x[i],(i,1,ntot)),(k,1,ntot)).diff(x[j]).doit()

1 个答案:

答案 0 :(得分:3)

关于不平等的假设是SymPy中一个非常缺失的特征。

从技术上讲,创建Idx对象是为了允许符号包含定义范围,以便对索引符号设置限制。您的j已有此信息:

In [28]: j.upper
Out[28]: n_tot

In [29]: j.lower
Out[29]: 1

不幸的是,不等式类并不意味着处理Idx个对象,所以它的范围被忽略了。

你真的可以尝试:

In [32]: simplify(expr.doit()).args[0][0]
Out[32]: n_tot

这会手动提取Piecewise表达式的第一个术语。

显然,当前的算法需要改进,它应该告诉Sum j在正确的范围内,以便给出1作为结果。