【问题标题】:Mean-Squared Displacement (MATLAB)均方位移 (MATLAB)
【发布时间】:2012-03-24 21:45:44
【问题描述】:

请您帮助我了解如何计算在给定时间内随机移动的单个粒子的均方位移。我已经阅读了很多关于这方面的文章(包括 Saxton,1991,Single-Particle Tracking: The Distribution of Diffusion Coefficients),但仍然很困惑(没有得到正确的答案)。

首先让我向您展示我是如何做到的,如果我错了,请纠正我: 我这样做的方式如下:
1.从t=0到t=100运行程序
2.计算每个时间步长(即 t=1,2,3,...100)的位移 (s(t)-s(t+tau)) 并将其存储在向量中
3.将数字 2 的答案平方
4.找到3个答案的均值

本质上,这就是我在 Matlab 中所做的事情

%用由 16 个非零点阵点组成的正方形初始化点阵,然后按如下方式计算 MSD:

for t=1:tend    
% Allow the particle to move randomly in the lattice. Then do the following    
[row,col]=find(lattice>0);    
centroid=mean([row col]);    
xvec=[xvec centroid(2)];    
yvec=[yvec centroid(1)];    

k=length(xvec)-1;  % Time    
dt=1;       
diffx = xvec(1:k) - xvec((1+dt):(k+dt));    
diffy = yvec(1:k) - yvec((1+dt):(k+dt));    

xsquare = diffx.^2;    
ysquare = diffy.^2;    
MSD=mean(xsquare+ysquare);    
end

我试图找到 MSD 以计算扩散系数。请注意,我正在对晶格位置 (16) 的集合进行建模,以表示单个粒子(在生物学上更真实),而不仅仅是一个粒子。我对 for 循环中的评论很简短,因为它很长,但我很高兴将它发送给您。

到目前为止,我得到的 MSD 值非常小(在 0.001-1 的范围内),而我应该得到的值在 (10-50) 的范围内。粒子移动了很远的距离,所以我的 0.001-1 范围肯定是不对的!


这是我试图重现他们形象的文章的摘录:

" 我们首先在 1D 中运行一些模拟 细胞。我们允许细胞移动给定数量的 蒙特卡洛时间步长 (MCS),计算出均方 在那段时间走过的距离,重复这个过程500 次,并评估此 t 的均方距离。 然后我们重复这个过程十次以获得平均值 .选择这种重复的原因是 将运行模拟所需的时间保持在合理的范围内 水平但确保的标准偏差 平均值相对较小 ( 您可以在此处访问文章“从离散到连续的生物细胞运动模型,2004,Turner 等人,Physical Review E”。


非常感谢任何提示。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    粒子移动了多少维?

    我现在没有 Matlab,但这是我如何在一维上做到这一点的:

    % pos is the vector of positions
    delta = pos(2:100) - pos(1:99);
    meanSquared = mean(delta .* delta);
    

    【讨论】:

    • 粒子在二维上移动。这正是我正在做的,但与我应该得到的相比,我得到的 MSD 数量非常少。即使粒子最终到达 100x100 晶格的末端(初始位置:顶部),MSD~1。有什么想法吗?
    • 也许您应该给出 root 均方误差?所以 root(mean(delta .* delta)) ?
    • root(mean(delta .* delta)) 会给出更小的值,不是吗?
    • 我正在尝试重现一个图形,时间在 x 轴 (t=200,400,600,800) 和 在 y 轴上。它们的 值非常大(在 10-50 范围内),而我的值在 0.01-1 范围内。你确定我需要取平均值吗?因为如果我不取平均值,那么我会得到很大的值。我知道这听起来很傻。或者也许还有另一种我不知道的计算方法?感谢您的帮助。
    • 您能否提供更多信息或链接,以了解您尝试遵循的方法?您的方法在我看来是有效的,这让我认为您提出问题的方式尚不清楚。
    【解决方案2】:

    首先,为什么一个粒子会覆盖多个格点?最后,MSD 最重要的是质心的位移,它可以表示为一个点。如果你的粒子(或单元格)很大,或者只需要大步,你总是可以制作一个更宽的网格。另外,如果你想从其他地方复制一个图形,你应该使用相同的算法。

    对于您的蒙特卡洛模拟,您会做什么?如果您真正想要的是获得位移,您可以一次生成一堆随机运动矢量(使用randrandi),并使用cumsum 计算位置。另外,您是否绘制了随机游走以确保数据合理?

    然后,您的代码看起来有点滑稽(参见 cmets)。为什么不直接使用this answer 中提供的代码从位置计算 MSD?

    for t=1:tend    
    % Allow the particle to move randomly in the lattice. Then do the following    
    [row,col]=find(lattice>0); %# what do you do this for?
    centroid=mean([row col]);    
    xvec=[xvec centroid(2)];    
    yvec=[yvec centroid(1)];   %# till here, I have no idea what you want to do
    
    k=length(xvec)-1;  % Time  %# you should subtract dt here
    dt=1;                      %# dt should depend on t!
    diffx = xvec(1:k) - xvec((1+dt):(k+dt));    
    diffy = yvec(1:k) - yvec((1+dt):(k+dt));    
    
    xsquare = diffx.^2;    
    ysquare = diffy.^2;    
    MSD=mean(xsquare+ysquare);    
    end
    

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多