Impliziten Dummy-Index definieren?
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
Ich denke, dass dies den Trick tun sollte.
Module[{idx = 0},
T[i_] := (idx += 1; a[i, Subscript[s, idx]] b[Subscript[s, idx]])
]
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