Ich bekomme nebenstehende Messwerte und man erkennen, dass der Wert erst einmal fällt, bei 7 die 0 nach unten passiert hat, sich etwa bei 16 stabilisiert und dann wieder ansteigt, wobei es bei 25/26/26 eine Verzögerung gibt. Der Wert steigt dann wieder schneller an und bei 34/35/36 ist dann wieder zu beobachten, dass die Werte erneut ihre Richtung ändern.
Laienhaft ausgedrückt: Wenn ich mir das Bild einer Achterbahn vorstelle, dann gibt es Phasen einer beschleunigten Wertänderung und Phasen einer verlangsamten Wertänderung, die auf eine Richtungsänderung hindeuten können.
Meine Aufgabe ist es jetzt, dass ich die Phase des Abbremsens, die einer Richtungsänderung vorausgehen kann, mit einer Kennzahl fortlaufend beschreiben soll und möglichst jeweils für zwei Werte berechnen soll. Wenn wir z. B. bei 14, 15 usw. sind, soll eine Warnlampe angehen, dass sich die Bewegung verlangsamt, bei 18, 19 usw. soll eine Information folgen, dass der Zug sich wieder in Bewegung setzt und bei 33 usw. soll ein Hinweis kommen, dass sich die Bewegung verlangsamt, was wiederum auf eine Richtungsänderung hinweisen kann.
Hat jemand eine Idee, wie ich das irgendwie einfach beschreiben kann und dann in einem zweiten Schritt so berechne, dass ich eine Kennzahl weitergeben kann?
Ich überlege gerade, ob ich eine Gerade zwischen zwei Punkte legen kann und dann prüfe, ob der nächste Punkt oberhalb (beschleunigter Anstieg oder verlangsamter Abstieg) bzw. unterhalb liegt (beschleunigter Abstieg oder verlangsamter Anstieg). Vielleicht könnte man den Abstand zwischen Punkt und Geraden dazu nutzen, um die Stärke des Effekts zu messen? Gute Idee? Schlechte Idee? Macht man das besser?
Bremsen und beschleunigen einer Kurve erfassen
Moin,
du suchst die (numerische) Ableitung der gezeigten Funktion. numpy hat da mit `np.diff` eine Funktion für eingebaut. Das kann allerdings problematisch werden, wenn die Messwerte nah aneinander liegen und verrauscht sind, weil die Ableitung das Rauschen verstärken kann.
du suchst die (numerische) Ableitung der gezeigten Funktion. numpy hat da mit `np.diff` eine Funktion für eingebaut. Das kann allerdings problematisch werden, wenn die Messwerte nah aneinander liegen und verrauscht sind, weil die Ableitung das Rauschen verstärken kann.
@pixewakb,
Geringe Änderung der Funktion bedeutet, dass die Ableitung der Funktion niedrige Werte annimmt. Hat die Ableitung hohe Werte entspricht das einer starken Änderung der Funktion.
Die numerische Ableitung ist die Steigung einer Geraden zwischen zwei Punkten. Oder vereinfacht die Differenz zwischen zwei benachbarten Werten.
Dafür gibt es numpy.diff()
Ich habe mal so getan als wäre das eine Kosinus-Kurve.
Erst werden die x-Werte mit linspace() erstellt. Darauf wird der Kosinus angewandt. Die Differenzen werden in d gespeichert.
Da wo die Differenzen unter einen bestimmten Wert fallen ist die Steigung gering.
Die Ausgabe gibt dir die Indizes an denen die Messwertkurve geringe Änderungen aufweist. (Das stimmt natürlich nur ungefähr mit deinem Beispiel überein, da ich eine Kosinus Funktion genommen habe)
Geringe Änderung der Funktion bedeutet, dass die Ableitung der Funktion niedrige Werte annimmt. Hat die Ableitung hohe Werte entspricht das einer starken Änderung der Funktion.
Die numerische Ableitung ist die Steigung einer Geraden zwischen zwei Punkten. Oder vereinfacht die Differenz zwischen zwei benachbarten Werten.
Dafür gibt es numpy.diff()
Ich habe mal so getan als wäre das eine Kosinus-Kurve.
Erst werden die x-Werte mit linspace() erstellt. Darauf wird der Kosinus angewandt. Die Differenzen werden in d gespeichert.
Da wo die Differenzen unter einen bestimmten Wert fallen ist die Steigung gering.
Die Ausgabe gibt dir die Indizes an denen die Messwertkurve geringe Änderungen aufweist. (Das stimmt natürlich nur ungefähr mit deinem Beispiel überein, da ich eine Kosinus Funktion genommen habe)
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
count = 39
x = np.linspace(0, np.pi*2, count)
y = np.cos(x) * 6000
d = np.diff(y)
low_accelerations = np.where(abs(d)<100)
print(low_accelerations)
"""
Ausgabe:
(array([ 0, 18, 19, 37], dtype=int64),)
"""