使用numpy改善MonteCarlo仿真的运行时间

时间:2019-03-24 13:47:11

标签: python numpy runtime montecarlo

我已经在二维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_indexrand_numbers而不是rand_list_index[i]和{ {1}})。到目前为止,我仍然无法执行此操作的原因是我必须更新索引rand_numbers[i]上的S数组。有没有办法解决此更新?

我已经尝试实现此功能已经有一段时间了,因此我非常感谢您的帮助!

0 个答案:

没有答案