在捕获粒子的晶格上执行随机游走

计算科学 Python 计算物理学 麻木的
2021-12-12 21:03:03

我试图解决这个问题,我们有一个大小为 100 的一维晶格,粒子可以从晶格中的任何位置开始并在其上随机移动(移动到任一方向的概率相等)。当粒子到达晶格的任一端时,它就会停止。问题是绘制时间平均值(到达边界)与粒子的初始起始位置,对于每个起始位置,我们采用 10000 条轨迹来计算时间平均值。

这是我的代码

for i in range(1,size):
    timearr=[]
    for j in range(trails):
        time=0
        x=i
        while True:
            r = random.randint(-1,1)
            time+=1
            x+=r
            if x==0 or x==size:
                timearr.append(time)
                break
    timemean.append(np.mean(timearr))


xarr= np.arange(1,size)
plt.plot(xarr, timemean)
plt.show()

但是,将大小设为 100 并将试验设为 10000(甚至 1000),运行它需要大量时间。有什么方法可以使用 Python 更快地解决这个问题。理想情况下,我想使用 numpy 数组的矢量化方法来做到这一点。但我想不出在这种情况下如何实现控制流。

1个回答

如果您将问题改写为找到给定起始状态的马尔可夫链的平均首次通过时间 (MFPT),则可以更有效地解决此问题。您可以通过转移矩阵轻松表示晶格上的随机游走,并找到每个状态的 MFPT。该问题可以使用(数值)线性代数来解决。

最近对实现这一点的方法的调查可以在以下网址找到:https : //arxiv.org/abs/1701.07781 处理该主题的好书是:

JG Kemeny 和 JL Snell,有限马尔可夫链。D. Van Nostrand Co., Inc.,新泽西州普林斯顿-多伦多-伦敦-纽约,1960 年。

DA Levin、Y. Peres 和 EL Wilmer、Markov 链和混合时间。美国数学会,普罗维登斯,罗德岛州,2009 年。