Python 伊辛模型大都会算法:格元';t平衡

Python 伊辛模型大都会算法:格元';t平衡,python,physics,montecarlo,Python,Physics,Montecarlo,我有一些python(2d)中伊辛模型的代码,晶格不会达到平衡。在这里,代码打印出每个蒙特卡罗扫描翻转的旋转数,每个扫描翻转的旋转数相同。如果我是正确的,那么随着晶格达到平衡,翻转的次数应该随着每次扫描而减少。有人能看到代码中有错误吗 import numpy as np from numpy import random as rn N=20 a=[1,-1] b=[N,N] #first make an array init_lattice=rn.choice(a,size=(N,N))

我有一些python(2d)中伊辛模型的代码,晶格不会达到平衡。在这里,代码打印出每个蒙特卡罗扫描翻转的旋转数,每个扫描翻转的旋转数相同。如果我是正确的,那么随着晶格达到平衡,翻转的次数应该随着每次扫描而减少。有人能看到代码中有错误吗

import numpy as np
from numpy import random as rn
N=20
a=[1,-1]
b=[N,N]

#first make an array
init_lattice=rn.choice(a,size=(N,N))

#specify how many Monte Carlo sweeps
number_of_sweeps=1000

#main code to flip spins and record how many are flipped
def new_lattice(lattice,T):
    delta_E=np.zeros(b)
    switch1=np.zeros(number_of_sweeps)
    switch=0
    for sweep in range(number_of_sweeps):
        for i in range(N):
            for j in range(N):
                Si=lattice[i,j]
                sum_Sj=lattice[i,(j+1)%N]+lattice[(i+1)%N,j]+lattice[i,(j-1)%N]+lattice[(i-1)%N,j]
                delta_E[i,j]=2*Si*sum_Sj
                if delta_E[i,j]<0:
                    lattice[i,j]*=-1
                    switch+=1
                elif np.exp(-1*delta_E[i,j]/(T))>rn.random():
                    lattice[i,j]*=-1
                    switch+=1
        switch1[sweep]=switch
    return lattice,switch1

#print how many spins have flipped
switch= new_lattice(init_lattice,5)[1]
print switch
for i in range(len(switch)):
    print switch[i+1]-switch[i-1]
将numpy导入为np
从numpy随机导入为rn
N=20
a=[1,-1]
b=[N,N]
#首先做一个数组
init_lattice=rn.choice(a,size=(N,N))
#指定蒙特卡罗扫描的次数
扫掠次数=1000
#翻转旋转并记录翻转数量的主代码
def新_晶格(晶格,T):
delta_E=np.零(b)
开关1=np.零(扫掠次数)
开关=0
对于范围内的扫掠(扫掠次数):
对于范围(N)中的i:
对于范围(N)内的j:
Si=晶格[i,j]
和=晶格[i,(j+1)%N]+晶格[(i+1)%N,j]+晶格[i,(j-1)%N]+晶格[(i-1)%N,j]
delta_E[i,j]=2*Si*sum_Sj
如果δE[i,j]rn.random():
晶格[i,j]*=-1
开关+=1
开关1[扫描]=开关
返回晶格,开关1
#打印已翻转的旋转数
开关=新的_晶格(初始_晶格,5)[1]
打印开关
对于范围内的i(透镜(开关)):
打印开关[i+1]-开关[i-1]
我认为

    for i in range(N):
        for j in range(N):
不好:您必须随机选择要测试的旋转

T和其他变量是整数,在指数np.exp(-1*delta_E[i,j]/T)中有一个整数除法,这是错误的

对于这段代码,我有一个饱和度(注意,我取T=1,而不是5,扫描次数=10000,而不是1000):

将numpy导入为np
从numpy随机导入为rn
随机输入
将matplotlib.pyplot作为plt导入
格维数=[20,20]
nx=晶格尺寸[0]
ny=格维数[1]
nodesNumber=nx*ny
SpinValue=[-1,1]
扫掠次数=10000次
T=1。
lattice=init_lattice=rn.choice(自旋值,大小=(nx,ny))
#lattice=[random.choice([-1,1]),用于范围内的i(nodesNumber)]
t=0
开关=0
res=[]
当t0。和rn.random()
晶格[i,j]*=-1
开关+=1

谢谢你的回答。符号错误在哪里?能量的变化应该是负的,因为旋转会减少总能量,而不是增加总能量。我更正了我的答案。你需要使用一个较低的T(T越大,收敛速度越慢),并更改我的解决方案中编辑的能量标准。谢谢,这似乎有效。我不明白为什么我原来的elif条件与你的“和”不一样。在我看来,你们只是把它们交换了一下,然后用“and”代替了elif。为什么这会改变它?事实上,从形式上看,这两个条件是等价的。我在答复中删除了对该条件的评论。由于模拟参数(t太大,扫描次数太少)的原因,您没有观察到饱和度,但还有另外两个问题(自旋选择和指数计算)可能会使结果错误。如果你觉得合适的话,你可以自由投票,把问题解决。
import numpy as np
from numpy import random as rn
import random
import matplotlib.pyplot as plt

latticeDimensions = [20, 20]
nx = latticeDimensions[0]
ny = latticeDimensions[1]
nodesNumber = nx*ny
spinValues = [-1,1]
sweeps = 10000
T = 1.

lattice = init_lattice = rn.choice(spinValues,size=(nx,ny))
#lattice = [ random.choice([-1,1]) for i in range(nodesNumber) ]
t = 0
switch = 0
res = []
while t < sweeps:
    selectedNode = random.choice(nodeIdx)
    i = random.choice(range(nx))
    j = random.choice(range(ny))
    Si = lattice[i,j]
    sum_Sj=lattice[i,(j+1)%ny] + lattice[(i+1)%nx,j] + lattice[i,(j-1)%ny] + lattice[(i-1)%nx,j]
    delta = 2 * Si * sum_Sj
    probaTemp = np.exp(- delta / T)
    if delta > 0. and rn.random() < probaTemp:
        lattice[i,j] *= -1
        switch += 1
    elif delta <= 0.:
        lattice[i,j] *= -1
        switch += 1
    t += 1
    print t
    res.append(switch)

plt.plot(res)
plt.show()