Kronecker增量的符号简化和 [英] Sympy simplify sum of Kronecker delta
本文介绍了Kronecker增量的符号简化和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何以渐近形式简化Kronecker Delta表达式的和?
例如考虑Sum(KroneckerDelta(i,j),(i,0,n-1))
或Sum(KroneckerDelta(i, j, (0, n - 1)), (i, 0, n - 1))
:
from sympy import *
from sympy.concrete.delta import _simplify_delta
n = symbols('n')
j = tensor.Idx('j')
i = tensor.Idx('i')
_simplify_delta(simplify(Sum(KroneckerDelta(i,j),(i,0,n-1))))
_simplify_delta(simplify(Sum(KroneckerDelta(i,j,(0,n-1)),(i,0,n-1))))
输出Sum(KroneckerDelta(i, j), (i, 0, n - 1))
和Sum(KroneckerDelta(i, j, (0, n - 1)), (i, 0, n - 1))
如果j
被约束为介于0
和n-1
之间(我如何判断出现的症状?),则应该减少到1,这发生在i==j处。此外,如果求和比较复杂,我预计它会删除sum,并将sum变量i替换为变量j。
此外,我对KroneckerDelta函数的各种近似简化的资源感兴趣。我最近发现了如何在渐近中执行隐式矩阵微分,KroneckerDelta函数随处可见。
编辑:我找到了一个解决方案。它不是自动的。
我使用help(sympy.concrete.delta)
找到了simy.concrete.Delta中的更多函数。如果我们复制结果表达式并将Sum
替换为sympy.concrete.delta.deltasummation
,则会发生所需的简化。我仍然很好奇是否有一个Delta简化包可以自动尝试所有这些事情。
推荐答案
可以使用Sum().doit()
或summation
计算求和:
In [1]: from sympy import *
...: from sympy.concrete.delta import _simplify_delta
...:
...: n = symbols("n")
...: j = tensor.Idx("j")
...: i = tensor.Idx("i")
In [2]: s = Sum(KroneckerDelta(i, j), (i, 0, n - 1))
In [3]: s
Out[3]:
n - 1
___
╲
╲ δ
╱ i,j
╱
‾‾‾
i = 0
In [4]: s.doit()
Out[4]:
⎧1 for j ≥ 0 ∧ j ≤ n - 1
⎨
⎩0 otherwise
In [5]: summation(KroneckerDelta(i, j), (i, 0, n - 1))
Out[5]:
⎧1 for j ≥ 0 ∧ j ≤ n - 1
⎨
⎩0 otherwise
虽然您可以使用j = symbols('j', nonnegative=True)
来指定j>=0
,但目前还没有在假设中指定j<=n-1
的方法。您也可以手动将这些条件替换为True,例如:
In [8]: s.doit().subs({j >= 0: True, j <= n-1: True})
Out[8]: 1
给出KroneckerDelta
界限的第二个求和将自动计算:
In [11]: s2 = Sum(KroneckerDelta(i, j, (0, n - 1)), (i, 0, n - 1))
In [12]: s2
Out[12]:
n - 1
___
╲
╲ δ
╱ i,j
╱
‾‾‾
i = 0
In [13]: s2.doit()
Out[13]: 1
这篇关于Kronecker增量的符号简化和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文