특이 행렬의 로그

Sep 19 2020

다음 수량을 계산하고 싶었습니다.

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

상대 엔트로피 에서와 같이 . 여기,$\rho_1, \rho_2$ 비 직교 지원을 가진 양의 반정의 행렬입니다 (물건이 갈라지지 않도록-용어는 $0 \log[0]$ 표준 가정 인 0으로 설정해야 함) 및 $Tr$ 추적입니다.

비슷한 SE 질문이 있습니다 , 주어진 기능

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

행렬 로그를 처리해야하지만 이상하게 작동합니다.

예를 들어 나는 $\rho_1 =\rho_2 =\{\{0.33,0,0\},\{0,0,0\},\{0,0,0.66\}\}$. 수량$X$ 그러면

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

그러나 정의에서 MatriLogSafe를 사용하면 다른 출력이 제공됩니다.

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

문제는 MatrixLogSafe가 때때로 "고유 벡터를 전환"한다는 것입니다.

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

(그래서 $\log[0.33]= -1.10866$ 과 $\log[0.66]=-0.415515$이지만 출력은 {{-1.10866, 0, 0.}, {0., 0., 0.}, {0., 0.,-0.415515}})이어야합니다.

(어쨌든 문제는 숫자 값을 사용한다는 것이지만 함수가 숫자와 "정확한"(?) 숫자 모두에 대해 작동하기를 원합니다)

어떻게 고칠 수 있습니까?


Carl Woll의 답변을 고려했지만 여전히 작동하지 않습니다. 특히 두 개의 행렬을 고려하십시오.$\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}}

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

추악 할 수도 있지만 둘 다 에르 미트 식이고 양의 반 정확성입니다.

아무리 복잡해져 $X$ ($X=densityTrace[\rho_1,\rho_2]=-0.0019613 + 0.393667 I$) 일 수 없습니다!

그러나 먼저 수치 행렬을 계산하면 실제 출력을 얻습니다. $densityTrace[N[\rho_1],N[\rho_2]]=-0.0432473$ (?!)

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

]

(Chop 추가), 아주 작은 가상의 "쓰레기"를 제거하는 것이 좋은 생각입니까?

답변

5 CarlWoll Sep 20 2020 at 00:29

Eigensystem특이 행렬을 변환 하는 데 사용할 수 있습니다.$\rho_2$ 으로 $S.d.S^{-1}$을 클릭 한 다음의 순환 속성을 사용합니다 Tr. 그건:

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

이 아이디어를 구현하는 일부 코드 :

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

예제 행렬의 경우 :

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

-0.640099

2 SjoerdSmit Sep 18 2020 at 22:43

더 일찍 특이점을 감지하는 것이 더 쉬울 것입니다.

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

나는 당신이 필요로하는 정확한 상태에 대해 틀릴 수 있습니다. 어쨌든, 나는 MatrixFunction[Piecewise[...]]당신이별로 좋은 일을 할 것이라고 기대하지 않습니다 . 에서 조건 # > 0이 무엇을해야하는지조차 모르겠습니다 MatrixFunction.