Случайное блуждание в Matlab, как подсчитать, сколько «частиц» заканчивается в одном и том же столбце y (и укладываются друг на друга)?

Я создал функцию, которая генерирует N частиц для случайного блуждания по одной за раз.

Я отследил конечное местоположение каждой частицы («результат»). Однако я хотел бы сохранить частицу в конечном положении (то есть, когда y = 99). Когда генерируется новая частица, конечное положение должно быть при y=99 ИЛИ когда частица приземляется поверх конечного положения предыдущей частицы.

Может ли кто-нибудь указать мне направление для достижения этого?

На данный момент мой код останавливает частицу при y=99, но не учитывает, приземляется ли она поверх другой частицы (т.е. если частица уже есть в точке (50,99), новая частица должна остановиться в точке (50,98). ) не (50,99))

function [result]=random_walk_gravity(N,s,w,e)

%N (the number of particles),  and s, w, e (the probabilities of moving south, west and east).

result = zeros(1,N);

for k=1:N

    %start particle i at x0, y0
    %In this case, all particles  will start in column 50 in the top row
    %step with stepsize 1 either South, West or East

    %sample u(0,1) with the equal probability of moving in the east, west or
    %south direction

    i=1;


    % x(i)=50;
    % y(i)=1;


    y(i)=1;
    x(i)=50;

    %for k=1:n
    %generate random number between 0 and 1, N times
    u=rand();


    while y(i)<99 %we want it to stop at y=99 and look at the x-value

        if (0<=u)&&(u<=e) && (x(i)<99) %Check that the x position is less than 99
            %Move east, therefore xposition is increased by 1 unit
            x(i+1)= x(i)+1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        elseif (0<=u)&&(u<=e) && (x(i)>=99) %Check if the x position is greater than or equal to 99
            %particle hits the side boundary it moves back in the direction
            %it came from (west)
            x(i+1)= x(i)-1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        elseif (e<u)&&(u<=(e+w))&& (x(i)>0) %Check that the x position is greater than 0
            %Move west, therefore xposition is increased by 1 unit
            x(i+1)= x(i)-1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        elseif (e<u)&&(u<=(e+w))&& (x(i)<0)
            %Check if the x position is less than or equal to 0
            %particle hits the side boundary it moves back in the direction
            %it came from (east)
            x(i+1)= x(i)+1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        else %Move south, therefore yposition is increased by 1 unit
            x(i+1)= x(i);
            y(i+1)= y(i)+1;
            i=i+1;
            u=rand();

        end

    end

    result(k) = x(i);
    histogram(result)
end

person Lauren    schedule 25.08.2019    source источник


Ответы (1)


Я немного не понимаю пару вещей, но приведенный ниже код должен останавливать частицу, если она перемещается в положение непосредственно на 1 шаг выше положения покоя любой предыдущей частицы.

  • Примечание. Я исправил то, что казалось опечаткой в ​​​​строке elseif (e<u)&&(u<=(e+w))&& (x(i)<0).

  • Я разделил ваш массив результатов на результаты X и результаты Y. Это не является строго необходимым, если это может вызвать проблемы в другом месте, но, похоже, это упрощает расчет.

  • Основное дополнение состоит в том, что в конце каждой итерации while (после того, как частица переместилась) код проверяет, существуют ли какие-либо предыдущие частицы с конечными координатами покоя, которые находятся непосредственно на 1 шаг ниже текущей позиции этой частицы (т. е. той же координаты x и на 1 больше, чем текущая координата y). Если есть, то цикл while прерывается и частица там останавливается.

function [resultX, resultY]=random_walk_gravity(N,s,w,e)

%N (the number of particles),  and s, w, e (the probabilities of moving south, west and east).

resultX = nan(1,N); % I'd recommend using NaN rather than 0 here.
resultY = nan(1,N);

for k=1:N

    %start particle i at x0, y0
    %In this case, all particles  will start in column 50 in the top row
    %step with stepsize 1 either South, West or East

    %sample u(0,1) with the equal probability of moving in the east, west or
    %south direction

    i=1;


    % x(i)=50;
    % y(i)=1;


    y(i)=1;
    x(i)=50;

    %for k=1:n
    %generate random number between 0 and 1, N times
    u=rand();


    while y(i)<99 %we want it to stop at y=99 and look at the x-value

        if (0<=u)&&(u<=e) && (x(i)<99) %Check that the x position is less than 99
            %Move east, therefore xposition is increased by 1 unit
            x(i+1)= x(i)+1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        elseif (0<=u)&&(u<=e) && (x(i)>=99) %Check if the x position is greater than or equal to 99
            %particle hits the side boundary it moves back in the direction
            %it came from (west)
            x(i+1)= x(i)-1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        elseif (e<u)&&(u<=(e+w))&& (x(i)>0) %Check that the x position is greater than 0
            %Move west, therefore xposition is increased by 1 unit
            x(i+1)= x(i)-1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        elseif (e<u)&&(u<=(e+w))&& (x(i)<=0) % You had just <0 rather than <=0
            %Check if the x position is less than or equal to 0
            %particle hits the side boundary it moves back in the direction
            %it came from (east)
            x(i+1)= x(i)+1;
            y(i+1)= y(i);
            i=i+1;
            u=rand();

        else %Move south, therefore yposition is increased by 1 unit
            x(i+1)= x(i);
            y(i+1)= y(i)+1;
            i=i+1;
            u=rand();

        end

        % If there are any particles with the same X coordinate that
        % stopped 1 Y coordinate below this particle's current position,
        % then end the walk now.
        if any(x(i)==resultX & (y(i)+1)==resultY)
            break
        end

    end

    resultX(k) = x(i);
    resultY(k) = y(i);
    histogram(resultX)
end

Очевидно, скажите, если это не совсем то, что вы имели в виду. Однако, в частности, есть пара вещей, в которых я не был уверен:

  • Вы хотите, чтобы частица останавливалась немедленно, если она движется выше точки покоя предыдущей частицы, или только если она пытается двигаться на юг в положение покоя предыдущей частицы? Например, если есть покоящаяся частица в точке (X=51,Y=99), а новая частица движется на запад от (X=52,Y=98) до (X=51,Y=98), так что она прямо выше предыдущей частицы, вы хотите, чтобы частица остановилась немедленно (как в приведенном выше коде) или только если она затем попытается двигаться на юг на следующем шаге? Разница здесь в том, хотите ли вы, чтобы частица могла двигаться горизонтально чуть выше предыдущей частицы без «застревания» или нет.

  • Приведенный выше код позволит нескольким частицам накладываться друг на друга. Таким образом, если три частицы уже остановились в точке X=51, их соответствующие позиции Y будут равны 99, 98 и 97. Затем другая частица «остановится», если она переместится в координату (X=51, Y=96). Однако что вы хотите, чтобы произошло, если частица попытается переместиться на запад из координаты (X=52,Y=97) в (X=51,Y=97). Здесь новая частица пытается перейти в положение покоя предыдущей частицы, но сбоку (а не сверху). Что бы вы хотели, чтобы произошло в такой ситуации? Например, вы можете захотеть, чтобы частицы могли (а) двигаться через предыдущие частицы таким же образом, (б) менять направление (например, когда они достигают границ в точках 0 и 99), (в) падать прямо вниз и останавливаться. , (d) остановиться там, где она есть (т.е. «застрять» сбоку от стопки предыдущих частиц, даже если непосредственно под ней нет никаких частиц)?

person Craig Arnold    schedule 25.08.2019