PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gleitender Durchschnitt



teslanikola
04.01.2006, 16:29
Hallo Leute ich hab ein kleines Problem:

Ich bekomme von einem Gerät jede Sekunde einen Wert geliefert, diese werte werde dann am PC Graphisch Dargestellt , das klappt schpn recht ut, so jetzt will ich aber den Durchschnitt dieser Zählen berechnen. Aber ich will nicht alle Zahlen Speichern, das würde zu viel Platz fressen. Ich will hald jedesmal wenn eine neue Zahl eingelesen wird den neuen Durschnitt. Wie kann ich das machen???? Kann leider nicht bis ende der Ferien warten, da muss das Porjekt fertig sein sonst hätte ich meinen Mathelehrer gefragt!

04.01.2006, 17:18
Moin,

da gibt es mehrere Möglichkeiten:

a) Speichere die Werte in einem Array. Immer dann, wenn du einen neuen Wert erhälst, verschiebst du die Werte im Array und fügst den neuen hinten an. Den Durschschnitt erhälts du aus der Summe aller Arraywerte geteilt durch deren Anzahl.

b) Du addierst zum alten Mittelwert den neuen Wert und dividierst die Summe durch 2. In diesen Wert geht der altuelle Messwert mit dem Faktor 1/2 ein, der vorhergehende (steckt bereits im alten Mittelwert) mit 1/4, der davor mit 1/8, etc.
Ist zwar nicht so richtig ein gleitender arithmetischer Durchschnitt, dafür aber sehr effizient. Benötigt nur eine Speichervariable, eine Addition und eine Division (Dvision durch 2 geschieht meist durch Rechtschieben, ist also auch sehr fix).

Noch ein Tipp: vermeide Fließkomma-Aritmetik. Multipliziere deine Werte mit einer Zweierpotenz, damit evtl. Kommas verschwinden.

Gruß Red Baron

RedBaron
04.01.2006, 17:27
Hallo teslanikola,

ich habe übersehen, dass du die Daten bereits auf dem PC hast. Da ist Fließkomma-Arithmetik natürlich kein Problem.

Methode 3:
Nimm eine Variable, in der du alle Messwerte aufsummierst (d.h. jeden neuen Wert einfach aufaddieren(sum+=messwert)) und merke dir die Anzahl der Werte. Der Durchschnitt ist dann die Summe dividiert durch Anzahl.

Welche Methode die bessere ist, hängt natürlich vom Anwendungsfall ab.

Gruß Red Baron

PicNick
04.01.2006, 18:29
Variante, die ich gern verwende, weil ich den Durchschnittswert jederzeit brauche und ich nicht jedesmal ausdividieren will (summe UND durchschnitt speichern will ich aber auch nicht)


counter = 0
average = 0

Neuer wert:
tmp = counter * average
counter++
tmp += neuer wert
average = tmp / counter


so hab ich den aktuellen Durchschnitt zur verfügung, brauch aber keine Summe zu speíchern.

Wie du magst


EDIT: "Gleitender" Durchschnitt ist das aber nicht. Das wäre eher sowas wie "RedBaron, die I. "

teslanikola
05.01.2006, 22:19
Danke Jungs habt mir sehr geholfen!

Manf
06.01.2006, 12:23
Prima, fast alles schon genannt, der Vollständigkeit halber,
die allgemeine Form der geleitenden Mittelung mit exponentieller Relaxation lautet ja mit:

A = aktueller Wert
M = Mittelwert
M1 = neuer Mittelwert
w = Relaxationskoeffzient

M1 = M * (1-w) + A * w

Mit ganzen Zahlen n kann man dann die Werte für w = 2^-n relativ leicht berechnen mit.
M1 = M * (1 – 2^-n) + A * 2^-n

Wie genannt für n = 1
M1 = (M + A) / 2

für n = 3
M1 = (M * 8 – M + A) / 8

Immer noch brutal einfach also mit addieren, subtrahieren und shiften.
Manfed