Logaritma matriks tunggal
Saya ingin menghitung kuantitas berikut:
$X=Tr[\rho_1 \log[\rho_2]]$,
seperti dalam entropi relatif . Sini,$\rho_1, \rho_2$ adalah matriks semidefinite positif dengan dukungan non-ortogonal (sehingga hal tersebut tidak menyimpang - istilah seperti $0 \log[0]$ harus dibawa ke nol, yang merupakan asumsi standar) dan $Tr$ adalah jejak.
Ada pertanyaan SE serupa , fungsi yang diberikan
MatrixLogSafe[x_] := MatrixFunction[Piecewise[{{Log[#1], #1 > 0}}] &, x]
yang harus berurusan dengan logaritma matriks, namun berperilaku aneh.
Untuk mantan saya berasumsi bahwa $\rho_1 =\rho_2 =\{\{0.33,0,0\},\{0,0,0\},\{0,0,0.66\}\}$. Kuantitas$X$ seharusnya
$X=0.33 \log[0.33] + 0.66 \log[0.66]= -0.640099$.
Namun, menggunakan MatriLogSafe dalam definisi memberikan hasil yang berbeda:
In[402]:= Tr[{{0.33, 0, 0}, {0, 0, 0}, {0, 0, 0.66}}.MatrixLogSafe[{{0.33, 0, 0}, {0, 0, 0}, {0, 0, 0.66}}]]
Out[402]= -0.731717
Masalahnya adalah, MatrixLogSafe terkadang "mengalihkan vektor eigen",
In[403]:= MatrixLogSafe[{{0.33, 0, 0}, {0, 0, 0}, {0, 0, 0.66}}]
Out[403]= {{0., 0., 0.}, {0., -0.415515, 0.}, {0., 0., -1.10866}}
(begitu $\log[0.33]= -1.10866$ dan $\log[0.66]=-0.415515$, tetapi outputnya harus {{-1.10866, 0, 0.}, {0., 0., 0.}, {0., 0., - 0.415515}}).
(Entah bagaimana menurut saya masalahnya adalah saya menggunakan nilai numerik, tetapi saya ingin fungsi tersebut berfungsi untuk angka numerik dan "tepat" (?))
Bagaimana cara memperbaikinya?
Saya telah mempertimbangkan jawaban yang diberikan oleh Carl Woll, namun masih ada yang tidak berfungsi. Secara khusus, pertimbangkan dua matriks,$\rho_1$:
{{1/4, 1/4 E^(-((I \[Pi])/10)), 1/4 E^(-((I \[Pi])/10)), 1/
4}, {1/4 E^((I \[Pi])/10), 1/4, 1/4,
1/4 E^((I \[Pi])/10)}, {1/4 E^((I \[Pi])/10), 1/4, 1/4,
1/4 E^((I \[Pi])/10)}, {1/4, 1/4 E^(-((I \[Pi])/10)),
1/4 E^(-((I \[Pi])/10)), 1/4}}
dan $\rho_2$:
{{1/4 (1 - 1/Sqrt[E]) + 1/(4 Sqrt[E]),
1/4 E^(-(1/2) - (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10)),
1/4 E^(-(1/2) - (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10)),
1/(4 Sqrt[
E]) + (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10))^2}, {1/4 E^(-(1/2) + (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10)), 1/4 (1 - 1/Sqrt[E]) + 1/(4 Sqrt[E]),
1/(4 Sqrt[
E]) + (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10))^2,
1/4 E^(-(1/2) + (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10))}, {1/4 E^(-(1/2) + (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10)),
1/(4 Sqrt[
E]) + (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10))^2, 1/4 (1 - 1/Sqrt[E]) + 1/(4 Sqrt[E]),
1/4 E^(-(1/2) + (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10))}, {1/(
4 Sqrt[E]) + (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10))^2,
1/4 E^(-(1/2) - (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10)),
1/4 E^(-(1/2) - (I \[Pi])/10) +
1/2 (1 - 1/Sqrt[E]) (1/4 E^(-((I \[Pi])/10)) +
1/4 E^((I \[Pi])/10)), 1/4 (1 - 1/Sqrt[E]) + 1/(4 Sqrt[E])}}
yang mungkin jelek, tetapi keduanya Hermitian dan positif-semi-pasti.
Saya menjadi bagaimanapun kompleks $X$ ($X=densityTrace[\rho_1,\rho_2]=-0.0019613 + 0.393667 I$), yang tidak mungkin!
Namun, jika saya menghitung terlebih dahulu matriks numerik saya mendapatkan keluaran nyata $densityTrace[N[\rho_1],N[\rho_2]]=-0.0432473$ (?!)
Saya telah sedikit mengubah definisi densityTrace
densityTrace[a_, b_] := Module[{λ, S, d},
{λ, S} = Eigensystem[b];
S = Transpose[S];
d = Diagonal[Inverse[S]. a. S];
Total @ MapThread[If[Chop[#1]==0,0,Chop[#1] Log[Chop[#2]]]&, {d, λ}]
]
(menambahkan Chop), untuk membuang beberapa "limbah" imajiner yang sangat kecil, apakah itu ide yang bagus?
Jawaban
Mungkin Anda bisa menggunakan Eigensystemuntuk mengubah matriks tunggal Anda$\rho_2$ ke $S.d.S^{-1}$, lalu gunakan properti siklis Tr. Itu adalah:
$$ \begin{align} \text{Tr}{\left(\rho_1 . \log(\rho_2) \right)}&= \text{Tr}{\left(\rho_1 . \log(S . d . S^{-1})\right)} \\ &= \text{Tr}{\left(\rho_1 . S . \log(d) . S^{-1} \right)}\\ &= \text{Tr}{\left(S^{-1} . \rho_1 . S . \log(d)\right)}\\ &= \text{Diagonal}{\left( S^{-1} . \rho_1 . S\right) . \log (d)} \end{align} $$
Beberapa kode yang mengimplementasikan ide ini:
densityTrace[a_, b_] := Module[{λ, S, d},
{λ, S} = Eigensystem[b];
S = Transpose[S];
d = Diagonal[Inverse[S]. a. S];
Total @ MapThread[If[#1==0,0,#1 Log[#2]]&, {d, λ}]
]
Untuk matriks contoh Anda:
m1 = m2 = DiagonalMatrix[{.33, 0, .66}];
densityTrace[m1, m2]
-0,640099
Mungkin lebih mudah untuk mendeteksi singularitas lebih awal:
MatrixLogSafe[x_?SquareMatrixQ] /; Det[x] > 0 := MatrixLog[x];
MatrixLogSafe[x_?SquareMatrixQ] := ConstantArray[0, Dimensions[x]];
Saya bisa saja salah tentang kondisi persis yang Anda butuhkan. Bagaimanapun, saya tidak berharap MatrixFunction[Piecewise[...]]banyak membantu Anda. Saya bahkan tidak yakin apa kondisi # > 0yang seharusnya dilakukan di dalam MatrixFunction.