Statistische Physik
Computerübung 1
Emilie Baron 10027998, Santiago Cardona Aristizabal 10025424
#imports
import numpy as np
import matplotlib as mplt
from matplotlib import pyplot as plt
import random
def random_walk(dim, k):
"""Random-Walk in d Dimensionen und k Schritten.
Jeder Schritt wird im Anschluss als einzelnes Array ausgegeben."""
#für d-dimensionale Arrays
walk = np.zeros((k+1, dim))
for i in range(k):
step = np.zeros(dim)
for j in range(dim):
step[j] = random.uniform(-1/2, 1/2)
walk[i+1] = walk[i] + step
return [walk]
#Wir überprüfen, dass jeder Schritt als einzelnes Array ausgegeben wird.
print(random_walk(2, 5))
fig, ax = plt.subplots(figsize=(10, 3), dpi=100)
k1 = 10000
#Abspeichern der Random Walks zum Plotten
RW1_1 = random_walk(1, k1)
RW1_2 = random_walk(1, k1)
RW1_3 = random_walk(1, k1)
#Darstellen der drei eindimensionalen Random Walks
ax.plot(RW1_1[0], label='Random Walk 1')
ax.plot(RW1_2[0], label='Random Walk 2')
ax.plot(RW1_3[0], label='Random Walk 3')
#Einstellungen für den Plot
ax.set(title='1-D Random Walks')
ax.grid()
ax.set_xlim(0, k1)
ax.set_xlabel('time')
ax.set_ylabel('position')
ax.legend(loc="upper right")
plt.show()
#Abspeichern der Random Walks für das Plotten:
RW2_1 = random_walk(2, k1)
RW2_2 = random_walk(2, k1)
RW2_3 = random_walk(2, k1)
fig, ax = plt.subplots(figsize=(10, 5), dpi=100)
plt.scatter(RW2_1[0][:,0], RW2_1[0][:,1], s=1, c='blue', marker='o', label="Random Walk 1")
plt.scatter(RW2_2[0][:,0], RW2_2[0][:,1], s=1, c='red', marker='o', label="Random Walk 2")
plt.scatter(RW2_3[0][:,0], RW2_3[0][:,1], s=1, c='orange', marker='o', label="Random Walk 3")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Positionen der Schritte von 2-D Random Walks ")
plt.legend(loc='upper right')
plt.show()
def walkers(dim, k, w):
"""w Random-Walker in d Dimensionen und k Schritten.
Ausgegeben werden die Endpunkte der einzelnen Random Walkers nach jeweils k Schritten in d Dimensionen."""
#für d-dimensionale Arrays
walker_positions = np.zeros((w, dim))
for l in range(w):
walks = np.zeros(dim)
for m in range(k):
step = np.zeros(dim)
for n in range(dim):
step[n] = random.uniform(-1/2, 1/2)
walks += step
walker_positions[l] = walks
return [walker_positions]
#Überprüfen
walkers(2, 1, 5)
#Abspeichern der Random Walks für das Plotten:
w1 = 10000 #Anzahl der Random Walkers
RW5_1 = walkers(2, 1, w1) #Positionen der Random Walkers nach k=1 Schrittem
RW5_2 = walkers(2, 10, w1) #Positionen der Random Walkers nach k=10 Schritten
fig = plt.subplots(figsize=(10, 5), dpi=100)
plt.scatter(RW5_1[0][:,0], RW5_1[0][:,1], s=1, c='blue', marker='o', label="k=1")
plt.scatter(RW5_2[0][:,0], RW5_2[0][:,1], s=1, c='red', marker='o', label="k=10")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Endpositionen von 10000 Random Walkers in 2-Dimensionen nach 1 und 10 Schritten")
plt.legend(loc='upper right')
plt.show()
def gauss(x, k):
w = 10000
positions = np.zeros(w)
for i in range(10000):
for j in range(k):
step = random.uniform(-1/2, 1/2)
walks = 0
walks += step
positions[i] = walks
mu = np.mean(positions) #mittelwert
sigma = np.std(positions, ddof=1) #varianz
gauss = 1 / (np.sqrt(2 * np.pi) * sigma) * np.exp(-((x - mu) ** 2)/(2 * sigma ** 2))
return gauss
#in der augabe müssen nocvh mittelwert und std nachgewiesen werden
#Wir wollen zeigen dass die Gaußverteilung einen Mittelwert bei 0 hat.
#Wir definieren k = 10 und zunächst ein exemplarisches Array über den Bereich der maximalen Weglänge k*1/2
x = np.linspace(-5, 5)
np.mean(gauss(x, 10))
#Abspeichern der Positionen für das Histogramm
data1 = walkers(1, 1, 10000)
data2 = walkers(1, 10, 10000)
data3 = walkers(1, 20, 10000)
fig, ax = plt.subplots(figsize=(9, 7), dpi=100)
fig.tight_layout()
#Plot für k=1
ax1 = plt.subplot(311)
xmin, xmax = plt.xlim(-1/2,1/2)
x1 = np.linspace(xmin, xmax, 1000)
#Ploteinstellungen
plt.title("Datensatz und berechnete Gauß-Verteilung für k=1")
ax1.set_ylabel('Wahrscheinlichkeit')
#Histogramm
p, bins, patches = ax1.hist(data1[0], bins=50, density=True, alpha=0.5, color='blue')
#Gaußverteilung
ax1.plot(x1, gauss(x1, 1), color='red')
#Plot für k=10
ax2 = plt.subplot(312)
plt.title("Datensatz und berechnete Gauß-Verteilung für k=10")
ax2.set_ylabel('Wahrscheinlichkeit')
xmin2, xmax2 = plt.xlim(-3, 3)
x2 = np.linspace(xmin2, xmax2, 1000)
#Histogramm
p, bins, patches = ax2.hist(data2[0], bins=50, density=True, alpha=0.5, color='blue')
#Gaußverteilung
ax2.plot(x2, gauss(x2, 10), color='red')
#Plot für k=20
ax3 = plt.subplot(313)
plt.title("Datensatz und berechnete Gauß-Verteilung für k=20")
ax3.set_ylabel('Wahrscheinlichkeit')
ax3.set_xlabel("Messwert")
xmin3, xmax3 = plt.xlim(-4, 4)
x3 = np.linspace(xmin3, xmax3, 1000)
#Histogramm
p, bins, patches = ax3.hist(data3[0], bins=50, density=True, alpha=0.5, color='blue')
#Gaußverteilung
ax3.plot(x3, gauss(x3, 20), color='red')
plt.show()