Броуновское движение в python 2D

#python #numpy #random

#python #numpy #Случайный

Вопрос:

Я хочу создать симулятор броуновского движения, моя частица будет начинаться с (0,0), начала координат, затем я создал случайные массивы NumPy для направления x и y, например, x = [-2,1,3] и y = [0, -2,1]. Поскольку частица начинается в начале координат (0-я точка), она переместится в следующую точку на -2 в направлении и 0 в y (1-я точка), а затем для 2-й точки она переместится на 1 единицу вправо ( 1 в x) и -2 единицы влево(-2 в y). Мой вопрос в том, как бы мне сделать так, чтобы каждая точка действовала как новое начало координат, как добавление векторов. Я думаю, мне понадобится какой-то цикл for, но не уверен, как я его настрою.

 import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation as am
np.random.seed(69420)
N=1000 #Number of steps
# Have the particle at the origin in 2D (x,y) plane
# Each step will have a lenght of 1 unit. Lets call it meters
# Each step is one second
# And this simulation will run for 100 seconds
## Now how to make a particle randomly walk???
t=100 # time interval
dt=t/N # delta time from each step
dx = np.random.randint(-5,5,N,dtype=int)# This would be our detla x for each step
dy = np.random.randint(-5,5,N,dtype=int)
dx_0 = np.zeros(N, dtype=int)
dy_0 = np.zeros(N,dtype=int)
X = dx_0 dx
Y = dy_0 dy
print(X)
xdis = np.cumsum(X)  #Total distance travled after N steps
ydis = np.cumsum(Y)
plt.plot(dx_0,dy_0,'ko')
plt.plot(xdis,ydis,'b-')
plt.show()
  

Это то, что у меня есть до сих пор. Любая помощь приветствуется.

Комментарии:

1. См . scipy-cookbook.readthedocs.io/items/BrownianMotion.html ; в конце статьи приведен пример вычисления 2D броуновского движения.

Ответ №1:

Вам нужно предпринять N шаги, начиная с (0,0) . Отслеживайте свои шаги, используя переменную prev = [0,0] , и вносите в нее изменения для каждого шага. Упрощенный код:

 prev = [0,0]
for i in range(N):
    new_x = prev[0] dx[i]
    new_y = prev[1] dy[i]
    # do what you need with new_x and new_y
    prev = [new_x, new_y]
  

Ответ №2:

Поскольку кажется, что вы хотите отобразить весь маршрут, просто просуммируйте все эти шаги?

 origin = np.array([0, 0])

x_series = np.cumsum(dx)   origin[0]

# (Similarly for y)
  

Это только для 1 случайного ходока. Если у вас есть несколько случайных ходоков — у каждого из них будет начальная точка и отдельная цепочка dx -s.