Logaritmo di matrici singolari
Volevo calcolare la seguente quantità:
$X=Tr[\rho_1 \log[\rho_2]]$,
come nell'entropia relativa . Qui,$\rho_1, \rho_2$ sono matrici semidefinite positive con supporto non ortogonale (in modo che la cosa non diverga - termini come $0 \log[0]$ dovrebbe essere portato a zero, che è un'ipotesi standard) e $Tr$ è traccia.
C'è una domanda SE simile , la funzione data
MatrixLogSafe[x_] := MatrixFunction[Piecewise[{{Log[#1], #1 > 0}}] &, x]
che dovrebbe fare i conti con il logaritmo della matrice, si comporta però in modo strano.
Per esempio lo presumo $\rho_1 =\rho_2 =\{\{0.33,0,0\},\{0,0,0\},\{0,0,0.66\}\}$. La quantità$X$ dovrebbe quindi essere
$X=0.33 \log[0.33] + 0.66 \log[0.66]= -0.640099$.
Tuttavia, l'utilizzo di MatriLogSafe nella definizione fornisce un output diverso:
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
Il problema è che MatrixLogSafe a volte "cambia gli autovettori",
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}}
(così $\log[0.33]= -1.10866$ e $\log[0.66]=-0.415515$, ma l'output dovrebbe essere {{-1.10866, 0, 0.}, {0., 0., 0.}, {0., 0., - 0.415515}}).
(In qualche modo penso che il problema sia che uso valori numerici, ma voglio che la funzione funzioni sia per numeri numerici che "esatti" (?))
Come si può rimediare?
Ho considerato la risposta data da Carl Woll, tuttavia ancora qualcosa non funziona. In particolare, si considerano due matrici,$\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}}
e $\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])}}
che sono forse brutti, ma entrambi sono ermitiani e positivi-semi-definiti.
Divento comunque complesso $X$ ($X=densityTrace[\rho_1,\rho_2]=-0.0019613 + 0.393667 I$), che non può essere!
Tuttavia, se calcolo prima le matrici numeriche ottengo un output reale $densityTrace[N[\rho_1],N[\rho_2]]=-0.0432473$ (?!)
Ho leggermente cambiato la definizione di 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, λ}]
]
(aggiungendo Chop), per sbarazzarsi di qualche piccolissimo "spreco" immaginario, è una buona idea?
Risposte
Forse puoi usare Eigensystemper trasformare la tua matrice singolare$\rho_2$ in $S.d.S^{-1}$, quindi utilizza la proprietà ciclica di Tr. Questo è:
$$ \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} $$
Un po 'di codice che implementa questa idea:
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, λ}]
]
Per le tue matrici di esempio:
m1 = m2 = DiagonalMatrix[{.33, 0, .66}];
densityTrace[m1, m2]
-0.640099
Probabilmente è più facile rilevare la singolarità prima:
MatrixLogSafe[x_?SquareMatrixQ] /; Det[x] > 0 := MatrixLog[x];
MatrixLogSafe[x_?SquareMatrixQ] := ConstantArray[0, Dimensions[x]];
Potrei sbagliarmi sulla condizione esatta di cui hai bisogno. In ogni caso, non mi aspetto MatrixFunction[Piecewise[...]]di farti molto bene. Non sono nemmeno sicuro di cosa # > 0dovrebbe fare la condizione all'interno di MatrixFunction.