计算一维粒子的均方位移

时间:2018-11-23 09:02:58

标签: python numpy physics

我有一个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) 

任何人都可以检查验证代码并提供建议(如果有误)。

1 个答案:

答案 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)

现在您可以绘制MSDtaus,而Bob是您的叔叔