我已经在二维Ising模型上进行蒙特卡洛模拟了很长时间了。我遇到的问题纯粹是计算问题,不需要有关Ising模型的任何知识。
我已经能够完全实现该模型。但是,由于我要模拟相当大的系统,因此代码运行速度不够快。运行适当数量的蒙特卡洛扫描,使用我尝试过的最大系统,运行时间约为半小时。
运行时间长的主要原因是我无法使函数以“ numpy形式”运行,我不得不使用普通的Python for循环,对我来说,这似乎是最大的问题。我需要帮助的两个功能如下。
def helix(S, i, N, L, beta, r, B = 0, J_v = 1, J_p = 1):
nn = i + 1
if nn >= N:
nn -= N
sum_nn = S[nn]
nn = i - 1
if nn < 0:
nn += N
sum_nn += S[nn]
nn = i + L
if nn >= N:
nn -= N
sum_nn += S[nn]
nn = i - L
if nn < 0:
nn += N
sum_nn += S[nn]
del_E = 2 * S[i] * sum_nn
if del_E <= 0:
S[i] = - S[i]
return del_E, 2 * S[i] / N
elif np.exp(-beta * sum_nn) > r:
S[i] = - S[i]
return del_E, 2 * S[i] / N
else:
return 0, 0
def random_sweep(S, N, L, beta, B = 0, J_v = 1, J_p = 1):
del_m_sweep = 0
del_He_sweep = 0
rand_list_index = np.random.randint(N, size=N)
rand_numbers = np.random.rand(N)
for i in range(N):
del_E, del_m = helix(S, rand_list_index[i], N, L, beta,
rand_numbers[i], B, J_v, J_p)
del_He_sweep += del_E
del_m_sweep += del_m
return del_He_sweep, del_m_sweep
我想将所有内容保持为numpy格式,因为据我了解,这将极大地提高计算速度。基本上我想只通过调用函数来替换random_sweep中的for循环
helix(S, rand_list_index, N, L, beta, rand_numbers, B, J_v, J_p)
,并使用numpy灵活性,它将自动调用螺旋函数N
次(基于参数rand_list_index
和rand_numbers
而不是rand_list_index[i]
和{ {1}})。到目前为止,我仍然无法执行此操作的原因是我必须更新索引rand_numbers[i]
上的S
数组。有没有办法解决此更新?
我已经尝试实现此功能已经有一段时间了,因此我非常感谢您的帮助!