Python中的Ising模型未给出正确的结果

Python中的Ising模型未给出正确的结果,python,physics,Python,Physics,我用python(2d)为ising模型编写了一些代码。除了好的步骤和坏的步骤的数量外,一切看起来都在正确计算。好的步骤是指由于能量变化(d_能量)小于或等于零而改变自旋的步骤。一个错误的步骤是当自旋改变时,因为一个随机整数小于e^(-d_energy/(Kb*temp)的值,其中Kb是波尔兹曼常数。没有一个步骤,其中d_energy大于零,rand大于e^(我在上面写的) 当我和一位教授谈论这件事时,他告诉我,当我把温度调得很高时,坏步数应该是总步数的一半 from numpy import

我用python(2d)为ising模型编写了一些代码。除了好的步骤和坏的步骤的数量外,一切看起来都在正确计算。好的步骤是指由于能量变化(d_能量)小于或等于零而改变自旋的步骤。一个错误的步骤是当自旋改变时,因为一个随机整数小于e^(-d_energy/(Kb*temp)的值,其中Kb是波尔兹曼常数。没有一个步骤,其中d_energy大于零,rand大于e^(我在上面写的)

当我和一位教授谈论这件事时,他告诉我,当我把温度调得很高时,坏步数应该是总步数的一半

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)
从numpy导入零
从随机导入选择,随机导入
输入数学
def创建_晶格(nx,ny):
possibleSpins=[-1,1]
晶格=零((nx,ny))
对于范围内的i(nx):
对于范围内的j(ny):
晶格[i,j]=选择(可能的数)
返回晶格
def ising_型号(NSWEPS、nx、ny、Js、kb、temp):
s_能量=0.0
e_能量=0.0
d_能量=0.0
自旋=0.0
兰德=0.0
好=0.0
坏=0.0
nostep=0.0
晶格=创建_晶格(nx,ny)
能量=零((nx,ny))
印刷品(格子)
#每个扫描都是晶格的完整外观
对于范围内的扫掠(NSweep):
对于范围内的i(nx):
对于范围内的j(ny):
自旋=晶格[i][j]
s_能量=-1*Js*自旋*(晶格[(i-1)%nx][j]+晶格[i][(j-1)%ny]+晶格[i][(j+1)%ny]+晶格[(i+1)%nx][j])
晶格[i][j]=-1*自旋
能量=-1*Js*晶格[i][j]*(晶格[(i-1)%nx][j]+晶格[i][(j-1)%ny]+晶格[i][(j+1)%ny]+晶格[(i+1)%nx][j])
d_能量=e_能量-s_能量
rand=random()

如果d_能量0和rand能量增量只有6种可能性:-8,-4,0,0,4,8。我重复0,因为有两种不同的能量配置。对于随机配置,每种配置的概率都是1/6。这意味着d_能量>0的概率是1/3,d_能量<0的概率是1/3,d_能量==0的概率是1/3


如果你改变elif的
如果d_energy=那么你看到的是什么?你的积分不会分离扫描:你改变晶格的位置,所以你的一些细胞会翻转,因为你在扫描中已经做了改变。这可能不是你想要的,所以我会在扫描的
开始时复制一个晶格s
循环并改变它。[注意:这只是一个编程建议,我不知道“好步/坏步”比率应该是多少。]@Barber我发现好的扫描是坏的扫描的两倍。所以坏的扫描是总步数的1/3。@DSM谢谢。谢谢你的建议。我会尝试一下并考虑一下。初始数组的创建可以简化(并加快)为
lattice=random.randint(-1,1,size=(N,N))*2+1
。如果你的旋转不是
[-1,1]
,那你就没有伊辛模型了(c.f.波特模型:)。