随机游动和扩散行为 Python

Random walks and diffusive behaviour Python

扩散行为的特征是t步后步行者到原点距离的平方的平均值与步数成正比。
对几个助行器和步长重复这个过程(文本建议 500 个助行器和最多 100 个步),并绘制一个类似于教科书的图表来证实这一点。还要确认这种图形的斜率如预测的那样为 1。

我在Python中实现了下面的代码,每次我运行它得到的梯度都是想要的值的一半,我找不到错误。此外,这是所需的 graph, and my graph。任何人都可以发现代码有什么问题吗?

import numpy as np 
import matplotlib.pyplot as plt

nwalks=500
nsteps=100
x=np.zeros(nsteps)
x2avg=np.zeros(nsteps)

array=np.zeros((nwalks,nsteps))


for j in range(nwalks):
    x2=np.zeros(nsteps)  
    for i in range(1,nsteps):
        rnd=np.random.random()
        
        if rnd<0.5:
            x[i]=x[i-1]+1
        else:
            x[i]=x[i-1]-1
        
        x2[i]=x[i]**2
        x2avg[i]=(np.sum(x2))/(i+1)
        array[j,i]=x2avg[i]

y=np.mean(array, axis=0)      
i=np.arange(nsteps)
coeffs,cov=np.polyfit(i,y,1,cov=True)

grad=coeffs[0]
intercept=coeffs[1]
dgrad=np.sqrt(cov[0][0])
dintercept=np.sqrt(cov[1][1])
print(grad,dgrad)


f1=plt.figure(1)
plt.scatter(i,y,color='black',marker='.')
#generating a function of the form y=mx + c
func = np.poly1d(coeffs)
# Getting the trendline(y values)
trendline = func(i)

plt.plot(i,trendline, 'k')

我觉得你的行 x2avg[i]=(np.sum(x2))/(i+1) 是错误的。它计算第 i 个步行者所有步数的均方距离。

只需删除 x2x2avg 数组,并在每个内部循环中只使用 array[j, i] = x[i]**2

for j in range(nwalks):
    x2=np.zeros(nsteps)
    for i in range(1,nsteps):
        rnd=np.random.random()

        if rnd<0.5:
            x[i]=x[i-1]+1
        else:
            x[i]=x[i-1]-1

        array[j,i]=x[i]**2

你已经在下一行计算了平均值,这是正确的方法:

y=np.mean(array, axis=0)