Ich schrieb einen Code für das Ising-Modell in Python (2d). Alles sieht scheint korrekt zu berechnen, außer der Anzahl der guten und schlechten Schritte. Gute Schritte sind als Schritte definiert, bei denen der Spin geändert wird, weil die Energieänderung (d_energy) kleiner oder gleich Null ist. Ein schlechter Schritt ist, wenn der Spin geändert wird, weil eine zufällige ganze Zahl kleiner ist als der Wert von e^(- d_energy/(Kb * temp) wobei kb die boltzman-Konstante ist. Und es gibt einen no-Schritt, in dem d_energy größer als null und rand ist ist> als das e^(was ich oben geschrieben habe)Ising-Modell in Python gibt keine korrekten Ergebnisse
Als ich mit einem Professor darüber sprach, sagte er mir, wenn ich die Temperatur wirklich hoch mache, sollte die Anzahl der schlechten Schritte die Hälfte der Gesamtzahl sein die Schritte
from numpy import zeros
from random import choice, random
import math
def create_lattice(nx,ny):
possibleSpins = [-1,1]
lattice = zeros((nx,ny))
for i in range(nx):
for j in range(ny):
lattice[i,j] = choice(possibleSpins)
return lattice
def ising_model(nsweeps, nx, ny, Js, kb, temp):
s_energy = 0.0
e_energy = 0.0
d_energy = 0.0
spin = 0.0
rand = 0.0
good = 0.0
bad = 0.0
nostep = 0.0
lattice = create_lattice(nx, ny)
energies = zeros((nx,ny))
print(lattice)
# Each sweep is a complete look at the lattice
for sweeps in range(nsweeps):
for i in range(nx):
for j in range(ny):
spin = lattice[i][j]
s_energy = -1 * Js * spin * (lattice[(i-1)%nx][j] + lattice[i][(j-1)%ny] + lattice[i][(j+1)%ny] + lattice[(i+1)%nx][j])
lattice[i][j] = -1 * spin
e_energy = -1 * Js * lattice[i][j] * (lattice[(i-1)%nx][j] + lattice[i][(j-1)%ny] + lattice[i][(j+1)%ny] + lattice[(i+1)%nx][j])
d_energy = e_energy - s_energy
rand = random()
if d_energy <= 0 :
good = good + 1
elif d_energy > 0 and rand <= math.exp(-1 * d_energy/(kb * temp)):
bad = bad + 1
else:
lattice[i][j] = spin
nostep = nostep + 1
print(math.exp(-1 * d_energy/(kb * temp)))
print(rand)
print(lattice)
print(good)
print(bad)
print(nostep)
# energies array is
return energies
ising_model(10,7,7,1.0,1.0,10000000000000000000000000000.0)
Und was sehen Sie? –
Ihre Integration trennt Sweeps nicht: Sie ändern das Gitter an Ort und Stelle, sodass einige Ihrer Zellen aufgrund einer Änderung, die Sie bereits in diesem Sweep vorgenommen haben, umgedreht werden. Das ist wahrscheinlich nicht das, was Sie beabsichtigt haben, also würde ich eine Kopie des Gitters am Anfang der 'for Sweeps'-Schleife machen und das stattdessen ändern. [Hinweis: Dies ist nur ein Programmiervorschlag, ich habe keine Ahnung, was der "gute Schritt/schlechter Schritt" Verhältnis sein sollte.] – DSM
@Barber Ich sehe, dass die guten Sweeps doppelt so schlimm sind. Die schlechten Sweeps sind 1/3 der Gesamtzahl der Schritte. @ DSM Danke. für den Vorschlag. Ich werde es ausprobieren und darüber nachdenken –