我有一个1D的粒子轨迹,j=[]
,对于time=np.arange(0, 10 + dt, dt)
,其中dt
是时间步长。我已经根据this article计算了MSD。
我已经在Google和此处搜索了python中的1d MSD,但没有找到合适的一个,因为我的python知识非常初级。我已经编写了一个代码,并且可以正常运行,但是根据给定的文章,我不确定它代表的是同一件事。这是我的代码,
j_i = np.array(j)
MSD=[]
diff_i=[]
tau_i=[]
for l in range(0,len(time)):
tau=l*dt
tau_i.append(tau)
for i in range(0,(len(time)-l)):
diff=(j_i[l+i]-j_i[i])**2
diff_i.append(diff)
MSD_j=np.sum(diff_i)/np.max(time)
MSD.append(MSD_j)
任何人都可以检查验证代码并提供建议(如果有误)。
答案 0 :(得分:1)
该代码基本上是正确的,这是其中的修改版本:
range
)np.mean
校正了平均值,因为MSD是平方位移[L ^ 2],而不是比率[L ^ 2] / [T]。最终代码:
j_i = np.array(j)
MSD = []
diff_i = []
tau_i = []
for l in range(len(time)):
tau = l*dt
tau_i.append(tau)
for i in range(len(time)-l):
diff = (j_i[l+i]-j_i[i])**2
diff_i.append(diff)
MSD_j = np.mean(diff_i)
MSD.append(MSD_j)
编辑:我意识到我忘了提到它了,因为我只专注于代码,但是顾名思义,本文中用<。>表示的整体平均应该对多个粒子,优先在时间tau
之后将每个粒子的初始位置与其新位置进行比较,而不是像使用某种时间平均方法那样
编辑2:这是一个代码,该代码显示如何进行适当的整体平均以准确实现本文中的公式
js = # an array of shape (N, M), with N the number of particles and
# M the number of time points
MSD_i = np.zeros((N, M))
taus = []
for l in range(len(time)):
taus.append(l*dt) # store the values of tau
# compute all squared displacements at current tau
MSD_i[:, l] = np.square(js[:, 0] - js[:, l])
# then, compute the ensemble average for each tau (over the N particles)
MSD = np.mean(MSD_i, axis=0)
现在您可以绘制MSD
对taus
,而Bob是您的叔叔