Glättungsalgorithmus
-
hi leute!
was ich brauche, ist ein glättungsalgorithmus, den ich für die wetterstation an unserer schule brauche. die station liefert manchmal ausreißer (also z.b. auf einmal 10 grad mehr, wobei das alle 10 sekunden aktualisiert wird) ich hab das schon versucht, immer den mittelwert aus den letzten n werten (für n hab ich momentan 5) genommen wird, ist allerdings noch nicht 100% zufriedenstellend. evtl. will ich auch eine toleranzgrenze (der wert darf sich nicht um mehr als n % vom vorherigen unterscheiden) festlegen und die spitzen oberhalb der toleranzgrenze abschneiden und nur die werte, bei denen ich die spitzen abgeschnitten habe, an die vorherigen anpassen/glätten
hat da vielleicht jemand noch eine bessere idee, vielleicht auch was die art der mittelwertbildung (hab mometan arithmetisches mittel) angeht??
wäre echt nettcu todo
-
nimm doch einfach werte, die oberhalb der toleranz-grenze liegen, ganz raus. zb. wenn sich ein wert um mehr als einen bestimmten prozentsatz vor vorherigen wert unterscheidet wird er ignoriert etc...
-
und wass setz ich dann ein?
cu todo
-
Alle 10 Sekunden wird aktualisiert? Und wie oft treten die Ausreißer durchschnittlich auf?
Ich würde es so machen:
die letzten 10 Werte nehmen, den höchsten und niedrigsten Wert rausnehmen und dann von den anderen den Durchschnittswert. Wenn du nicht zu viele Ausreißer hast, dann sollte das funktionieren.
-
Original erstellt von todo:
**und wass setz ich dann ein?cu todo**
musst du denn was einsetzen? wenn du die daten zb. einfach fortlaufend in einem array speicherst, dann lass den wert doch einfach aus. da somit natürlich nicht immer die gleich anzahl von messwerten vorhanden ist, solltest du noch die erfolgreichen messungen in einem extra counter zählen, mit denen du dann deine berechnungen machen kannst...
-
Thermometer mit ausreißer?
Das ist doch nen Außenthermometer oder?
Dann ist Die Lösung doch einfach.
Nimm nur Werte die nicht mehr als z.B mehr als 3 Grad vom letzten abweichen.
Es kommt in der Natur wohl kaum vor das in Deutschland die Temperatur in 10 Sekunden um mehr als 3 Grad abweicht oder?Kannst ja mit den Werten experimentieren; wahrscheinlich kannste sogar weniger als 3 Grad nehmen...
-
Problem ist dann nur wenn die Messung mit einem Ausreißer beginnt
-
läuft das nicht permanant?
Wenn ja, dann einmal starten und überwachen wenns läuft, dann läufts
-
Ich dachte immer dafür giebt es Verfahren, um zu ermitteln, ob ein Messwert ein Außreißer ist. Ín meiner düsteren Erinnerung taucht irgendwie auf das in der Formel irgendwo MW und Varianz, sowie Standardabweichung eine Rolle gespielt haben. Da die Werte sich nicht allzu schnell ändern dürften sollte das kein Problem sein, das nebenher mitzurechnen.
Für Dein Problem sollten die oben genannten Vorschläge aber ausreichend sein.
-
also ich hab mir mal gedanken gemacht: (auszug aus dem quellcode)
// ==============================================================================================================================================
// Möglichkeiten, extreme Schwankungen durch fehlerhafte Übertragung zu beseitigen, ohne die normale Kurve(n) merklich zu beeinflussen:
// ----------------------------------------------------------------------------------------------------------------------------------------------
// 1. jeden neuen Werten an die n vorhergehenden Werte anpassen (Durchschnitt berechnen->welches Mittel (arithmetisches/geometrisches...?))
// Vorteile:
// -> die gesammte Kurve, auch die Werte, die in Ordnung sind, würde noch glatter erscheinen ("optische Aufbesserung")
// -> Ausreißer würden relativ gut entfernt
// -> kein Knick bei ersten wieder richtigen Wert
// Nachteile:
// -> wenn z.B. die Temp. z.B. durch Sonneneinstrahlung tatsächlich steigt, würde die Kurve ein bisschen "hinterher hinken"
// und auch nie den höchsten Wert erreichen. Um dieses Problem zu beseitigen könnte man einfach die Zahl der letzten Werte, aus denen
// man den Durchschnitt bildet, verringern, jedoch würden dann die Ausreißer wieder deutlicher zum Vorschein kommen und der eigentliche
// Zweck wäre nicht erfüllt... Wenn man sich also für diese Methode entscheiden sollte, müsste man die optimale Anzahl von Werten
// durch Probieren herausfinden
//
// 2. Spitzen abschneiden (Toleranzgrenze festlegen)
// Vorteile:
// -> Werte, die in Ordnung sind, würden davon nicht beeinträchtigt und man würde abgesehen von den Fehlern wirklich die exakten
// Verläufe bekommen, (allerdings) mit allen natürlichen Schwankungen
// Nachteile:
// -> damit würden die Spitzen "nur" deutlich verkleinert und würden nicht mehr so auffallen, aber da wären sie auf alle Fälle noch
// (d.h. es wäre eine u.U. eine längere Gerade auf der Toleranzgrenze zu beobachten)
// auch hier müsste man den besten Toleranzwert in Prozent gegenüber dem vorherigen Wert durch Probieren herausfinden
//
// 3. Werte über der Toleranzgrenze ignorieren und Tendenz der letzten Werte herausfinden und diese Tendenz fortführen
// Vorteile:
// -> bei schwach steigender oder fallender Tendenz relativ genau
// Nachteile:
// -> bei länger anhaltenden Störungen steigt bzw. fällt die Kurve immer weiter und es würde ein u.U. extremer Knick bei den ersten
// wieder korrekten Daten entstehen oder diese würden sogar außerhalb von der Toleranzgrenze fallen, da die Kurve so lange angestiegen
// bzw. gefallen ist und keinesfalls mehr die wirklichen Werte auch nur annähernd repräsentieren würde
//
// 4. Werte über der Toleranzgrenze ignorieren und letzten Wert nehmen
// Vorteile:
// -> relativ neutral und ideal bei kurzen Störungen
// Nachteile:
// -> bei länger anhaltenden Störungen entsteht eine unnatürliche gerade Linie und/oder der erste wieder korrekte Wert könnte ein ganzes
// Stück weiter oben oder unten liegen -> unnatürlicher Knick
//
// 5. Verbindung von 1. und 2.: alle Werte, die über der Toleranzgrenze liegen, auf die Toleranzgenze setzen und an die n vorhergehenden Werte
// anpassen (Durchschnitt)
// Vorteile:
// -> Werte, die in Ordnung sind, würden davon nicht beeinträchtigt und man würde abgesehen von den Fehlern wirklich die exakten
// Verläufe bekommen, (allerdings) mit allen natürlichen Schwankungen und auch die falschen Werte würden ziemlich gut ersetzt werden
// können
//
// 6. Verbindung von 3. und 4.: wenn der Wert über der Toleranzgrenze liegt, den letzten Wert nehmen und darin zu einem bestimmten Prozentsatz
// die Tendenz einfließen lassen
//
// 7. Verbindung von 1. 2. und 3.: alle Werte, die über der Toleranzgrenze liegen, auf die Toleranzgenze setzen, an die n vorhergehenden Werte
// anpassen (Durchschnitt) und darin die Tendenz einfließen lassen
// Vorteile:
// -> Werte, die in Ordnung sind, würden davon nicht beeinträchtigt -> exakte Verläufe und wahrscheinlich die beste Fehlerkorrektur, da
// sehr viele Faktoren eine Rolle bei der Fehlerkorrektur spielen
// (Nachteil: von allen am schwersten zu implementieren
//
// Da bei den meisten Verfahren u.U. ein Knick beim ersten wieder richtigen Wert entsteht, sollte man auch hier eine best. Anzahl von Werten
// nach dem letzten fehlerhaften Wert an die korrigierten Werte anpassen (Durchschnitt)
//
// Ich persönlich habe mich für die letzte Möglichkeit entscheiden, da sie meines Erachtens nach die am besten arbeitende
// Lösung ist, auch wenn die Implementierung eines solchen Algorithmuses nicht ganz so einfach (wie z.B. 1. oder 2.) ist.
// ==============================================================================================================================================den letzten algo hab ich also auch schon implementiert
cu todo
-
Original erstellt von todo:
hat da vielleicht jemand noch eine bessere idee, vielleicht auch was die art der mittelwertbildung (hab mometan arithmetisches mittel) angeht??
wäre echt nett
cu todoUm einzelne Ausreißer zu korrigieren ist der Median besser geeignet, als ein Mittelwert. Sortiere z. B. die letzten 3 oder 5 Werte und nimm den mittleren.