首页 > 解决方案 > 如何生成具有条目 +1 和 -1 的小方格的所有可能配置?(伊辛模型)

问题描述

我目前正在使用 Metropolis-Hasting 算法运行马尔可夫链蒙特卡洛伊辛模型模拟。为了确保我的模拟运行正常,我希望计算配分函数的精确表达式,以便获得真正的平衡分布,然后比较来自模拟的晶格的采样频率(绘制为直方图)和将其与真实分布进行比较。

我知道这对于大型 lattice 来说计算量很大,因此我只想为小尺寸的 lattice 做这件事。为了计算显示真实分布的配分函数

Z = np.exp(-beta*energy_i)/sum(np.exp(-beta*energy_n))

对于2x2晶格,有2^4=16晶格配置,对于每个配置,i它的能量都由这个函数计算。这里i = 1, 2,..., 16和 的分母Z是配置的所有指数项的总和。Beta是逆温度,但如果你把它留下,那么我会自己解决。

def calcEnergy(config):
    '''Energy of a given configuration'''
    energy = 0
    for i in range(len(config)):
        for j in range(len(config)):
            S = config[i, j]
            nb = config[(i+1) % N, j] + config[i, (j+1) % N] + \
                config[(i-1) % N, j] + config[i, (j-1) % N]
            energy += -nb*S
    return energy/4.

标签: pythonlatticemontecarlo

解决方案


最后自己解决了。对于尺寸为 的晶格LxL

def true_dist(L):
    perm = [list(seq) for seq in itertools.product("01", repeat=L*L)]
    perm = [[int(x) for x in value] for i, value in enumerate(perm)]
    perm = np.array(perm).reshape(2**(L*L), L, L)
    perm = np.where(perm==1, perm, -1)
    return perm

这个函数给出了+1和的所有可能配置-1。对于更大的格子会变慢,但对我来说可以。


推荐阅读