Tentukan indeks tiruan implisit?
Saya sudah mencari solusi untuk pertanyaan ini untuk sementara waktu. Saya bertanya-tanya apakah ada yang mengetahui cara mendefinisikan indeks boneka simbolis untuk mengimplementasikan konvensi Einstein.
Izinkan saya menjelaskan dengan sebuah contoh. Saya ingin mendefinisikan, katakanlah, sebuah objek dengan satu indeks, didefinisikan dengan cara ini (kurang lebih):
T[i_]:=a[i,something]b[something]
Sehingga, jika saya memanggil objek beberapa kali, variabel "sesuatu" selalu dinamai dengan cara yang berbeda. Misalnya, saya ingin
T[i]T[i]
untuk mengembalikan sesuatu seperti
a[i,symbol1]b[symbol1]a[i,symbol2]b[symbol2]
Apakah ada yang tahu cara menerapkan ini?
Jawaban
Saya pikir ini harus melakukan trik.
Module[{idx = 0},
T[i_] := (idx += 1; a[i, Subscript[s, idx]] b[Subscript[s, idx]])
]
Anda dapat mempertimbangkan untuk menggunakan kapabilitas tensor simbolik Mathematica. Misalnya, definisikan amenjadi matriks dan bmenjadi vektor:
$Assumptions = a ∈ Matrices[{d,d}] && b ∈ Vectors[d];
Kemudian Tdidefinisikan sebagai:
T = TensorContract[TensorProduct[a,b],{{2,3}}];
dan T.Tadalah:
res = TensorContract[TensorProduct[T, T], {{1, 2}}]
TensorContract [TensorProduct [TensorContract [TensorProduct [a, b], {{2, 3}}], TensorContract [TensorProduct [a, b], {{2, 3}}]], {{1, 2}}]
Ini dapat disederhanakan dengan TensorReduce:
TensorReduce[res]
TensorContract [TensorProduct [a, a, b, b], {{1, 3}, {2, 6}, {4, 5}}]
Untuk contoh khusus Anda, dimungkinkan untuk menggunakan "ToTensor" dan "FromTensor" dan menghindari / :ResourceFunctions TensorContractTensorProduct
T = a . b;
TensorReduce[T . T //ResourceFunction["ToTensor"]] //ResourceFunction["FromTensor"]
b. Ubah urutan [a] .ab