Définir un index factice implicite?
Je cherchais une solution à cette question depuis un moment. Je me demandais si quelqu'un était au courant d'un moyen de définir des indices factices symboliques pour implémenter la convention d'Einstein.
Laissez-moi vous expliquer avec un exemple. Je voudrais définir, par exemple, un objet avec un index, défini de cette façon (plus ou moins):
T[i_]:=a[i,something]b[something]
de sorte que, si j'appelle l'objet plusieurs fois, la variable "quelque chose" est toujours nommée d'une manière différente. Par exemple, je voudrais
T[i]T[i]
pour retourner quelque chose comme
a[i,symbol1]b[symbol1]a[i,symbol2]b[symbol2]
Quelqu'un connaît-il un moyen de mettre en œuvre cela?
Réponses
Je pense que cela devrait faire l'affaire.
Module[{idx = 0},
T[i_] := (idx += 1; a[i, Subscript[s, idx]] b[Subscript[s, idx]])
]
Vous pouvez envisager d'utiliser les capacités de tensor symbolique de Mathematica. Par exemple, définissez aêtre une matrice et bêtre un vecteur:
$Assumptions = a ∈ Matrices[{d,d}] && b ∈ Vectors[d];
Alors Test défini comme:
T = TensorContract[TensorProduct[a,b],{{2,3}}];
et T.Test:
res = TensorContract[TensorProduct[T, T], {{1, 2}}]
TensorContract [TensorProduct [TensorContract [TensorProduct [a, b], {{2, 3}}], TensorContract [TensorProduct [a, b], {{2, 3}}]], {{1, 2}}]
Cela peut être simplifié avec TensorReduce:
TensorReduce[res]
TensorContract [TensorProduct [a, a, b, b], {{1, 3}, {2, 6}, {4, 5}}]
Pour votre exemple particulier, il est possible d'utiliser le "ToTensor" et "FromTensor" et d'éviter / :ResourceFunctions TensorContractTensorProduct
T = a . b;
TensorReduce[T . T //ResourceFunction["ToTensor"]] //ResourceFunction["FromTensor"]
b.Transpose [a] .ab