Logaritmo de matrices singulares
Quería calcular la siguiente cantidad:
$X=Tr[\rho_1 \log[\rho_2]]$,
como en la entropía relativa . Aquí,$\rho_1, \rho_2$ son matrices semidefinidas positivas con soporte no ortogonal (para que la cosa no diverja - términos como $0 \log[0]$ debe llevarse a cero, que es una suposición estándar) y $Tr$ es rastro.
Hay una pregunta SE similar , la función dada
MatrixLogSafe[x_] := MatrixFunction[Piecewise[{{Log[#1], #1 > 0}}] &, x]
que debería tratar con el logaritmo matricial, se comporta, sin embargo, extraño.
Por ejemplo, supongo que $\rho_1 =\rho_2 =\{\{0.33,0,0\},\{0,0,0\},\{0,0,0.66\}\}$. La cantidad$X$ entonces debería ser
$X=0.33 \log[0.33] + 0.66 \log[0.66]= -0.640099$.
Sin embargo, el uso de MatriLogSafe en la definición da una salida diferente:
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
El problema es que MatrixLogSafe a veces "cambia los vectores propios",
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}}
(entonces $\log[0.33]= -1.10866$ y $\log[0.66]=-0.415515$, pero la salida debe ser {{-1.10866, 0, 0.}, {0., 0., 0.}, {0., 0., - 0.415515}}).
(De alguna manera creo que el problema es que yo uso valores numéricos, pero quiero que la función funcione tanto para números numéricos como "exactos" (?))
¿Cómo se puede arreglar?
He considerado la respuesta dada por Carl Woll, sin embargo, todavía algo no funciona. En particular, considere dos matrices,$\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}}
y $\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])}}
que son quizás feos, pero ambos son hermitianos y positivos-semi-definidos.
Me pongo muy complejo $X$ ($X=densityTrace[\rho_1,\rho_2]=-0.0019613 + 0.393667 I$), ¡que no puede ser!
Sin embargo, si calculo primero las matrices numéricas, obtengo un resultado real $densityTrace[N[\rho_1],N[\rho_2]]=-0.0432473$ (?!)
He cambiado ligeramente la definición de densidad.
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, λ}]
]
(agregando Chop), para deshacerse de un pequeño "desperdicio" imaginario, ¿es una buena idea?
Respuestas
Tal vez puedas usar Eigensystempara transformar tu matriz singular$\rho_2$ dentro $S.d.S^{-1}$y luego use la propiedad cíclica de Tr. Es decir:
$$ \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} $$
Algún código que implementa esta 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, λ}]
]
Para sus matrices de ejemplo:
m1 = m2 = DiagonalMatrix[{.33, 0, .66}];
densityTrace[m1, m2]
-0,640099
Probablemente sea más fácil detectar la singularidad antes:
MatrixLogSafe[x_?SquareMatrixQ] /; Det[x] > 0 := MatrixLog[x];
MatrixLogSafe[x_?SquareMatrixQ] := ConstantArray[0, Dimensions[x]];
Podría estar equivocado sobre la condición exacta que necesita. En cualquier caso, no espero MatrixFunction[Piecewise[...]]que le sirva de mucho. Ni siquiera estoy seguro de qué # > 0se supone que debe hacer la condición en el interior MatrixFunction.