Ich schreibe gerade ein grundlegendes Programm in Python, um eine 1 + 1-dimensionale Yang-Mühlen-Eichtheorie mit Symmetriegruppe zu simulieren .
Auf dem Lattice arbeitet man mit Link-Variablen, die sind Matrizen formal definiert als , Wo und wo ist der Generator der 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: ist ein Vektor von Matrizen: Sie hätten eine Matrix für jeden . So ist unverändert eine SU(N)-Matrix .
Der Monte-Carlo-Update-Algorithmus geht so. Wir betrachten einen Link im Gitter einzeln und schlagen eine Änderung der Linkvariablen vor, (wobei u die Richtung der Verbindung ist; in 1 + 1-Dimensionen ist es entweder oder ) Wir berechnen dann die Änderung der Aktion, die eintreten würde, wenn wir die Änderung akzeptieren würden . Wenn die Änderung in der Aktion, , negativ ist, akzeptieren wir die Änderung. Wenn die Änderung in der Aktion, positiv ist, dann akzeptieren wir die Änderung mit einer Wahrscheinlichkeit von . 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 , Wo 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 zufällige SU(N)-Matrizen, und wählen Sie dann zufällig eine davon aus Matrizen als meine vorgeschlagene Link-Variable . Wenn ich dies jedoch implementiere, lande ich bei '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 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 , 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 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.
Für die Aktualisierung von Link-Variablen möchten Sie die Tatsache ausnutzen, dass ist eine Gruppe. Finden Sie also eine "kleine" Matrix , und aktualisieren Sie gemäß .
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.
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,
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 usw. usw.
Futterställe
AccidentalFourierTransform
Futterställe
Benutzer1504