Définir un index factice implicite?

Aug 31 2020

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

2 JaM Aug 31 2020 at 19:58

Je pense que cela devrait faire l'affaire.

Module[{idx = 0},
 T[i_] := (idx += 1; a[i, Subscript[s, idx]] b[Subscript[s, idx]])
 ]
3 CarlWoll Aug 31 2020 at 22:45

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