首页 > 解决方案 > 在 sympy 中与克罗内克三角洲签约

问题描述

我正在尝试在 sympy 中进行一些张量计算,但我似乎无法让它简化针对克罗内克三角洲的任何张量收缩,即最小示例:

from sympy import *

n = Idx('n')
i = Idx('i',(1,n))
j = Idx('j',(1,n))

x = IndexedBase('x')
print(Sum(KroneckerDelta(i,j)*x[j],(j,1,n)))

这里,n 是空间的维度,i,j 是从 1 到 n 的索引。你会期望总和计算为 x[i],除了 sympy 不做任何简化,尽管使用了简化命令

标签: pythonsympy

解决方案


我想我在发布类似问题时找到了您问题的解决方案

你想要的是sympy.concrete.delta.deltasummation代替Sum

print(sympy.concrete.delta.deltasummation(KroneckerDelta(i,j)*x[j],(j,1,n)))
>>> Piecewise((x[i], (n >= i) & (i >= 1)), (0, True))

如果 KronckerDelta 函数指定了界限,这将进一步简化

print(sympy.concrete.delta.deltasummation(KroneckerDelta(i,j,(1,n))*x[j],(j,1,n)))
>>> x[i]

不幸的是,我不知道如何用 deltasummation 自动替换 Sum,但至少这对您来说是一个起点。

还有一些其他的简化可以在sympy.concretesympy.concrete.delta

编辑:链接到我有点相关的问题Sympy 简化 Kronecker delta 的总和


推荐阅读