Python 如何在同态上求和?

Python 如何在同态上求和?,python,sympy,Python,Sympy,如果这听起来很愚蠢,我很抱歉。我是Sympy的初学者,我真的试着克服它。失败。下面是: 如果我这样做,例如: >>> i, j = Dummy('i'), Dummy('j') >>> N = symbols('N') >>> expr = Sum(KroneckerDelta(i,j), (i,0,N)) >>> expr.doit() 我明白了 分段((1,和(0我不确定您是否询问是否有一种方法可以定义j,以便最终结果

如果这听起来很愚蠢,我很抱歉。我是Sympy的初学者,我真的试着克服它。失败。下面是:

如果我这样做,例如:

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


分段((1,和(0我不确定您是否询问是否有一种方法可以定义j,以便最终结果仅为1,或者您是否想知道如何使用您知道的(j为非负且小于或等于N)来简化结果

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

>>> ans = expr.doit()
最简单的方法是尝试按照您看到的方式进行替换,记住
\u j
正是Dumm('j')的表示方式:

>>> ans.subs(And(0 <= j, j <= N), True)
Piecewise((1, (0 <= _j) & (_j <= N)), (0, True))
您还可以尝试用一个值替换j,使其为真

>>> ans.subs(j,0)
Piecewise((1, 0 <= N), (0, True))
或者,你可以通过原子访问你知道是真的精确表达式。你知道是真的条件是And。我们可以得到ans中出现的所有And的集合

>>> ans.atoms(Ans)
set([(0 <= _j) & (_j <= N)])

(如果有多个atom,您必须将集合转换为列表,并使用索引选择您感兴趣的原子。)

我当时确实在问您的答案。非常感谢!
>>> ans.subs(j,0)
Piecewise((1, 0 <= N), (0, True))
>>> N = var('N', nonnegative=True)
>>> expr = Sum(KroneckerDelta(i, j), (i, 0, N))
>>> ans = expr.doit()
>>> ans.subs(j, 0)
1
>>> ans.atoms(Ans)
set([(0 <= _j) & (_j <= N)])
>>> ans.subs(_.pop(), True)
1