Die Spin-Karte des zweidimensionalen quadratischen Gitter-Ging-Modells wurde für jede Temperatur nach der Metropolis-Hasting-Methode erstellt und daher zusammengefasst. Das Zing-Modell ist nur eine vereinfachte Erklärung. Wenn Sie mehr wissen möchten, lesen Sie bitte das Lehrbuch der statistischen Dynamik. Mit dieser Methode können Sie auch Spin-Maps wie andere Dreiecksgitter als quadratische Gitter erstellen. Probieren Sie es also aus. (Ändern Sie einfach die Hamilton-Änderung)
Die Metropolis Hastings-Methode ist die Markov-Ketten-Monte-Carlo-Methode (MCMC) zum Erhalten von Sequenzen von Zufallsstichproben aus Wahrscheinlichkeitsverteilungen, die schwer direkt abzutasten sind, und wird häufig in der Statistik und der statistischen Physik verwendet. Diese Sequenz kann verwendet werden, um Verteilungen zu approximieren, erwartete Werte zu integrieren und zu berechnen.
Legen Sie einen beliebigen Anfangszustand fest, wiederholen Sie die Aktualisierung mit der folgenden Methode und übernehmen Sie den Endzustand als plausiblen Zustand.
Angenommen, ein Zustand $ S $ wird angenommen. Generieren Sie den Zustand $ \ akut {S} $ gemäß der Wahrscheinlichkeitsdichtefunktion $ g (\ akut {S} \ mid S) $ als Kandidat für die Aktualisierung. $ g (\ akut {S} \ mid S) $ ist eine Verteilungsfunktion der Wahrscheinlichkeit, dass sich der Zustand $ S $ in den Zustand $ \ akut {S} $ bewegt. Hier ist die Wahrscheinlichkeit des Zustands $ P (S) $ und die neuen Funktionen
Das Rising-Modell ist ein Modell, das hauptsächlich als Modell eines ferromagnetischen Materials verwendet wird. (Es ist kein Modell, das ferromagnetischen Materialien eigen ist, sondern dient als Modell für verschiedene Phänomene.)
Dieses Modell ist eine Theorie, die sich nur mit der Wechselwirkung zwischen den interessierenden Gitterpunkten und ihren wiederverbindenden Gitterpunkten befasst. Obwohl es sich um eine so einfache Theorie handelt, ist es ein hervorragendes Modell, das das Phänomen des Phasenübergangs beschreiben kann.
Der Hamiltonianer dieses Modells ist
Ein Modell, in dem Elektronen an den Gitterpunkten in einem gitterartigen Raum vorhanden sind, wird als zweidimensionales quadratisches Gittermodell bezeichnet. Hamiltonian dieses Modells ist $$, vorausgesetzt $ J = 1 $
H = -\sum_{<i,j>}\sigma_i\sigma_j
$$
Kann ausgedrückt werden als. (Dies ändert sich in keinem Gitter.) Wenn Sie dies verwenden, beträgt die Änderung in Hamilton, wenn der Spinwert eines Punktes $ (k, l) $ umgekehrt wird,
Die Implementierung erfolgte in Python. Der gesamte Code sieht folgendermaßen aus:
GenerateSpinState.py
import numpy as np
class GSS:
def __init__(self, N, T):
# lattice size
self.N = N
# temperature list
self.T = T
# generate N*N spin state by random
self.state = 2 * np.random.randint(0, 2, (self.N, self.N)) - 1
# calc hamiltonian displacement which is square lattice, after flipping one site(x,y)
def calc_Hamiltonian_square(self, x, y):
delta_H = 2 * self.state[x, y] * (self.state[(x+1)%self.N, y] + self.state[x, (y+1)%self.N] + self.state[(x-1)%self.N, y] + self.state[x, (y-1)%self.N])
return delta_H
# flip random spin site
def flip_spin(self):
new_state = self.state.copy()
[x, y] = np.random.randint(0, self.N, (2))
new_state[x, y] *= -1
return new_state, x, y
# calc specious spin state by metropolis method
def calc_spin_state(self, t):
n = 10000
for i in range(n):
# get flip site
new_state, x, y = self.flip_spin()
# calc hamiltonian displacement
deltaH = self.calc_Hamiltonian_square(x, y)
# decide whether to adopt
if np.random.rand() <= np.exp(-deltaH/t):
self.state = new_state
def calc_each_temperature(self):
# save spin state
X = []
for t in self.T:
# init spin state
self.state = 2 * np.random.randint(0, 2, (self.N, self.N)) - 1
# generate spin state which temperature t
self.calc_spin_state(t)
# append generate spin state which temperature t
X.append(self.state)
return np.array(X)
main.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.animation import FuncAnimation
import GenerateSpinState
# save path
# train test data
npy_path = "./result//"
# spin map
spin_map_path = "./result/"
# lattice size
N = 32
# number of data (square lattice)
count = 100
# temperaturelist/Significant digits is 3
T_list = np.linspace(0.1, 5.5, count).round(3)
# make gif which write spin state transition
def create_spinmap_gif(data, T, save_path):
save_path = save_path + "squarelattice.gif"
fig = plt.figure()
def Plot(num):
plt.cla()
plt.imshow(data[num])
t_len = len(str(T[num]))
title = "temperature:" + str(T[num]) + "0"*(5-t_len)
plt.title(title)
anim = FuncAnimation(fig, Plot, frames=100)
anim.save(save_path, writer='imagemagick')
# call module GSS
GSS = GenerateSpinState.GSS(N, T_list)
# create spin map
X_train = GSS.calc_each_temperature()
# create gif
create_spinmap_gif(X_train, T_list, spin_map_path)
Zuerst werde ich GenerateSpinState.py erklären. Die Größe und Temperatur des Gitters seien Instanzvariablen. Es erzeugt auch den Anfangszustand der Spin-Map.
def __init__(self, N, T):
# lattice size
self.N = N
# temperature list
self.T = T
# generate N*N spin state by random
self.state = 2 * np.random.randint(0, 2, (self.N, self.N)) - 1
Finden Sie die Hamilton-Änderung $ \ Delta H $, wenn der Spinwert eines beliebigen Gitterpunkts $ (x, y) $ invertiert ist. Als Merkmal des Zing-Modells werden nur die wieder benachbarten Gitterpunkte in die Berechnung einbezogen, sodass nur die Gitterpunkte um die invertierten Gitterpunkte extrahiert und berechnet werden müssen.
# calc hamiltonian displacement which is square lattice, after flipping one site(x,y)
def calc_Hamiltonian_square(self, x, y):
delta_H = 2 * self.state[x, y] * (self.state[(x+1)%self.N, y] + self.state[x, (y+1)%self.N] + self.state[(x-1)%self.N, y] + self.state[x, (y-1)%self.N])
return delta_H
Ein Gitterpunkt wird zufällig ausgewählt und die Spin-Map mit dem invertierten Punkt wird als "new_state" gespeichert, bis entschieden wird, ob sie aktualisiert werden soll oder nicht. Vergessen Sie nicht ".copy", wenn Sie "self.state" vor der Inversion als Spinmap nach "new_state" verschieben. Ohne .copy
aktualisiert das Aktualisieren von new_state
auch self.state
und die Spinmap wird weiterhin aktualisiert.
# flip random spin site
def flip_spin(self):
new_state = self.state.copy()
[x, y] = np.random.randint(0, self.N, (2))
new_state[x, y] *= -1
return new_state, x, y
Nach dem Aufrufen der beiden oben genannten Funktionen wird der Status aktualisiert, indem "new_state" mit einer Wahrscheinlichkeit von $ \ exp {\ frac {\ Delta {H}} {k_B \ beta}} $ übernommen wird. Wenn es nicht übernommen wird, wird der Status nicht aktualisiert. Die Anzahl der Wiederholungen ist auf 10000 eingestellt, aber es gibt keine physikalische oder mathematische Grundlage, und es war ein guter Wert, also habe ich ihn eingestellt. Infolgedessen habe ich das wahrscheinlichste Ergebnis zufällig erhalten, also habe ich es übernommen. (Es wurde nach 1000 Mal nicht vollständig aktualisiert.)
# calc specious spin state by metropolis method
def calc_spin_state(self, t):
n = 10000
for i in range(n):
# get flip site
new_state, x, y = self.flip_spin()
# calc hamiltonian displacement
deltaH = self.calc_Hamiltonian_square(x, y)
# decide whether to adopt
if np.random.rand() <= np.exp(-deltaH/t):
self.state = new_state
Liste, in der die Temperatur gespeichert ist, die Sie zuerst überprüfen möchten. Ich habe Spin-Maps bei verschiedenen Temperaturen erstellt.
def calc_each_temperature(self):
# save spin state
X = []
for t in self.T:
# init spin state
self.state = 2 * np.random.randint(0, 2, (self.N, self.N)) - 1
# generate spin state which temperature t
self.calc_spin_state(t)
# append generate spin state which temperature t
X.append(self.state)
return np.array(X)
Damit ist die Erläuterung von GenerateSpinState.py abgeschlossen. Als nächstes werden für main.py die Gittergröße und das Temperaturarray festgelegt, und GenerateSpinState.py wird aufgerufen, um nach der Temperatur eine Spin-Map zu erhalten. In diesem Fall beträgt die Größe des Gitters 36 und die Temperaturanordnung 0,1 bis 5,5, aufgeteilt in 100 gleiche Teile. Die Temperatursequenz wurde unter Berücksichtigung der theoretischen Phasenübergangstemperatur von 2,26 erstellt. Ich habe das folgende GIF-Bild mit create_spinmap_gif erstellt. (Spin Map bei jeder Temperatur übernommen)![Squarattice.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/bba500b1-f3b6-3561-113b -d7fa35054fbb.gif)
Metropolis–Hastings algorithm Hastings, W.K. (1970). "Monte Carlo Sampling Methods Using Markov Chains and Their Applications".