Periodische Daten#

Die nachfolgende Aufgabe behanelt die Verarbeitung periodischer Daten mit Hilfe von numpy.arrays.

Aufgabenteil A#

Lesen Sie die für diese Aufgabe erforderliche Datei periodische_daten.csv. als numpy.array ein. Der Datensatzt beschreibt die Rotation eines Punktes auf einem Kreis mit dem Radius R=20 m. Der zurückgelegte Weg auf der Kreisbahn U(t) in [m] wird dabei in Abhängigkeit der Zeit t [s] beschrieben. Plotten Sie die Daten mit Hilfe des matplotlib Moduls in einer sinnvollen Darstellung und interpretieren Sie den Plot.

circle

Lösungsvorschlag#

Hide code cell source
import numpy as np
import matplotlib.pyplot as plt
#Laden der Datei und separieren von Zeit (t) und zurückgelegter Wegstrecke ($U(t)$) 
data = np.loadtxt('periodische_daten.csv', delimiter=',').T
t = data[0] # Zeit
d = data[1] # Zurückgelegte Wegstrecke $U(t)$

plt.scatter(d, t, s=1)
plt.xlabel('$U(t)$ / m')
plt.ylabel('$t$ / s')
plt.grid(linestyle='--', alpha=0.5)
plt.show()
Hide code cell output
../../../../_images/767dce0a1cb073febe3bc42ca7244e1a25c8c293d2b841b21f8f35dc7a45dc1e.png

Aufgabenteil B#

Der Punkt bewegt sich mit einer veränderlichen Geschwindigkeit über die Kreisbahn. Berechnen Sie die Bahngeschwindigkeit v=ΔUΔt für jeden Zeitschritt t und plotten Sie die Geschwindigkeit v in Abhängigkeit der Zeit t über den gesamten betrachteten Zeitraum.

Lösungsvorschlag#

Hide code cell source
# Berechnen der Zeit- und Weginkremente
dt = t[1:] - t[:-1]
ds = d[1:] - d[:-1]
# Berechnen der momentanen Geschwindigkeit
v = ds / dt

plt.plot(t[1:], v)
plt.xlabel('$t$ / s')
plt.ylabel('$v~/~ms^{-1}$')
plt.grid(linestyle='--', alpha=0.5)
plt.ylim(0, 10)
plt.show()
Hide code cell output
../../../../_images/c4e719f9250619c4993d74d31667c5364c57d963ec508e5775f496bb74a14a00.png

Aufgabenteil C#

Korrigieren Sie, falls erforderlich die Geschwindigkeit um den Einfluss aus der periodischen Beschreibung des zurückgelegten Weges U(t). Tip: Plotten sie als Hilfestellung die Daten für ds in Abhängigkeit von t.

Lösungsvorschlag#

Hide code cell source
# Berechnen des Kreisumfangs
u = 2 * np.pi * 20

# Korrektur der Weginkremente um den periodischen Einfluss
ds_cor = np.where(ds < 0, ds+u, ds)

# Berechnen der korrigierten Geschwindigkeit
v_cor = ds_cor / dt

plt.scatter(t[1:], v_cor, 1)
plt.xlabel('$t$ / s')
plt.ylabel('$v~/~ms^{-1}$')
plt.grid(linestyle='--', alpha=0.5)
plt.ylim(0, 10)
plt.show()
Hide code cell output
../../../../_images/ee4c192ad717f96f1e8d779ccee6f133d8c2f724cc4f1dc9c34445c8090ab9d3.png

Aufgabenteil D#

Berechnen Sie aus der zuvor berechneten und ggf. korrigierten Geschwindigkeit v zu jedem Zeitschritt die Beschleunigung a=ΔvΔt und plotten Sie diese in Abhängigkeit der Zeit t. Was fällt Ihnen auf? Wie lassen sich Berechnung bzw. Darstellung der Beschleunigung verbessern?

Lösungsvorschlag#

Hide code cell source
# Berechnen der Beschleunigung
a = (v_cor[1:] - v_cor[:-1]) / dt[1:]

plt.scatter(t[2:], a, s=1)
plt.xlabel('$t$ / s')
plt.ylabel('$a~/~ms^{-2}$')
plt.grid(linestyle='--', alpha=0.5)
plt.show()
Hide code cell output
../../../../_images/6553f13b6bdd79d821e712dd20272e2dca38fc36a944f8fa4b11665531bb8d5f.png
Click to show

Glätten Sie die Geschwindigkeit über einen gleitenden Durschnitt (moving average bzw. MA):

mMA(n)(t)=1ni=0n1x(ti)

Erstellen Sie hierzu die Funktion moving_average, welche die Parameter x_werte, y_werte und n entgegen nimmt. Tip: Nurtzen Sie die Funktion numpy.convolve

Hide code cell source
# Definition der Funktion 'moving_average' zur Berechnung des gleitenden Durschschnitts
def moving_average(x_werte, y_werte, n):
    window = np.ones(n)/n
    y_average = np.convolve(y_werte, window, mode='valid')
    x_average = x_werte[int((n-1)/2):-int((n)/2)] 
    return x_average, y_average

# Berechnung des gleitenden Durchschnitts der Geschwindigkeit über ein Fenster von n = 200
t_ma, v_ma = moving_average(t[1:], v_cor, 200)

plt.scatter(t[1:], v_cor, s=1, label="Originaldaten")
plt.plot(t_ma, v_ma, color='r', label="Gleitender Durschnitt über 200 Wertepaare")
plt.xlabel('$t$ / s')
plt.ylabel('$v~/~ms^{-1}$')
plt.ylim(0, 10)
plt.grid(linestyle='--', alpha=0.5)
plt.legend()
plt.show()
Hide code cell output
../../../../_images/8c7c826129373ec83a2991ae79cf07229f2701c052ee5b84ed64eb2ee921f1ab.png
Hide code cell source
# Berechnung der Beschleunigung aus dem gleitenden Durchschnitt der Geschwindigkeit und den Zeitinkrementen
a = (v_ma[1:] - v_ma[:-1]) / dt[200:]
# Berechnung des gleitenden Durchschnits für die Beschelunigung
t_ma, a_ma = moving_average(t[201:], a, 10)

plt.scatter(t[201:], a, s=1, label="Originaldaten")
plt.plot(t_ma, a_ma, color='r', label="Gleitender Durschnitt über 200 Wertepaare")
plt.xlabel('$t$ / s')
plt.ylabel('$a~/~ms^{-2}$')
plt.grid(linestyle='--', alpha=0.5)
plt.legend()
plt.show()
Hide code cell output
../../../../_images/f8bc976dd4c3c3cfd2256dfd27f41f043d481a1c51a07ece2b3ab87ce49a24dc.png