Logarytm osobliwych macierzy

Sep 19 2020

Chciałem obliczyć następującą ilość:

$X=Tr[\rho_1 \log[\rho_2]]$,

jak we względnej entropii . Tutaj,$\rho_1, \rho_2$ są dodatnimi półskończonymi macierzami z nieortogonalnym wsparciem (aby rzecz się nie rozchodziła - terminy takie jak $0 \log[0]$ należy przyjąć zero, co jest standardowym założeniem) i $Tr$ jest ślad.

Jest podobne pytanie SE , dana funkcja

MatrixLogSafe[x_] := MatrixFunction[Piecewise[{{Log[#1], #1 > 0}}] &, x]

który powinien zajmować się logarytmem macierzy, zachowuje się jednak dziwnie.

Na przykład zakładam, że $\rho_1 =\rho_2 =\{\{0.33,0,0\},\{0,0,0\},\{0,0,0.66\}\}$. Ilość$X$ powinno być

$X=0.33 \log[0.33] + 0.66 \log[0.66]= -0.640099$.

Jednak użycie MatriLogSafe w definicji daje inne wyniki:

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

Problem w tym, że MatrixLogSafe czasami „przełącza wektory własne”,

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}}

(więc $\log[0.33]= -1.10866$ i $\log[0.66]=-0.415515$, ale wynik powinien wynosić {{-1.10866, 0, 0}, {0, 0, 0}, {0, 0., - 0,415515}}).

(Jakoś wydaje mi się, że problem polega na tym, że używam wartości liczbowych, ale chcę, aby funkcja działała zarówno dla liczb liczbowych, jak i „dokładnych” (?))

Jak to naprawić?


Rozważyłem odpowiedź udzieloną przez Carla Woll, jednak nadal coś nie działa. W szczególności rozważ dwie macierze,$\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}}

i $\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])}}

które mogą być brzydkie, ale obaj są hermitami i pół-pewni pozytywnie.

Staję się jednak skomplikowany $X$ ($X=densityTrace[\rho_1,\rho_2]=-0.0019613 + 0.393667 I$), co nie może być!

Jeśli jednak najpierw obliczymy macierze numeryczne, otrzymam rzeczywisty wynik $densityTrace[N[\rho_1],N[\rho_2]]=-0.0432473$ (?!)

Nieznacznie zmieniłem definicję 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, λ}]

]

(dodaje Chop), aby pozbyć się bardzo małych wyimaginowanych „odpadów”, czy to dobry pomysł?

Odpowiedzi

5 CarlWoll Sep 20 2020 at 00:29

Może możesz użyć Eigensystemdo przekształcenia swojej pojedynczej macierzy$\rho_2$ w $S.d.S^{-1}$, a następnie użyj cyklicznej właściwości Tr. To jest:

$$ \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} $$

Kod, który implementuje ten pomysł:

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, λ}]
]

Na przykład macierze:

m1 = m2 = DiagonalMatrix[{.33, 0, .66}];
densityTrace[m1, m2]

-0,640099

2 SjoerdSmit Sep 18 2020 at 22:43

Prawdopodobnie łatwiej jest wcześniej wykryć osobliwość:

MatrixLogSafe[x_?SquareMatrixQ] /; Det[x] > 0 := MatrixLog[x];
MatrixLogSafe[x_?SquareMatrixQ] := ConstantArray[0, Dimensions[x]];

Mogę się mylić co do dokładnego stanu, którego potrzebujesz. W każdym razie nie spodziewam MatrixFunction[Piecewise[...]]się, że zrobię ci wiele dobrego. Nie jestem nawet pewien, co ten stan # > 0ma robić w środku MatrixFunction.