2012-03-29 12 views
1

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) 
+0

Und was sehen Sie? –

+1

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

+0

@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 –

Antwort

2

Es gibt nur 6 Möglichkeiten für das Delta in Energie: -8, -4, 0, 0, 4, 8. ich wiederhole 0, weil es zwei verschiedene Konfigurationen mit dieser Energie die Wahrscheinlichkeit. jeder davon ist 1/6 für eine zufällige Konfiguration, das bedeutet 1/3 für d_energy> 0, 1/3 für d_energy < 0 und 1/3 für d_energy == 0.

Wenn Sie if d_energy <= 0 :-if d_energy < 0 : ändern Sie ein dritte „gut“ ein Drittel „schlecht“ und ein drittes „nostep“ erhalten. Ich denke, was dein Professor meinte, ist, dass die Anzahl der "schlechten" Schritte die gleiche wie die Anzahl der "guten" Schritte für unendliche Temperatur sein sollte. Was ist der Fall, wenn Sie die '< =' reparieren.

Edit: Sie möchten vielleicht auch ein> = für die elif.

Verwandte Themen