Bremsen und beschleunigen einer Kurve erfassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
pixewakb
User
Beiträge: 1408
Registriert: Sonntag 24. April 2011, 19:43

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?

Bild

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?
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

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.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

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

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),)
"""
Antworten