随机游动和扩散行为 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
个步行者所有步数的均方距离。
只需删除 x2
和 x2avg
数组,并在每个内部循环中只使用 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)
扩散行为的特征是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
个步行者所有步数的均方距离。
只需删除 x2
和 x2avg
数组,并在每个内部循环中只使用 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)