2016-06-07 3 views
0

Я объясняю вам мою проблему:Моделирование и гистограмма случайного скачка в Python

Представьте, что у вас есть бар с указанием позиций. Каждая позиция может быть подсчитана как позиция 0, позиция 1, .., позиция s-1. Теперь то, что я хочу сделать, это симулировать следующее: в определенный момент времени число частиц, скажем n частиц, начинается в состоянии бара (предположим, что позиция посередине). В этот момент со случайными вероятностями pr и pl (pr + pl = 1) эти частицы идут соответственно справа или слева. Таким образом, в основном вероятность отражает долю частиц, которые меняются справа или слева.

Я хочу повторить это несколько раз и посмотреть, что является конечной позицией частиц и построить гистограмму. Это мой функциональный прыжок, который я сделал для моделирования прыжков частиц.

def hop(n): 
''' 
n is the number of particles starting in the middle position. 
''' 

s = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 
global ls 
ls = len(s) 
i = 0 

while i < 100: 
    for j in range(0,int(len(s))): 
     if s[j] != 0 : 
      pr = random.random() 
      pl = 1 - pr 
      if j - 1 < 0: 
       s[j+1] = s[j+1]+int(s[j]*pr) 
       s[j] = s[j] - int(s[j]*pr) 
      elif len(s) <= j+1: 
       s[j-1] = s[j-1] + int(s[j]*pl) 
       s[j] = s[j] - int(s[j]*pl) 
      else: 
       s[j-1] = s[j-1] + int(s[j]*pl) 
       s[j+1] = s[j+1] + int(s[j]*pr) 
       s[j] = s[j] - int(s[j]*pr) - int(s[j]*pl) 
      j+=1 
     elif s[j] == 0: 
      s[j] = 0 
      j+=1 
    i+=1 
return s 

А вот остальное, что я использовал для построения гистограммы:

x = hop(100) 
y = sum(x) #This is for debugging purposes, I want to check that I'm left 
      with the right number of particles 
list1 = [] 
for k in range(0,ls): 
    list1.append(k) 
plt.hist(x,list1) 
plt.show() 

Где я импортируемого mathplotlib и конкретно я импортировал

import matplotlib.pyplot as plt 
import random 

Моя проблема заключается в том, что из гистограмм, которые я получаю, это делает что-то очень неправильное. Действительно, гистограммы все перекошены влево, что было бы невозможно, если вероятности берутся произвольно. Кроме того, гистограмма не показывает мне нужное количество частиц.

Кто-нибудь понимает, что происходит не так?

Благодаря

+0

Я думаю, что основная ошибка может быть на гистограмме. Дело в том, что мне нужна гистограмма, которая показывает мне, сколько частиц есть в каждом состоянии в конце. Таким образом, ось x будет представлять все состояния, а ось y будет представлять плотность частиц! Но я ошибаюсь –

+0

Потому что я думаю, что до сих пор, что делает мой код, просто подсчитывается, сколько раз определенное количество частиц занимает состояние и намечает это как высоту гистограммы. –

ответ

1

Я не знаю, если я получил ты прав, но вы хотите увидеть это вместо гистограммы?

xs = np.arange(len(x)) 
width = 1/1.5 
plt.bar(xs,x,width) 
+0

Да! Спасибо! –

+0

Я не понимаю, почему это работает? –

+0

Нет проблем, штрих-код отображает каждый столбец вместе со значением, которое вы вычислили в функции перехода. Гистограмма помещает эти значения в ячейки и отображает их распределение. Вот почему вы заканчиваете с меньшими значениями и меньшими значениями, как вы сказали. Посмотрите на список x в проводнике переменных и проверьте его значения. Lukas – Gartmair