Tentukan indeks tiruan implisit?

Aug 31 2020

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

2 JaM Aug 31 2020 at 19:58

Saya pikir ini harus melakukan trik.

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

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