计算 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)
现在你可以绘制 MSD
对 taus
和 Bob 是你的叔叔
我有一个一维粒子轨迹,j=[]
和 time=np.arange(0, 10 + dt, dt)
,其中 dt
是时间步长。我根据this article.
我在 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)
现在你可以绘制 MSD
对 taus
和 Bob 是你的叔叔