Создание графиков, которые показывают распределение в пространстве большого количества 2D случайных прогулок в трех разных временных точках - PullRequest
0 голосов
/ 18 сентября 2018

Так что, по сути, у меня есть этот код, который я могу использовать для генерации 2D случайного блуждания дискретно по N количеству шагов с М числом пешеходов. Я могу нарисовать их все на одном графике здесь.

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 () для создания всех трех графиков вместе на одном рисунке.

Ценю любую помощь!

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Я продемонстрирую одномерный случай для ясности;вам нужно реализовать это только для каждого добавляемого измерения.

Модель N шаги для M ходунков с использованием N x M matrix.

>> 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 matrix s, содержащую обновленные позиции после каждого шага.где s(N,M) дает положение ходунка M после N шагов.

Используйте 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

Этот метод очень хорошо масштабируетсяк 2- и 3-мерным случайным прогулкам.

0 голосов
/ 18 сентября 2018

Вы можете использовать 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;

Результаты:

enter image description here

РЕДАКТИРОВАТЬ:

Благодаря @LuisMendo, который ответил на мой вопрос здесь , вы можете использовать биномиальное распределение, чтобы получить тот же результат:

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 справится с этим.Потому что в первом решении у вас есть грубое решение, а во втором случае статистическое решение.

0 голосов
/ 18 сентября 2018

Если вы хотите показать распределение большого числа, скажем 1000, этих точек, я бы сказал, что наиболее подходящим способом построения графика является «облако точек» с использованием scatter.Затем вы создаете массив из N точек для координат x и y и позволяете ему вычислять координату в цикле 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, так что я предполагаю, что есть шанс (по общему признанию, маленький) не изменить координату.Я не уверен, что вы хотели, чтобы такое поведение было возможным (ходок стоит на месте)?

...