【问题标题】:How to vectorize a random walk simulation in MATLAB如何在 MATLAB 中对随机游走仿真进行矢量化
【发布时间】:2010-09-24 02:34:46
【问题描述】:

我正在用 MATLAB 重写蒙特卡罗仿真模型,重点是可读性。该模型涉及许多粒子,表示为 (x,y,z),在具有一定终止概率的一小组状态上随机游走。与输出相关的信息是终止于给定状态的粒子数。

模拟需要足够多的粒子,因此单独为每个粒子运行它的成本太高了。向量化似乎是从 MATLAB 中获得性能的方法,但是有没有什么惯用的方法可以在 MATLAB 中创建这个仿真的向量化版本?

我正在努力实现这一点 - 我什至尝试创建一个 (nStates x nParticles) 矩阵来表示每个粒子状态组合,但是这种方法在可读性方面很快就失控了,因为粒子相互独立地从一个州跳到另一个州。我应该硬着头皮改用更适合这个的语言吗?

【问题讨论】:

  • 当您对问题的性质提供这么少的细节时,很难做出有用的 cmets。
  • 抱歉,为了清楚起见,我试图将其抽象化。我正在模拟通过有机材料层的光传输。每个粒子(光子)撞击材料并可以反射或折射。这是通过与材料特性和入射角成比例的某种概率确定的。粒子可以在层内“反弹”。我想知道整体反映了多少,通过了多少。我通过拍摄许多粒子并追踪它们的路径来做到这一点。问题是,如何将这些路径作为矢量化代码而不是每个粒子的 while 循环来跟踪。

标签: matlab simulation vectorization montecarlo markov-chains


【解决方案1】:

只需像往常一样编写代码即可。几乎所有的 matlab 函数都可以接受和返回矢量化输入。例如,模拟一维 N 个粒子的布朗运动

position = zeros([N 1]); %start at origin
sigma = sqrt(D * dt); %D is diffusion coefficient, dt is time step
for j = 1:numSteps
    position = position + sigma*randn(size(position));
end

如果您想为每个位置设置不同的 sigma,您可以将 sigma 设为与位置大小相同的向量,并使用“点次”表示法来指示逐个元素的操作

position = position + sigma.*randn(size(position));

如果散射是位置和一些随机元素的任意函数,您只需要编写一个矢量化函数,例如

function newstep = step(position)
%diffusion in a overdamped harmonic potential
newstep = -dt*k*position + D*randn(size(position));

for j = 1:numsteps; position = position + step(position);

等等

【讨论】:

  • 这真的很有帮助。我还有一个问题:在我的例子中,粒子由 3D 速度和层数(整数)表示,即 4 元组。根据层数,我需要不同的行为。我们如何根据元组的第一个元素将示例更改为具有多个函数并使其保持向量化?例如。可能有 6 个“newstep”函数,其选择取决于哪一层。
  • 我可以使用上面的函数来模拟一组移动用户吗?如果是,如何将发射功率和干扰等用户参数包含在上述函数中。
猜你喜欢
  • 1970-01-01
  • 2018-07-24
  • 2014-02-19
  • 2015-06-16
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多