计算 1d 中单个粒子的均方位移

Calculating Mean Square Displacement for a single particle in 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) 

谁能检查一下验证码,如果有错请提出建议。

代码大部分是正确的,这里是修改后的版本:

  • 我简化了一些表达式(例如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 是你的叔叔