我试图通过对张量中的索引求和来创建符号表达式。对于矩阵/ 2D张量,这非常简单:
from sympy import *
Q = MatrixSymbol('Q', 2,2)
i,j = symbols('i j')
summation(summation(Q[i,j],(i,0,2)),(j,0,2))
当我试着看一个四阶张量时,我遇到了问题。这是我的尝试:
from sympy import *
Q = MatrixSymbol('Q', 2,2)
C = symarray('C', (2,2,2,2))
i,j,k,l = symbols('i j k l')
summation(summation(summation(summation(Q[i,j]*C[i,j,k,l],(i,0,2)),(j,0,2)),(k,0,2)),(l,0,2))
非常感谢任何帮助。
答案 0 :(得分:0)
C = sym.symarray('C', (2,2,2,2))
使C
成为NumPy SymPy符号数组。
由于C
本身不是SymPy符号,因此当NumPy遇到符号索引(如C[i,j,k,l]
)时会发现它。
要解决此问题,请将C
设为SymPy NDimArray:
C = sym.tensor.Array(C)
import sympy as sym
Q = sym.MatrixSymbol('Q', 2,2)
C = sym.symarray('C', (2,2,2,2))
i,j,k,l = sym.symbols('i j k l')
C = sym.tensor.Array(C)
print(sym.summation(Q[i,j]*C[i,j,k,l], (i,0,1), (j,0,1), (k,0,1), (l,0,1)))
产量
C_0_0_0_0*Q[0, 0] + C_0_0_0_1*Q[0, 0] + C_0_0_1_0*Q[0, 0] + C_0_0_1_1*Q[0, 0] + C_0_1_0_0*Q[0, 1] + C_0_1_0_1*Q[0, 1] + C_0_1_1_0*Q[0, 1] + C_0_1_1_1*Q[0, 1] + C_1_0_0_0*Q[1, 0] + C_1_0_0_1*Q[1, 0] + C_1_0_1_0*Q[1, 0] + C_1_0_1_1*Q[1, 0] + C_1_1_0_0*Q[1, 1] + C_1_1_0_1*Q[1, 1] + C_1_1_1_0*Q[1, 1] + C_1_1_1_1*Q[1, 1]
顺便说一下,sym.summation(..., (i,0,2))
总和i
等于0,1,和 2。
换句话说,与Python的半开放范围不同,sym.summation
范围包括两端。
C = sym.symarray('C', (2,2,2,2))
创建一个4维数组,每个维度的长度为2.所以C
只能用0和1索引,但不能用2索引。所以要避免索引不在范围错误:
ValueError: Index [0, 0, 2, 0] out of border
使用sym.summation(..., (i,0,1))
。