首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的Ising模型没有给出正确的结果

Python中的Ising模型没有给出正确的结果
EN

Stack Overflow用户
提问于 2012-03-30 00:41:05
回答 1查看 1.7K关注 0票数 1

我用python (2d)为ising模型写了一些代码。除了好的和坏的步骤的数量之外,所有的东西看起来都在正确计算。好的步骤被定义为由于能量变化(d_energy)小于或等于零而改变自旋的步骤。一个糟糕的步骤是,由于随机整数小于e^(-d_energy/(Kb * temp) )的值而改变了自旋,其中kb是boltzman的常量。这里有一个no步,其中d_energy大于0,rand大于e^(我在上面写的)。

当我和一位教授谈到这个问题时,他告诉我,当我把温度调得很高时,错误的步数应该是总步数的一半

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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创建一个>=。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9929678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档