Impliziten Dummy-Index definieren?

Aug 31 2020

Ich habe eine Weile nach einer Lösung für diese Frage gesucht. Ich habe mich gefragt, ob jemand eine Möglichkeit kennt, symbolische Dummy-Indizes zu definieren, um Einsteins Konvention umzusetzen.

Lassen Sie mich anhand eines Beispiels erklären. Ich möchte beispielsweise ein Objekt mit einem Index definieren, das so definiert ist (mehr oder weniger):

T[i_]:=a[i,something]b[something]

Wenn ich das Objekt mehrmals aufrufe, wird die Variable "etwas" immer anders benannt. Zum Beispiel möchte ich

T[i]T[i]

so etwas zurückgeben

a[i,symbol1]b[symbol1]a[i,symbol2]b[symbol2]

Kennt jemand einen Weg, dies umzusetzen?

Antworten

2 JaM Aug 31 2020 at 19:58

Ich denke, dass dies den Trick tun sollte.

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

Sie können die symbolischen Tensorfunktionen von Mathematica verwenden. Definieren Sie beispielsweise, dass aes sich um eine Matrix und beinen Vektor handelt:

$Assumptions = a ∈ Matrices[{d,d}] && b ∈ Vectors[d];

Dann Tist definiert als:

T = TensorContract[TensorProduct[a,b],{{2,3}}];

und T.Tist:

res = TensorContract[TensorProduct[T, T], {{1, 2}}]

TensorContract [TensorProduct [TensorContract [TensorProduct [a, b], {{2, 3}}], TensorContract [TensorProduct [a, b], {{2, 3}}], {{1, 2}}]

Dies kann vereinfacht werden mit TensorReduce:

TensorReduce[res]

TensorContract [TensorProduct [a, a, b, b], {{1, 3}, {2, 6}, {4, 5}}]

Für Ihr spezielles Beispiel ist es möglich, "ToTensor" und "FromTensor" zu verwenden und / zu vermeiden :ResourceFunctions TensorContractTensorProduct

T = a . b;
TensorReduce[T . T //ResourceFunction["ToTensor"]] //ResourceFunction["FromTensor"]

b.Transponieren [a] .ab