我用python (2d)为ising模型写了一些代码。除了好的和坏的步骤的数量之外,所有的东西看起来都在正确计算。好的步骤被定义为由于能量变化(d_energy)小于或等于零而改变自旋的步骤。一个糟糕的步骤是,由于随机整数小于e^(-d_energy/(Kb * temp) )的值而改变了自旋,其中kb是boltzman的常量。这里有一个no步,其中d_energy大于0,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)发布于 2012-04-03 14:52:44
能量的增量只有6种可能:- 8,-4,0,0,4,8。我重复0,因为有两种不同的构型。对于随机配置,每种情况的概率都是1/6。这意味着1/3的d_energy > 0,1/3的d_energy < 0和1/3的d_energy == 0。
如果你把if d_energy <= 0 :改成if d_energy < 0 :,你会得到第三个“好”,第三个“坏”和第三个"nostep“。我想你的教授的意思是,对于无限温度,“坏”步骤的数量应该与“好”步骤的数量相同。如果您修复了'<=‘,情况就是这样。
编辑:您可能还想为elif创建一个>=。
https://stackoverflow.com/questions/9929678
复制相似问题