2017-10-05 3 views
0

Je tente de créer une expression symbolique en sommant des indices dans un tenseur. Pour une matrice/tenseur 2D c'est assez simple:Summation sur indices de symarray

from sympy import * 

Q = MatrixSymbol('Q', 2,2) 

i,j = symbols('i j') 
summation(summation(Q[i,j],(i,0,2)),(j,0,2)) 

Lorsque je tente de regarder un tenseur du quatrième ordre que je suis en cours d'exécution sur les questions. Voici ma tentative:

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)) 

Toute aide serait grandement appréciée.

Répondre

0

C = sym.symarray('C', (2,2,2,2)) fait C un tableau NumPy de symboles SymPy. Depuis C lui-même n'est pas un symbole SymPy, NumPy rechigne lorsqu'il rencontre l'indexation symbolique comme C[i,j,k,l].

Pour surmonter ce problème, faire un 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))) 

rendements

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] 

Par ailleurs, sym.summation(..., (i,0,2)) sommes plus i égale En d'autres termes, à la différence des plages semi-ouvertes de Python, la plage de sym.signature est inclusive aux deux extrémités.

C = sym.symarray('C', (2,2,2,2)) crée un tableau 4 dimensions avec chaque dimension de la longueur 2. Ainsi C ne peut être indexé avec 0 et 1, mais pas 2. Donc, pour éviter l'indice hors plage Erreur:

ValueError: Index [0, 0, 2, 0] out of border 

utilisez sym.summation(..., (i,0,1)).

+0

Merci pour votre aide et corrections. Malheureusement, j'ai encore quelques problèmes. J'utilise python 3 que j'aurais probablement dû mentionner. Il semble que Array n'est plus un attribut de tensoriel; cependant, il existe un paquet de tableau dans le tenseur. J'ai importé ce paquet puis j'ai utilisé Array (C) comme vous l'avez suggéré. Le reste du code est identique au vôtre. Je reçois toujours une erreur cependant: "ne peut pas déterminer la valeur de vérité de relationnel". Je devrais mentionner que j'ai également essayé la commande NDimArray dans le paquet de tableau. – John

+0

J'ai fini par utiliser symarray et définir manuellement la somme des boucles. Éviter la commande de sommation semblait faire l'affaire. Merci encore pour votre aide. – John