-         

Ergebnis 1 bis 6 von 6

Thema: Gleitender Durchschnitt

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470

    Gleitender Durchschnitt

    Anzeige

    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!

  2. #2
    Gast
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2005
    Alter
    64
    Beiträge
    157
    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

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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. "
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    Danke Jungs habt mir sehr geholfen!

  6. #6
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    64
    Beiträge
    12.367
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •