Python, Scipy - домашнее задание - как сохранить историю положения частиц в сетке - PullRequest
2 голосов
/ 14 ноября 2011

У меня следующая проблема:

Создайте программу, в которой частица выполнит случайное блуждание для N = 1000 шагов для этих двух случаев: i) в одномерной системе ii) в двумерной системе. Программа должна вычислить среднее значение (S), где S - количество позиций сетки, где частица посетила хотя бы один раз. Вы сделаете 10000 прогонов и найдете 10 точек (по одной на каждые 100 шагов от 0 до 1000), что быть средством 10000 прогонов. Делать график среднего (S) относительно времени t.

Я сделал этот код:

import scipy as sc
import matplotlib.pyplot as plt
import random

plegma=1000
grid=sc.ones(plegma)   # grid full of available positions(ones)    

for p in range(10000):
    #-------------------Initialize problem-------------------------------------------------
    his_pos=[]                  # list which holds the position of the particle in the grid
    in_pos = int(sc.random.randint(0,len(grid),1))            #initial position of particle
    means=[]                                                    #list which holds the means 
    #--------------------------------------------------------------------------------------
    for i in range(0,1000,100):
        step=2*sc.random.random_integers(0,1)-1        #the step of the particle can be -1 or 1
        # Check position for edges and fix if required
        # Move by step
        in_pos += step
        #Correct according to periodic boundaries
        in_pos = in_pos % len(grid)  

        #Keep track of random walk
        his_pos.append(in_pos)
        history=sc.array(his_pos)
        mean_his=sc.mean(history) 
        means.append(mean_his)


plt.plot(means,'bo')
plt.show()

ОБНОВЛЕНО -------------------------------------

import scipy as sc
import matplotlib.pyplot as plt
import random

plegma=1000
his_pos=[] # list which holds the number of visited cells in the grid
means=[] #list which holds the means

for p in range(10000):
    #-------------------Initialize problem-------------------------------------------------
    grid=sc.ones(plegma)   # grid full of available positions(ones)      
    in_pos = int(sc.random.randint(0,len(grid),1))            #initial position of particle
    num_cells=[]       # list which holds number of visited cells during run                         
    #--------------------------------------------------------------------------------------
    for i in range(1000):
        step=2*sc.random.random_integers(0,1)-1 #the step of the particle can be -1 or 1

        # Check position for edges and fix if required
        # Move by step
        in_pos += step
        #Correct according to periodic boundaries
        in_pos = in_pos % len(grid)  

        grid[in_pos]=0  # mark particle position on grid as "visited"

        if (i+1) % 100 == 0:

            number=1000-sc.sum(grid)  # count the number of "visited positions" in grid
            num_cells.append(number)  # append it to num_cells

      his_pos.append(num_cells) # append num_cells to his_pos
      history=sc.array(his_pos)


mean_his=history.mean(1)
means.append(mean_his)

ОБНОВЛЕНИЕ 2 ----------------------------- .....

    if (i+1) % 10 == 0:

            number=1000-sc.sum(grid)  # count the number of "visited positions" in grid
            num_cells.append(number)  # append it to num_cells

    his_pos.append(num_cells) # append num_cells to his_pos
    history=sc.array(his_pos)
mean_his=history.mean(0)

plt.plot(mean_his,'bo')
plt.show()

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

1) Да, 10000 шагов относятся к желаемой точности - вы должны получить среднее количество посещенных ячеек за время t = 100, 200 ... 1000 для 10000 случайных прогулок.Чтобы получить данные, вы должны накапливать количество посещенных ячеек за каждую случайную прогулку (10000).для этого вам нужно инициализировать вашу проблему (то есть инициализировать his_pos и means) вне цикла p.Внутри цикла p вы должны инициализировать свой случайный обход - получить сетку, начальные позиции и список, в который вы будете записывать результаты.Итак, проблема init будет выглядеть примерно так:

import scipy as sc
import matplotlib.pyplot as plt

plegma=1000
his_pos=[]  # list which holds the position of the particle in the grid
means=[]    #list which holds the means 

for p in range(10000):
    #-------Initialize problem--------
    in_pos = int(sc.random.randint(0,len(grid),1)) #initial position of particle
    grid=sc.ones(plegma)   # grid full of available positions(ones)    
    his_pos.append([])

После init нам нужно выполнить случайное блуждание - цикл i.В настоящее время вы делаете всего 10 шагов случайной прогулки (len(range(0,1000,100)) == 10), но прогулка должна содержать 1000 шагов.Следовательно, цикл i должен быть

    for i in range(1000):

Во время прогулки вы должны как-то пометить посещенные ячейки.Самый простой способ - поменять grid[in_pos] на 0. Затем на каждом сотом шаге нужно посчитать количество посещенных ячеек.Способ достижения этого выглядит следующим образом:

        if i % 100 == 0:
            # count the number of 0s in grid and append it to his_pos[p]

Наконец, в конце 1000 случайных прогулок ваш his_pos будет (10000 * 10) списком списков, из которых по столбцам следуетбыть взятым.

Обновление:

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

#-------Initialize problem--------
plegma=1000
his_pos=[]  # list which holds the number of visited cells in the grid
means=[]    #list which holds the means 

for p in range(10000):
    #-------Initialize run--------
    in_pos = int(sc.random.randint(0,len(grid),1)) #initial position of particle
    grid=sc.ones(plegma)   # grid full of available positions(ones)    
    num_cells = []  # list which holds number of visited cells during run  
    for i in range(1000):
        # make i-th step, get particle position
        # mark particle position on grid as "visited"
        if (i+1) % 100 == 0: # on each 100th step (steps count from 0, thus i+1)
            # count the number of "visited positions" in grid
            # append it to num_cells
    # append num_cells to his_pos
# find column-wise means for his_pos
0 голосов
/ 17 ноября 2011

Я не уверен, что понимаю, о чем просит проблема (где время t учитывается в ваших уравнениях? Что означает point?), Но относительно операций, которые вы пытаетесь выполнить,Я понимаю, что вы должны включить каждый или ваши 10-средние mean_his массивы, полученные в результате каждой итерации, в окончательный массив 10000x10 means.

Каждый массив mean_his подготовлен из 1D-массива с 100 шагами,Я приведу пример с массивом из десяти шагов, которые необходимо усреднять каждые два (вместо 1000 на 100):

>>> his_pos = [1,2,3,4,5,6,7,8,9,10]    #the ten positions
>>> history = np.array(his_pos)
>>> history
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> ar2 = np.reshape(history, (-1,2))   # group in two in order to calculate mean
>>> ar2
array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10]])
>>> mean_his = ar2.mean(1)
>>> mean_his
array([ 1.5,  3.5,  5.5,  7.5,  9.5])
>>>  

, затем вы добавляете mean_his к means 10000 раз и вычисляете аналогичносреднее (обратите внимание, что средства должны быть инициализированы вне внешнего цикла, чтобы не повторяться при каждом повторении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...