python - 如何生成具有条目 +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.
解决方案
最后自己解决了。对于尺寸为 的晶格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
。对于更大的格子会变慢,但对我来说可以。
推荐阅读
- r - R中的线性搜索
- python - int 未被正确识别为 csv 中的 int
- amazon-web-services - 我应该设置什么最低权限才能授予 S3 文件上传访问权限?
- node.js - Bigquery如何在List操作期间过滤表和视图
- angular - Observable 稍后返回数据
- sql-server - 从一个响应为任何的表中选择所有记录,并从另一个响应为无的表中选择记录
- docker - 无法使用 docker 的 IP 地址访问 Web 应用程序,但 localhost 很好
- ios - 如何快速更新某个位置的 tableview 项目?
- reactjs - 这个三元运算符是做什么的?
- python - 如何获取 li 的第二个 span 标签中存在的第二个锚标签的 href。- 美丽的汤