【发布时间】:2020-12-09 07:42:27
【问题描述】:
我想计算一维轨迹的所有时间的均方位移。我是新手程序员,所以我通过模拟随机游走进行了尝试。
import numpy as np
import matplotlib.pyplot as plt
# generate random walk
path = np.zeros(60)
position = 0
for i in range(1, path.size):
move = np.random.randint(0, 2)
if move == 0: position += -1
else: position += 1
path[i] = position
# returns a vector of MSDs from a given path
def calcMSD(data):
msd = np.zeros(data.size - 1)
for i in range(1, data.size):
squareddisplacements = (data[i:] - data[:data.size - i])**2
msd[i - 1] = squareddisplacements.mean()
return msd
msd = calcMSD(path)
plt.plot(msd)
plt.show()
我是否正确实施了这一点?感谢您提供任何和所有建议,谢谢。
【问题讨论】:
-
“走路”是什么意思?
-
路径生成部分看起来不错。我不相信
calcMSD。你到底想计算什么?您是从一条路径计算它,您不想对一堆路径进行平均吗?我只是不知道这里的目标,最好是你解释一下或发布一个链接到你试图复制的任何计算。此外,您可能缺少msd[i - 1] = np.sqrt(squareddisplacements.mean())中的平方根,并且可能缺少“i”除法?再次真的取决于您要计算的内容 -
@piterbarg 感谢您的回复。我正在尝试计算每个时间间隔与起始位置的平均平方距离。因此,如果我有 60 个时间点,我将首先计算大小为 1、大小为 2、然后一直到大小为 60 的时间间隔。在 60 时,只有该大小的 1 步,所以它只会计算终点到起点的距离。例如,如果 p(t) 为您提供作为时间函数的位置,那么我在 t = 1 时尝试计算的内容将是: [p(1) - p(0))**2 + (p( 2) - p(1))**2 + … + (p(n) - p(n - 1))**2] / n
-
@Luke 在我看来,您的代码正是这样做的。您的代码可以简化一点。例如,您的路径循环可以是简单的
for i in range(1, path.size): path[i] = path[i-1] + 2*np.random.randint(0, 2)-1。同样在calcMSD函数中,data[:data.size - i]可以用更 Pythonic 的方式编写为data[:- i]。否则对我来说看起来不错
标签: python tracking particles random-walk