【问题标题】:Random walks and diffusive behaviour Python随机游走和扩散行为 Python
【发布时间】:2021-03-17 21:51:41
【问题描述】:

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

我在 Python 中实现了以下代码,每次运行时,我得到的渐变都是想要的值的一半,但我找不到错误。此外,这是所需的graph,也是我的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')

【问题讨论】:

    标签: python random-walk


    【解决方案1】:

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

    只需删除 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)
    

    【讨论】:

    • 谢谢,这完全解决了问题!
    • 有点离题,但在 a*a 上执行求积比在 a**2 上执行求积要快得多。我的机器在 py 3.6.7 下为 0.35 ns 与 0.13 ns。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2021-07-29
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多