Вычисление среднего квадратического смещения 2d случайного блуждания в Python

Я имитирую двумерное случайное блуждание с направлением 0 <θ <2π и T = 1000 шагов. У меня уже есть код, который имитирует одиночную прогулку, повторяет его 12 раз и сохраняет каждый запуск в последовательно названные текстовые файлы:

a=np.zeros((1000,2), dtype=np.float) print a # Prints array with zeros as entries # Single random walk def randwalk(x,y): # Defines the randwalk function theta=2*math.pi*rd.rand() x+=math.cos(theta); y+=math.sin(theta); return (x,y) # Function returns new (x,y) coordinates x, y = 0., 0. # Starting point is the origin for i in range(1000): # Walk contains 1000 steps x, y = randwalk(x,y) a[i,:] = x, y # Replaces entries of a with (x,y) coordinates # Repeating random walk 12 times fn_base = "random_walk_%i.txt" # Saves each run to sequentially named .txt for j in range(12): rd.seed() # Uses different random seed for every run x, y = 0., 0. for i in range(1000): x, y = randwalk(x,y) a[i,:] = x, y fn = fn_base % j # Allocates fn to the numbered file np.savetxt(fn, a) # Saves run data to appropriate text file 

Теперь я хочу рассчитать среднее квадратическое смещение во всех 12 прогулках. Чтобы сделать это, моя первоначальная мысль заключалась в том, чтобы импортировать данные из каждого текстового файла обратно в массив numpy, например:

 infile="random_walk_0.txt" rw0dat=np.genfromtxt(infile) print rw0dat 

А потом каким-то образом манипулируйте массивами, чтобы найти среднее квадратическое смещение.

Есть ли более эффективный способ найти MSD с тем, что у меня есть?

    2 Solutions collect form web for “Вычисление среднего квадратического смещения 2d случайного блуждания в Python”

    Вот быстрый snipet для вычисления среднего квадратного смещения (MSD). Там, где путь сделан из точек, одинаково разнесенных во времени, как это, кажется, имеет место для вашего randwalk. Вы можете просто разместить в цикле 12-walk for и вычислить его для каждого a [i ,:]

     #input path =[ [x1,y1], ... ,[xn,yn] ]. def compute_MSD(path): totalsize=len(path) msd=[] for i in range(totalsize-1): j=i+1 msd.append(np.sum((path[0:-j]-path[j::])**2)/float(totalsize-j)) msd=np.array(msd) return msd 

    Во-первых, вам не нужно хранить всю 1000-шаговую прогулку, только конечную позицию.

    Кроме того, нет причин хранить их в текстовых файлах и загружать их обратно, вы можете просто использовать их в памяти – просто поместите их в список массивов или в массив из 1 большего размера. Даже если вам нужно их выписать, вы можете сделать это, а также сохранить окончательные значения вместо вместо. (Кроме того, если вы на самом деле не используете numpy для производительности или простоты при построении 2D-массива, вам может потребоваться построить его итеративно, например, с помощью модуля csv , но это скорее вызов для решения.)

    Во всяком случае, учитывая ваши 12 конечных позиций, вы просто вычисляете расстояние каждого из (0, 0) , затем округляете их, суммируете их и делите на 12. (Или, поскольку очевидный способ вычислить расстояние от (0, 0) состоит в том, чтобы просто добавить квадраты позиций x и y а затем squareroot результат, просто пропустите квадрат и квадрат в конце.)

    Но если вы хотите сохранить каждую целую прогулку в файл по какой-то причине, то после того, как вы загрузите их обратно, walk[-1] дает конечную позицию в виде 1D массива из 2 значений. Таким образом, вы можете либо прочитать эти 12 конечных позиций в массив 12×2, и векторизовать среднее квадратное расстояние, либо просто скопировать их в список и сделать это вручную.

    Пока мы это делаем, rd.seed() не требуется; вся точка PRNG заключается в том, что вы продолжаете получать разные цифры, если вы явно не переустановите исходное значение семени, чтобы повторить их.

    Вот пример того, как сбросить две лишние сложности и сделать все прямо:

     destinations = np.zeros((12, 2), dtype=np.float) for j in range(12): x, y = 0., 0. for i in range(1000): x, y = randwalk(x, y) destinations[j] = x, y square_distances = destinations[:,0] ** 2 + destinations[:,1] ** 2 mean_square_distance = np.mean(square_distances) 
    Python - лучший язык программирования в мире.