我不确定您是否要问是否有一种方法可以定义 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 的确切表达式。您知道为真的条件是 And。我们可以得到一组所有出现在ans中的Ands
>>> ans.atoms(Ans)
set([(0 <= _j) & (_j <= N)])
只有这个,所以我们只需从集合中弹出它并在ans中将其替换为True:
>>> ans.subs(_.pop(), True)
1
(如果有超过 1 个原子,则必须将集合转换为列表并使用索引来选择您感兴趣的原子。)