Aktualisieren von Verbindungsvariablen in der Gitter-SU(N)SU(N)SU(N)-Eichtheorie

Ich schreibe gerade ein grundlegendes Programm in Python, um eine 1 + 1-dimensionale Yang-Mühlen-Eichtheorie mit Symmetriegruppe zu simulieren S U ( 2 ) .

Auf dem Lattice arbeitet man mit Link-Variablen, die sind S U ( N ) Matrizen formal definiert als U u ( X ) = e ich G A A u ( X ) , Wo A u ( X ) = ich = 0 N 2 1 ( A u ich T ich ) und wo T ich ist der ich T H Generator der S U ( N ) Gruppe. Die Gitterwirkung hängt mit den Plaquetten auf dem Gitter zusammen, wobei eine Plakette das kleinste geschlossene Produkt von Verknüpfungsvariablen auf dem Gitter ist. Deutlich sein: U u ( X ) ist ein Vektor von S U ( N ) Matrizen: Sie hätten eine S U ( N ) Matrix für jeden u . So U X ( X ) ist unverändert eine SU(N)-Matrix U T ( X ) .

Der Monte-Carlo-Update-Algorithmus geht so. Wir betrachten einen Link im Gitter einzeln und schlagen eine Änderung der Linkvariablen vor, U u ( X ) U u ' ( X ) (wobei u die Richtung der Verbindung ist; in 1 + 1-Dimensionen ist es entweder X oder T ) Wir berechnen dann die Änderung der Aktion, die eintreten würde, wenn wir die Änderung akzeptieren würden U u ( X ) U u ' ( X ) . Wenn die Änderung in der Aktion, D S , negativ ist, akzeptieren wir die Änderung. Wenn die Änderung in der Aktion, D S positiv ist, dann akzeptieren wir die Änderung mit einer Wahrscheinlichkeit von e D S . Wir führen diesen Prozess für jede Verbindungsvariable auf dem Gitter durch.

So; Hier ist meine Frage. Wie schlage ich ausreichend kleine Änderungen an einer SU(N)-Matrix vor, sodass die durchschnittliche Akzeptanzwahrscheinlichkeit nicht absurd klein ist? Ich glaube nicht, dass ich Änderungen der Form vorschlagen kann U u ( X ) U u ( X ) + U u ' ( X ) , Wo U u ' ( X ) ist eine 'kleine' SU(N)-Matrix (falls es überhaupt so etwas gibt), da ich nicht glaube, dass die Summe zweier SU(N)-Matrizen im Allgemeinen SU(N) ist. Ich könnte einfach generieren K zufällige SU(N)-Matrizen, und wählen Sie dann zufällig eine davon aus K S U ( N ) Matrizen als meine vorgeschlagene Link-Variable U u ( X ) . Wenn ich dies jedoch implementiere, lande ich bei D S 's mit großen Magnituden, was niedrige Akzeptanzwahrscheinlichkeiten bedeutet. Das bedeutet, dass eine große Anzahl von Iterationen durchgeführt werden muss, um eine Konfiguration unabhängig von Ihrer Ausgangskonfiguration zu erhalten.

Sorry für die Länge. Wenn jemand meinen Code im Moment haben möchte, lass es mich wissen. Es ist in Python geschrieben und hat nur einen Iterator und eine Möglichkeit zum Generieren K zufällige SU(2)-Matrizen.

BEARBEITEN: Ich glaube, ich habe die Ursache für die Diskrepanz zwischen meinen anfänglichen Ergebnissen und meinen aktuellen Ergebnissen gefunden. Nehmen wir an, ich erzeuge 1000 zufällige su(2)-Matrizen mit einem Algorithmus. Um die Link-Variablen zu aktualisieren, schlage ich vor U u ( X ) M U u ( X ) , wobei M eine meiner 1000 zufälligen su(2)-Matrizen ist. Ich bin mir nicht sicher, ob Sie tatsächlich den gesamten Raum von su(2) konstruieren können, indem Sie diese 1000 zufälligen Matrizen wiederholt miteinander multiplizieren. Selbst wenn ich meinen Code in 2 + 1 D su (2) Yang-Mühlen geändert habe, habe ich immer noch das Problem, dass sich mein Plaketten-Erwartungswert ändert, wenn ich meine Schrittgröße ändere. Insbesondere steigt der Erwartungswert der Plakette, wenn ich die Schrittweite verringere. Nur wenn ich völlig zufällige su(2)-Matrizen M zum Aktualisieren erzeuge U u ( X ) M U u ( X ) erhalte ich die minimale Plakettengröße.

EDIT2: Könnte es sein, dass ich das gesamte Gitter auf einmal aktualisiere? Ich laufe einmal durch das Gitter, ohne irgendwelche Links zu ändern, und ändere dann alle Links am Ende jeder Iteration.

EDIT3: Der Update-Algorithmus war tatsächlich das Problem. Sie müssen zufällig eine Link-Variable auf einer zufälligen Site auswählen, diese aktualisieren und dann fortfahren.

Scheint nicht so, als hätte jemand Antworten. Eine einfache Möglichkeit wäre, die SU(2)-Matrizen in Exponentialform mit den 3 Generatoren der SU(2)-Gruppe zu definieren. Ich könnte dann kleine Änderungen in den drei "Winkeln" vorschlagen, aber dies würde die erforderliche Rechenleistung erheblich erhöhen, da die Berechnung des Matrixexponenten rechenintensiv ist.
Erinnere dich daran
e ich v ich σ ich = ( cos v + ich v 3 v Sünde v ( v 2 + ich v 1 ) v Sünde v ich ( v 1 + ich v 2 ) v Sünde v cos v ich v 3 v Sünde v )
mit v := v 1 2 + v 2 2 + v 3 2 .
Ich weiß auch, dass jede SU(2)-Matrix dargestellt werden kann B 0 ICH + ich B J σ J , J = 1 , 2 , 3 , Wo B 0 2 + B 1 2 + B 2 2 + B 3 2 = 1 , ICH ist die 2 mal 2 Identitätsmatrix, und wo σ J , J = 1 , 2 , 3 sind die drei Pauli-Matrizen. Ich schaue gerade nach einem Heatbath-Algorithmus (CKP-Algorithmus, glaube ich)
1000 zufällig ausgewählt S U ( 2 ) Elemente fast sicher erzeugen S U ( 2 ) . (Es würde einige wunderbare Zufälle brauchen, damit sie eine Untergruppe bilden.) Aber sie tun dies möglicherweise nicht effektiv . Möglicherweise müssen Sie ziemlich hohe Potenzen von ihnen in Betracht ziehen, bevor Sie eine ausreichende Dichte erreichen S U ( 2 ) .

Antworten (2)

Für die Aktualisierung von Link-Variablen möchten Sie die Tatsache ausnutzen, dass S U ( 2 ) ist eine Gruppe. Finden Sie also eine "kleine" Matrix M = e X P ( ich ϵ H ) S U ( 2 ) , und aktualisieren Sie gemäß U μ ( X ) M U μ ( X ) .

Ich empfehle einen Blick auf Le Pages „Lattice QCD for Novices“. Dort finden Sie einige nützliche Hinweise.

Auch nützlich, wenn Sie sich dessen nicht bewusst sind: 2D-Gitter-QCD ist exakt lösbar, sodass Sie Ihre Ergebnisse auf Plausibilität überprüfen können.

Machen Sie sich keine Sorgen über C vs. Python für 2d. Python ist in Ordnung.

Oh schön. Ich hatte keine Ahnung, dass es genau lösbar ist. Ich habe eine Google-Suche durchgeführt, aber ich konnte es nicht finden. Hast du vielleicht einen Link zu einem Paper/Vortrag, in dem die Lösung untersucht wird? Außerdem: Ich habe tatsächlich versucht, dies zu implementieren, aber ich habe festgestellt, dass die Schrittgröße den erwarteten Wert der Plakette beeinflusst, also muss ich etwas falsch machen.
In Bezug auf die genaue Lösung: Ich hätte sagen sollen, dass es sich um 2d Yang-Mills handelt, nicht um 2d QCD. Das Hinzufügen von Fermionen beeinträchtigt die Löslichkeit. Die ursprüngliche Idee stammt von Migdal, aber die beste Erklärung, die ich kenne, stammt von Witten. Schauen Sie sich Abschnitt 2.3 seines On Quantum Gauge Theories in Two Dimensions an.
Frage: Wenn ich zwei Aktualisierungsalgorithmen habe, einer wo U u ( X ) M wobei M(x) eine zufällige SU(2)-Matrix ist, und eine wo U u ( X ) M U u ( X ) , wobei M eine SU(2)-Matrix um Eins ist, sollte ich das gleiche Ergebnis für den Erwartungswert der Plakette erhalten? Auch; in Ihrem Beispiel sollte der Erwartungswert der Plakette vom Parameter abhängen ϵ ? Danke
Ich glaube nicht, dass das erste Rezept praxistaugliche Ergebnisse liefern wird. Die Ablehnungsrate sollte ziemlich hoch sein, sodass die Autokorrelationszeit der Monte-Carlo-Kette sehr lang sein wird, was Sie daran hindert, die Yang-Mills-Verteilung effektiv abzutasten. Ich würde nicht erwarten, die gleichen Erwartungswerte zu erhalten.
ϵ war nicht als Parameter gedacht; Es ist nur da, um anzuzeigen, dass die Matrizen in der Nähe der Identität sein sollten. Versuchen Sie, ein paar hundert davon mit unterschiedlichen Werten vorab zu generieren ϵ aus einer Normalverteilung gezogen N ( 0 , w ) von Breite w . Wählen Sie dann beim Aktualisieren zufällig eine der vorgenerierten Matrizen aus. Die Breite w wirkt sich auf die Autokorrelation der Monte-Carlo-Kette aus, sollte sich jedoch nicht auf Ihre endgültigen Ergebnisse auswirken.
Ich bekomme tatsächlich die gleichen Ergebnisse, wenn M in meinem Beispiel eine völlig zufällige su (2) -Matrix ist, aber nicht, wenn sie in der Nähe der Identitätsmatrix liegt. Seltsam.
Ich habe einen Aktualisierungsalgorithmus hinzugefügt, bei dem 10.000 zufällige su(2)-Matrizen über die Einheit gemäß der AccidentalFourierTransforms-Methode generiert werden. Das Problem besteht darin, dass für Schrittgrößen, die um 0 liegen (kleine Schrittgrößen), die Plakette ziemlich deutlich ansteigt. Ich bin mir nicht sicher warum. Ich kann meinen Code posten, wenn jemand will.

Im Prinzip findet man in der Evolution immer einen Zeitschritt, der klein genug ist, um eine vernünftige Akzeptanz zu haben (etwa 57 % für einen optimalen Integrator zweiter Ordnung). Führen Sie also zuerst einige Überprüfungen durch,

  1. Stimmt Ihre Aktionsänderung mit dem Zeitschritt Ihres Integrators n-ter Ordnung überein? Δ S ( Δ T ) N ?
  2. Als nächstes müssen Sie überprüfen, ob Ihr U am Ende der Evolutionsphase spurlos ist. Machen Sie eine Routine im Code, um zu reunitarisieren (dh wieder unitär zu machen), wenn dies nicht der Fall ist. Eine effiziente Möglichkeit zur Reunitarisierung ist die Verwendung von SVD (Singular Value Decomposition).
  3. Versuchen Sie, beim Akzeptieren/Ablehnen eine Zufallszahl für das gesamte Gitter zu generieren.
  4. Erstellen Sie außerdem eine Routine, bei der zufällige SU( N )-Matrix, könnte es nützlich sein.

Wenn Sie vorhaben, in Zukunft komplizierter zu werden, schlage ich vor, dass Sie versuchen, den Code in C/C++ zu schreiben (das ist der MILC-basierte QCD-Code, http://www.physics.utah.edu/~detar/milc/milcv7 .pdf verwendet)

Auch hier ist eine sehr nützliche Referenz, die beim Verständnis der fehlenden Links hilfreich sein wird: https://arxiv.org/pdf/1506.02567.pdf

Es gibt andere Tests, die ich nicht erwähnt habe e Δ S = 1 usw. usw.