2016-06-07 13 views
0

Ich erkläre Ihnen mein Problem:Simulation und Histogramm von Random Hopping in Python

Stellen Sie sich vor, Sie haben eine Bar, mit sagen s Positionen. Jede Position kann als Position 0, Position 1, .., Position s-1 gezählt werden. Nun, was ich tun möchte, ist das Simulieren der folgenden: Zu einem bestimmten Zeitpunkt, eine Anzahl von Teilchen, sagen wir n Teilchen, beginnen in einem Zustand der Bar (eine Position in der Mitte annehmen). An diesem Punkt mit zufälligen Wahrscheinlichkeiten pr und pl (pr + pl = 1) gehen diese Teilchen nach rechts oder links. Im Grunde spiegelt die Wahrscheinlichkeit den Anteil der Teilchen wider, die nach rechts oder links wechseln.

Ich möchte dies einige Male wiederholen und sehen, was die endgültige Position der Partikel ist, und ein Histogramm davon aufzeichnen. Das ist meine Funktion Hop, die ich gemacht habe, um das Hopping der Partikel zu simulieren.

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 

Und hier ist der Rest, dass ich das Histogramm zeichnen verwendet:

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() 

Wo ich mathplotlib importiert haben, und ich habe speziell

import matplotlib.pyplot as plt 
import random 

Mein Problem ist, dass importierte Aus den Histogrammen, die ich erhalte, geht etwas sehr falsch. Tatsächlich sind die Histogramme alle nach links verschoben, was nicht möglich wäre, wenn die Wahrscheinlichkeiten zufällig gewählt werden. Außerdem zeigt das Histogramm nicht die richtigen Mengen an Partikeln an.

Versteht jemand, was schief läuft?

Dank

+0

Ich denke, der Hauptfehler könnte im Histogramm sein. Der Punkt ist, dass ich ein Histogramm haben möchte, das mir zeigt, wie viele Teilchen es in jedem Zustand am Ende gibt. Also würde die X-Achse alle Zustände darstellen, während die Y-Achse die Dichte der Teilchen darstellen würde! Aber ich verstehe es falsch –

+0

Weil ich denke, dass bis jetzt, was mein Code tut, ist einfach zu zählen, wie oft eine bestimmte Anzahl von Teilchen einen Zustand besetzen und dies als Höhe des Histogramms aufzeichnen. –

Antwort

1

Ich weiß nicht, ob ich Sie richtig verstanden habe, aber tun Sie dies anstelle eines Histogramms sehen?

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

Ja !! Danke! –

+0

Ich verstehe nicht, warum funktioniert das? –

+0

Kein Problem, das Balkendiagramm zeichnet jede Spalte zusammen mit ihrem in der Hop-Funktion berechneten Wert auf. Das Histogramm setzt diese Werte in Bins und zeichnet ihre Verteilung auf. Aus diesem Grund haben Sie kleinere Werte und weniger hohe Werte, wie Sie gesagt haben. Sehen Sie sich die Liste x im Variablen-Explorer an und überprüfen Sie deren Werte. Lukas – Gartmair