因此,基本上,我在这里有这段代码,可以用来沿着N个步长和M个助步器离散地生成2D随机游走。我可以将它们全部绘制在同一张图上。
clc;
clearvars;
N = 500; % Length of the x-axis, also known as the length of the random walks.
M = 3; % The amount of random walks.
x_t(1) = 0;
y_t(1) = 0;
for m=1:M
for n = 1:N % Looping all values of N into x_t(n).
A = sign(randn); % Generates either +1/-1 depending on the SIGN of RAND.
x_t(n+1) = x_t(n) + A;
A = sign(randn); % Generates either +1/-1 depending on the SIGN of RAND.
y_t(n+1) = y_t(n) + A;
end
plot(x_t, y_t);
hold on
end
grid on;
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'Outerposition', [0, 0.05, 1, 0.95]);
axis square;
现在,我希望能够创建图形来显示大量位置在空间中的分布 (例如n = 1000)个随机步行者,分别在三个不同的时间点(例如t = 100、200和300或实际上是任何三个时间点)。
我不确定该怎么做,我需要将其转换为函数并在三个不同的时间对其进行迭代并存储坐标?我有一个大概的主意,但对实际实施持怀疑态度。我认为最安全,最不混乱的方法是使用subplot()在同一图中一起创建所有三个图。
感谢任何帮助!
答案 0 :(得分:1)
您可以使用cumsum
使过程线性化。基本上,您只想累加由[-1和1]组成的随机矩阵。
clc;
close all;
M = 50; % The amount of random walks.
steps = [10,200,1000]; % here we analyse the step 10,200 and 1000
cc = hsv(length(steps)); % manage the color of the plot
%generation of each random walk
x = sign(randn(max(steps),M));
y = sign(randn(max(steps),M));
xs = cumsum(x);
xval = xs(steps,:);
ys = cumsum(y);
yval = ys(steps,:);
hold on
for n=1:length(steps)
plot(xval(n,:),yval(n,:),'o','markersize',1,'color',cc(n,:),'MarkerFaceColor',cc(n,:));
end
legend('10','200','1000')
axis square
grid on;
结果:
编辑:
感谢@LuisMendo回答了我的问题here,您可以使用二项分布来获得相同的结果:
steps = [10,200,10000];
cc = hsv(length(steps)); % manage the color of the plot
M = 50;
DV = [-1 1];
p = .5; % probability of DV(2)
% Using the @LuisMendo binomial solution:
for ii = 1:length(steps)
SDUDx(ii,:) = (DV(2)-DV(1))*binornd(steps(ii), p, M, 1)+DV(1)*steps(ii);
SDUDy(ii,:) = (DV(2)-DV(1))*binornd(steps(ii), p, M, 1)+DV(1)*steps(ii);
end
hold on
for n=1:length(steps)
plot(SDUDx(n,:),SDUDy(n,:),'o','markersize',1,'color',cc(n,:),'MarkerFaceColor',cc(n,:));
end
legend('10','200','1000')
axis square
grid on;
有什么好处?即使您有很多步骤,比如说1000000,matlab也可以处理它。因为在第一个解决方案中您有蛮力解决方案,在第二个解决方案中您有统计解决方案。
答案 1 :(得分:0)
如果要显示大量(例如1000个)这些点的分布,我想说,最合适的绘图方式是使用scatter
作为“点云”。然后为x和y坐标创建一个N
点的数组,并让它在循环for i = 1:Nt
中计算坐标,其中Nt
将为100、200或300如您所描述。遵循以下原则:
N = 500;
x_t = zeros(N,1);
y_t = zeros(N,1);
Nt = 100;
for tidx = 1:Nt
x_t = x_t + sign(randn(N,1));
y_t = y_t + sign(randn(N,1));
end
scatter(x_t,y_t,'k*');
这将为您提供N
x和y坐标,其生成方式与您提供的示例相同。
要记住的一件事是sign(0)=0
,所以我想有一个机会(当然是一个很小的机会)不会改变坐标。我不确定您是否希望这种行为成为可能(步行者静止不动)?
答案 2 :(得分:0)
为清楚起见,我将演示一维情况;您只需为添加的每个维度实施此操作。
使用 N x M 矩阵对 M 步行者进行N N 步骤建模。
>> N = 5;
>> M = 4;
>> steps = sign(randn(N,M));
steps =
1 1 1 1
-1 1 -1 1
1 -1 -1 -1
1 1 -1 1
1 -1 -1 -1
对于绘图,制作第二个 N x M 矩阵s
很有用,其中包含每个步骤之后的更新位置,其中s(N,M)
在 N 个步骤后给出步行者 M 的位置。
使用cumsum
进行矢量化,而不是循环。
>> s = cumsum(steps)
s =
1 1 1 1
0 2 0 2
1 1 -1 1
2 2 -2 2
3 1 -3 1
为防止绘图在每行后重绘,请使用hold on
。
>> figure; hold on
>> plot(1:N, s(1:N, 1:M), 'marker', '.', 'markersize', 20, 'linewidth', 3)
>> xlabel('Number of steps'); ylabel('Position')
输出图如下:picture
该方法可以很好地扩展到二维和三维随机游动。