本文介绍了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增量的符号简化和
发布评论