Generieren einer Zufallsdichtematrix in Mathematica
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
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).
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];
]