关于 Ising-Spin 模型能量计算的问题

计算科学 Python 算法 蒙特卡洛
2021-12-19 02:24:11

在我研究的大多数蒙特卡洛算法中,我发现,在它们计算能量的地方,总是一行代码,它们被四除。

例如,此代码片段取自 此处

def Energy(Q):
        starting_energy=0
        for i in range(len(Q)):
            for j in range(len(Q)):
                g=Q[i,j]
                n_y=Q[(i+1)%num,j]+Q[i,(j+1)%num]+Q[(i-1)%num,j]+Q[i,(j-1)%num]
                starting_energy+=g*-n_y
        return starting_energy/4

另一个例子可以在这里找到

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.

根据我的理解,我们想要计算自旋配置的能量,包括我们当前正在查看的自旋加上它最近的邻居。所以总而言之,我们在这个函数中计算了 5 个 ising-spins。

那么为什么返回return energy/4而不是正确return energy/5呢?

1个回答

能量表达式不是自旋的总和,而是自旋对的总和,每对计算一次。但正如表达的那样

nb = config[(i+1)%N, j] + config[i,(j+1)%N] + config[(i-1)%N, j] + config[i,(j-1)%N

每个(非零耦合)自旋对计数 4 次。因此需要对最终结果进行四分之一。