我试图在考虑假设的情况下评估某个表达式。具体来说,我的问题与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()
答案 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作为结果。