Generieren einer Zufallsdichtematrix in Mathematica

Sep 19 2020

Ich bin daran interessiert, mit Mathematica zufällig zu generieren $N\times N$Dichtematrizen, die reine Quantenzustände beschreiben; Für die weniger physikorientierten Leute ist eine Dichtematrix positiv, halbbestimmt, selbstadjunkt, hat Spuren$1$ und beschreibt einen reinen Zustand, wenn er auch idempotent ist.

Kennt jemand eine schnelle Implementierung?

Antworten

4 WReach Sep 19 2020 at 23:22

Ein Ansatz besteht darin, mit einem zufälligen reinen Zustand zu beginnen und dann in diesem Zustand eine Dichtematrix zu bilden:

randomPureState[n_] := RandomComplex[{-1-I, 1+I}, n] // Normalize
singleStateDensityMatrix[state_] := Outer[Times, state, Conjugate[state]]

randomPureDensityMatrix[n_] := singleStateDensityMatrix @ randomPureState @ n

Wir können auch einen Gültigkeitstest definieren:

test[m_] :=
  <| "Hermitian" -> HermitianMatrixQ[m]
   , "PosSemiDef" -> PositiveSemidefiniteMatrixQ[m]
   , "Trace1" -> Tr[m]==1
   , "Idempotent" -> AllTrue[Chop[m.m-m], # == 0 &, 2]
   |> // <| #, "Valid" -> And@@# |> &

Also dann:

SeedRandom[1]
$m = randomPureDensityMatrix[4] $m // MatrixForm

test[$m]
(*
<|"Hermitian"->True,"PosSemiDef"->True,"Trace1"->True,"Idempotent"->True,"Valid"->True|>
*)
AllTrue[Table[randomPureDensityMatrix[4], 100000], test[#]["Valid"] &]
(* True *)

Vorsichtsmaßnahmen

Die vorliegende Definition von randomPureStatevernachlässigt die äußerst geringe Möglichkeit, einen ungültigen Nullzustand zu erzeugen. Es bleibt dem Leser überlassen, diese Prüfung gegebenenfalls hinzuzufügen.

Ist auch randomPureStatesimpel und erzeugt keine Zustände gleichmäßig über den Zustandsraum. Wenn Einheitlichkeit gewünscht wird, sollte man ausgefeiltere Methoden anwenden. Siehe zum Beispiel Generieren und Verwenden von wirklich zufälligen Quantenzuständen in Mathematica (Miszczak 2011).

3 flinty Sep 19 2020 at 20:44

Dies scheint Matrizen zu erzeugen, die alle gewünschten Eigenschaften erfüllen:

randomDensityMatrix[n_] := Module[{m, m2,
    (* You could also use RandomComplex here instead *)
    W = RandomReal[{-1, 1}, {n, n}],
    (* matrix with a single 1 on the diagonal and zero elsewhere *)
    V = SparseArray[({#, #} -> 1) &@RandomInteger[{1, n}], {n, n}]
  },
  m = Inverse[W].V.W;
  (* force the trace to be 1 *)
  m2 = #/Tr[#] &@(m.Transpose[m]);
  (* check it satisfies all desired properties *)
  Assert[m2.m2 == m2 && HermitianMatrixQ[m2] && 
    PositiveSemidefiniteMatrixQ[m2] && Tr[m2] == 1];
  Return[m2];
]