Den Mittelwert fortlaufend bilden mit einer Funktion

Es soll ein fortlaufender Mittelwert aus n Integer Zahlen gebildet werden. Dazu wird die Funktion float mittelWert(int neuerWert) verwendet.

Am Anfang des Programms wird die Anzahl der Mittlungen festgelegt und die globalen Variablen werden erstellt.

#define anzahlMittelWerte 10
int werte[anzahlMittelWerte], zaehlerMittelWerte=0;

Im Hauptprogramm werden fortlaufend Zufallszahlen zwischen 1 und 10 erzeugt. Diese werden hier gemittelt und ausgegeben.

In der Funktion mittelWert gibt die globale Variable zaehlerMittelWerte immer die aktuelle Position im  Wertefeld werte[] an.

Der übergebene Wert neuerWert wird an der entsprechenden Stelle in das Feld werte[] geschrieben.

werte[zaehlerMittelWerte] = neuerWert;

Dann wird die summe aller werte gebildet und durch die definierte Zahl anzahlMittelWerte geteilt.

for(int k=0; k < anzahlMittelWerte; k++) summe += werte[k];
mittel=(float) summe / anzahlMittelWerte;

Der zaehlerMittelWerte wird eins hoch gezählt.
Sollte er die maximale Zahl anzahlMittelWerte erreicht haben, wird er wieder auf 0 gesetzt.

zaehlerMittelWerte++;
if(zaehlerMittelWerte >= anzahlMittelWerte) zaehlerMittelWerte=0;

Zum Schluss wird der float wert mittel von der Funktion zurück gegeben.

return mittel;

Hier das fertige Programm

// Über viele Integer Werte einen Mittelwert bilden.
// Dazu wird eine Funktion verwendet.
//
// Matthias Busse 9.2.2016 Version 1.0

// Anzahl der Mittelungen definieren und globale Variablen festlegen
#define anzahlMittelWerte 10
int werte[anzahlMittelWerte], zaehlerMittelWerte=0;

void setup() {
  Serial.begin(38400);
}

void loop() {
  int n;
  float f;
  n=random(1,10);
  f= mittelWert(n);
  Serial.println(f);
  delay(100);
}

float mittelWert(int neuerWert) {
// neuen int Wert eingeben und den Mittelwert als float zurück geben
//
// Matthias Busse 9.2.2016 Version 1.0
float mittel, summe=0;

  werte[zaehlerMittelWerte] = neuerWert;
  for(int k=0; k < anzahlMittelWerte; k++) summe += werte[k];
  mittel=(float) summe / anzahlMittelWerte; 
  zaehlerMittelWerte++;
  if(zaehlerMittelWerte >= anzahlMittelWerte) zaehlerMittelWerte=0;
  return mittel;
}

von Matthias Busse

2 Gedanken zu „Den Mittelwert fortlaufend bilden mit einer Funktion

  1. Gerd

    Kann man so machen. Es tut auch die Ermittelung eines gleitenden Mittelwerts. was den Vorteil hat, dass nicht jedes mal die ganze Summe eines Feldes gebildet werden muss.
    Im Prinzip wird der gleitende Mittelwert (gmw) einmal initialisiert (zB. in setup() ) und dann jeweils um einen neuen Wert (nw) wie folgt ergänzt:

    gmw = gmw – gmw / i + nw / i;

    Man zieht also den i-ten Teil vom Mittelwert ab und fügt den i-ten teil des neuen Wert hinzu.
    i muss immer größer gleich 1 sein.
    Je größer man i wählt, desto träger ändert sich der gmw.
    Bei i=1 ist gmw = nw.

    Das Ganze geht natürlich auch in einer Funktion
    float gmw( float old_gmw; float nw; int i; ) {
    result = old_gmw – old_gmw / i + nw / i;
    }

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *