mikrocontroller.net

Forum: PC-Programmierung Extremwertbestimmung in Messreihe


Autor: Christian J. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in einer Messreihe von Druckwerten, die typischerweise so aussieht 
möchte ich die Extremwerte erfassen und zwar nur die großen, gut 
sichtbaren. Die Werte liegen als Integer vor, (die der Tendenz nach auf 
oder absteigend sind in einem Zeitintervall) komplizierte Rechnungen wie 
Steigungsanalysen oder Spline Kurve (ist recht heftig, passt in den uC 
nicht mehr rein) möchte ich nicht machen.

Mathematisch wäre das nichts weiter als die Nullstellen der ersten 
Ableitung aber die Kurve liegt ja nicht als Funktion vor.

Wie würde ein passender Algorithmus aussehen?

Gruss,
Christian

Autor: Chefkoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, du müsstest erstmal genauer festlegen, was du mit
>und zwar nur die großen
genau meinst

Mir ist z.B. nicht ersichtlich, warum du die "kleinen" Extrema zwischen 
dem 25ten und 26ten 4ten berücksichtigen willst, aber den nach dem 7ten 
4ten und den kurz vor dem 23ten 4ten nicht.

Autor: Chefkoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS.:
wie viel hast du dir bei dem Ausdruck
>die typischerweise so aussieht
gedacht? Deine Formulierung unterstellt, dass du in dem Kurvenverlauf 
ein Characteristikum siehst - eben etwas das typisch ist. Auf sowas 
ließen sich ALgorithem ansetzten und auslegen.
Das sehe ich so auf den ersten Blick nicht. Hätte mir z.B. vorstellen 
können, dass die Drücke im 24 Stundenzyklus mit der Temperatur schwanken 
- ist aber nicht der Fall.
Außer, dass es prinzipiell hoch und runter geht, sehe ich kein 
Characteristikum - wie gesagt, auf den ersten Blick, vll. ist das doch 
eines...

Autor: irgendeiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> in einer Messreihe von Druckwerten, die typischerweise so aussieht
> möchte ich die Extremwerte erfassen und zwar nur die großen, gut
> sichtbaren.

Zeitfenster (z. B. ein Tag) definieren und in diesem Zeitfenster jeweils 
das Maximum und Minimum erfassen. Ist zwar nicht ganz, was Du willst, 
aber als Auswertung sinnvoller.

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde Filtern und dann n Messwerte durch den Speicher schieben
und bei Änderung von m < n/2 Messwerten in die andere Richtung,
das Maximum von n ausgeben. Dann hast du allerdings alle
Scheitelpunkte erfasst.

Autor: Pete K. (pete77)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Alle Messwerte in eine Liste speichern und diese dann nach Größe 
sortieren.

Autor: Chefkoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, ich habe gelogen...
Mir scheint, da ist eine Periodizität von rund 8,5 Tagen drin ist...

Autor: Achim S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm den ersten Wert als Startwert X0

Setze 2 Werte, z.B. D=100 und F=0.5

Wenn X > X0+D, dann wird ein lokales Maximum gesucht. (wenn < X0-D, dann 
ensprechend Minimum)

 * a) Xmax = X wenn X>Xmax.
 * b) wenn (X < (Xmax-X0)*F+X0), dann haben wir den ersten Extremwert 
Xmax1 und

 * suchen fortan das erste Minimum
 * mit X0 = Xmax1 und Xmin=X
 * Xmin = X wenn X<Xmin
 * und der End-Bedingung X>(Xmin-X0)*F+X0 (beachte, dass die Klammer 
negativ ist!)

Deine Recherchen müssen nun nur noch ein geeignetes D und F finden.

Autor: Noch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und zwar nur die großen

Einfach mal schauen, ob ein trivialer Ansatz gut genug ist.

Zuerst einen gleitenden Mittelwert berechnen. Nach Try&Error Gewichte 
ausprobieren, bis nur mehr die "großen" übrig bleiben.
Dann in den geglätteten Daten die Differenz zwischen aufeinander 
folgenden Punkten berechnen. Und diejenigen nehmen, bei denen das 
Vorzeichen der Differenz wechselt.

Autor: Max Mustermann (jens2001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch einer schrieb:
> Zuerst einen gleitenden Mittelwert berechnen. Nach Try&Error Gewichte
> ausprobieren, bis nur mehr die "großen" übrig bleiben.
> Dann in den geglätteten Daten die Differenz zwischen aufeinander
> folgenden Punkten berechnen. Und diejenigen nehmen, bei denen das
> Vorzeichen der Differenz wechselt.

Damit hast du aber NICHT DAS MAX/MIN der Originalwerte!!!

Autor: Christian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für die Anregungen!

Ich überlege in die Richtung einfach ein Intervall zu durchlaufen und zu 
zählen wieviele Nachfolger größer sind als der Vorgänger und wieviele 
kleiner. Sobald das Verhältnis kippt war dann ja ein Maximum da. Da 
diese Kurven aber quasi jeden beliebige Form annehmen können ist das 
auch viel Probierei.

Man kann auch einen Wert von unten her "hochschieben" und bei jedem 
Schritt zählen wieviele Werte, die ja einen Bereich bilden, noch drüber 
liegen und deren Mittelpunkt bestimmen. Das werden logischerweise bei 
einem Maximum immer weniger, bis keiner mehr drüber liegt.

Ich habe das teil jetzt über ein Jahr am Laufen und das Wetter hat schon 
damit zu tun wie der Luftdruck ist. Aktuell liegt er bei mir bei 995 
mBAr, das ist ein echt tiefes Tief. Und die Wendepunkte läuten dann 
schon ein, wann man sich auf Regen etc einstellen muss.

Autor: Christian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Alle Messwerte in eine Liste speichern und diese dann nach Größe
> sortieren.

Machbar, ich habe noch genug Speicher, jeder Wert hat eine Unixtime als 
Index. Nur was kommt dabei heraus? Eine steigende Gerade, jedenfalls so 
ungefähr, da die Wert harmonisch sind, Ecken und Kanten gibt es nicht. 
Du musst berücksichtigen, dass der Druck seinen Offset laufend 
verändert, in der Grafikanzeige muss ich das auch berücksichtigen, dass 
ich laufend den maßstab neu errechnen muss.

Autor: Feldstecher (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Christian J. schrieb:
> Und die Wendepunkte läuten dann
> schon ein, wann man sich auf Regen etc einstellen muss.

Du meinst die (math.) Extrempunkte? Du moechtest die Minima und Maxima 
aber nicht in Echtzeit erkennen, oder? Das ginge naemlich auch mit einer 
Kurvenbeschreibung nicht, es braucht fuer signifikante Extrempunkte 
immer einen gewissen Horizont. Das wuerde sonst auch die Boersen 
crashen, wenn jeder berechnen koennte, dass jetzt gerade der Kurs am 
Hoechsten ist und fallen wird.

Autor: Max Mustermann (jens2001)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Pete K. schrieb:
> Alle Messwerte in eine Liste speichern und diese dann nach Größe
> sortieren.

BULLSHIT!!!

Damit erwischst du nur Werte die in der Nähe globaler Extrema liegen!

Autor: Peter M. (r2d3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> Wie würde ein passender Algorithmus aussehen?

Lade doch bitte mal Deine Zeitreihe hoch!

Autor: Christian J. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Feldstecher schrieb:
> Du meinst die (math.) Extrempunkte? Du moechtest die Minima und Maxima
> aber nicht in Echtzeit erkennen, oder? Das ginge naemlich auch mit einer
> Kurvenbeschreibung nicht, es braucht fuer signifikante Extrempunkte
> immer einen gewissen Horizont.

Ich glaube fast dass Du recht hast, auch wenn ich mir grad meinen Öl 
Trade so anschaue. Das geht nur nachträglich aber auf keinen Fall in der 
Prognose, nicht mal eine einzige Minute... alelrdings habe ich zig 
Analysewerkzeuge wie gleitende Durchschnitte usw, die mir genau das 
bestimmen, nämlich nachträglich zu rechnen.

Wäre ja vielleicht nicht verkehrt die Druckmessung als Candlesticks 
darzustellen, das müsste problemlos möglich sein. Candlesticks gelten 
für alle Arten periodischer Größen, alles was einen Chart hat kann man 
damit ausdrücken.

Autor: Hannes Jaeger (pnuebergang)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> Mathematisch wäre das nichts weiter als die Nullstellen der ersten
> Ableitung aber die Kurve liegt ja nicht als Funktion vor.

Macht nix, die Ableitung kann man aus den Messwerten approximieren. Ob 
das dein Problem löst ist eine andere Frage.

Die drei einfachsten Approximationen (man kann die Genauigkeit noch 
erhöhen) sind:

Vorwärtsdifferenz:  y'[x] = y[x + 1] - y[x]
Rückwärtsdifferenz: y'[x] = y[x] - y[x - 1]
zentrale Differenz: y'[x] = (y[x + 1] - y[x - 1]) / 2

Autor: Christian J. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hannes J. schrieb:

> Vorwärtsdifferenz:  y'[x] = y[x + 1] - y[x]
> Rückwärtsdifferenz: y'[x] = y[x] - y[x - 1]
> zentrale Differenz: y'[x] = (y[x + 1] - y[x - 1]) / 2

Sowas schreibe ich gerade, das dient auch bei mir dazu den Graphen 
farbig zu gestalten. Nur wenn der Nachfolger größer ist als der 
Vorgänger wird es grün und ein Farbwechsel kommt erst, wenn der 
Nachfolger kleiner ist als der Vorvorgänger.

Autor: rupert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> Hallo,
>
> in einer Messreihe von Druckwerten, die typischerweise so aussieht
> möchte ich die Extremwerte erfassen und zwar nur die großen, gut
> sichtbaren. Die Werte liegen als Integer vor, (die der Tendenz nach auf
> oder absteigend sind in einem Zeitintervall) komplizierte Rechnungen wie
> Steigungsanalysen oder Spline Kurve (ist recht heftig, passt in den uC
> nicht mehr rein) möchte ich nicht machen.
>
> Mathematisch wäre das nichts weiter als die Nullstellen der ersten
> Ableitung aber die Kurve liegt ja nicht als Funktion vor.
>
> Wie würde ein passender Algorithmus aussehen?
>
> Gruss,
> Christian

Für mich ergibt sich der Eindruck, dass du selber noch nicht genau 
weist, was du machen willst, oder hast es einfach noch nicht 
systematisch aufgeschrieben. Du musst dir erst einmal klar werden, was 
du genau möchtest, und uns dass mitteilen, bevor man dann sinnvolle 
zielführende Antworten geben kann.
Was genau meinst du z.B. mit "Extremwerte erfassen und zwar nur die 
großen, gut sichtbaren"
Und dann wie schon angesprochen, zu welchen Zeitpunkten willst du die 
Werte bestimmen?
Wievel Speicher hast du? wie ist die Abtastfrequenz? und noch viele 
andere Dinge.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.