如何在MATLAB中将随机游走模拟向量化

9
我正在使用MATLAB重写蒙特卡罗模拟模型,强调可读性。该模型涉及许多粒子,表示为(x,y,z),在一小组具有一定终止概率的状态上进行随机游走。与输出相关的信息是在给定状态下终止的粒子数。
由于对于每个粒子单独运行会造成成本限制,因此模拟需要足够的粒子。向量化似乎是从MATLAB中获得性能的方法,但是否有惯用的方法在MATLAB中创建向量化版本的此模拟?
我正在努力实现这一点-我甚至尝试创建一个(nStates x nParticles)矩阵,表示每个粒子-状态组合,但是这种方法很快就会失控,因为粒子彼此独立地从一个状态跳到另一个状态。我应该咬紧牙关,转向更适合此类问题的语言吗?

给出的问题细节如此之少,很难提供有用的评论。 - Matthias Wandel
2
抱歉,我试图保持抽象以增加清晰度。我正在模拟有机材料层间的光传输。每个粒子(光子)都会撞击材料并可能被反射或折射。这取决于材料属性和入射角的概率。粒子可以在层内“弹跳”。我想知道总共有多少粒子被反射,有多少通过。我通过发射许多粒子并跟踪它们的路径来实现这一点。问题是,如何将这些路径作为矢量化代码跟踪,而不是为每个粒子使用while循环。 - turtlesoupy
1个回答

3

只需按照正常的方式编写代码。几乎所有的matlab函数都可以接受和返回向量化的输入。例如,要模拟N个粒子在1维中的布朗运动

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 = 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);

等等


2
这真的很有帮助。我有一个额外的问题:在我的情况下,粒子由三维速度和层号(整数)表示,即一个四元组。我需要根据层号实现不同的行为。我们如何更改示例以具有多个函数,这些函数取决于元组的第一个元素,并保持矢量化?例如,可能会有6个“newstep”函数,其选择取决于哪个层。 - turtlesoupy
我能否使用上述函数来模拟一组移动用户?如果可以,如何将用户参数(例如传输功率和干扰)包含到上述函数中? - user804599

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接