如何与Sympy的条件相加?

时间:2017-09-06 22:55:01

标签: python sympy

抱歉,如果这听起来很愚蠢。我是Sympy的初学者,并且真的试图克服这一点。失败。所以这就是:

如果我这样做,例如:

>>> i, j = Dummy('i'), Dummy('j')
>>> N = symbols('N')
>>> expr = Sum(KroneckerDelta(i,j), (i,0,N))
>>> expr.doit()

我得到了

Piecewise((1, And(0 <= _j ,_j <= N)), (0, otherwise))

这意味着在给定条件下有两种不同的结果。 我的问题是:如果我确实知道第一个条件确实满足(0 <= j <= N),我怎么让Sympy知道它,所以它只输出第一个结果?

1 个答案:

答案 0 :(得分:1)

我不确定你是否在询问是否有一种方法可以定义j所以最终结果只是1或者如果你想知道如何使用你所知道的(j是非负的且小于或等于N)以使结果简化。

我不知道如何做前者,但后者可以做到。如果你知道条件是真的,你可以在结果中使用它:

>>> ans = expr.doit()

天真的方法是尝试按照你的看法进行替换,记住_j就是Dumm('j')的代表:

>>> ans.subs(And(0 <= j, j <= N), True)
Piecewise((1, (0 <= _j) & (_j <= N)), (0, True))

这不起作用,因为0是一个python整数,输入0 < j会将其变为j > 0并且无法识别替换。

>>> 0 < j
_j > 0

您也可以尝试用j替换为真正的值

>>> ans.subs(j,0)
Piecewise((1, 0 <= N), (0, True))

但这失败了,因为N可能是正面的,也可能是负面的。如果您知道N是非负的,那么您可以在开始时使用该假设创建它:

>>> N = var('N', nonnegative=True)
>>> expr = Sum(KroneckerDelta(i, j), (i, 0, N))
>>> ans = expr.doit()
>>> ans.subs(j, 0)
1

或者,您可以通过原子访问您知道的True表达式。你知道的条件是真的是和。我们可以得到一组出现在ans

中的所有Ands
>>> ans.atoms(Ans)
set([(0 <= _j) & (_j <= N)])

只有这一个,所以我们只是从集合中弹出它并在ans中用True替换它:

>>> ans.subs(_.pop(), True)
1

(如果有超过1个原子,则必须将该组转换为列表并使用索引选择您感兴趣的那个。)