Forum: Mikrocontroller und Digitale Elektronik Mittelwert auf 24h bezogen ermitteln


von Henning (Gast)


Lesenswert?

Hallo Leute,

ich habe eine Variable die derzeit sekündlich als Mittelwert aus neuem 
Wert und vorigem aktualisiert wird. Das wird aber nur stumpf auf einem 
LCD angezeigt und ist dafür auch erstmal geeignet.

Nun hätte ich aber gern einen Wert der den Durschnitt der letzten 24 
Stunden umfasst. Also müsste ich ja irgendwie immer den Wert von vor 
24Stunden abziehen vom aktuellen Durschnittswert der letzten 24Stunden 
usw!?!

Aber irgendwie hab ich da zur Zeit wohl ein wenig Leim im Hirn, denn ich 
komm einfach auf keinen Zweig wie ich das Ablauftechnisch mache. Könntet 
ihr mir da helfen?

Ich möchte hier kein fertiges Programm sondern bitte nur um 
Denkanregungen in Bezug auf den "Algorithmus" der nötig wäre.

von crazy horse (Gast)


Lesenswert?

tja, ganz stumpf, 3600 Werte sammeln, addieren, durch 3600 teilen.
Aber es gibt verschiedene Mittelwerte und dementsprechend verschiedene 
Methoden, diesen zu ermitteln.

von Henning (Gast)


Lesenswert?

so ähnlich dachte ich mir das auch, das wären in meinem fall aber 3600 
byte werte und das dann noch 4 mal ggg
wenn ich mich nicht vertue also rund 3,5MB + sonstiges variablen die ich 
noch so brauche hehe, doch etwas übel.

also müsste ich wohl irgendwie immer den mittelwert je rechnung 
"weiterführen" aus "(aktueller wert + alt-durchschnittswert) / 2" wie 
halt bisher auch und dann müsste ich irgendwie noch den ersten der 3600 
werte immer "mitführen" und daraus rückrechnen.

klar ist mir natürlich, dass die ersten laufenden 24stunden dieses 
berechnung wenig sinn macht, das ist aber gar nicht schlimm.

von G24 -. (Firma: G24-tec e.K.) (g24-tec)


Lesenswert?

Also falls eine iterative Formel für die Berechnung des Mittelwerts mit 
dieser  Frage gemeint war, dann hier:
s[n]=( (n-1)*s[n-1]+1*x[n] )/n
(wobei s[n] Mittelwert von den vorherigen n Werten ist)
Man kann es auch so bekommen
s[n]=s[n-1]+(x[n]-s[n-1])/n

Aber im Prinzip ist das relativ ineffektiv...

von crazy horse (Gast)


Lesenswert?

3,6k * 4=3,5M??
Ich glaube, du vertust dich :-)

von Daniel D. (bademeister)


Lesenswert?

Ne andere Variante wäre ja ein laufender Mittelwert. Also den alten 
Mittelwert + den neuen Wert..

Da das aber nur bedingt Sinn macht, könnte man den alten Mittelwert ja 
auch mit 3599 gewichten und den neuen dazu addieren. Das ganze dann 
durch 3600 und fertig. Sollte auch gar nicht so weit von dem korrekten 
Mittelwert entfernt sein.
Edit: also das was Henning im 2ten Post mit "mitführen" meinte..

von Gast123 (Gast)


Lesenswert?

Warum eigentlich 3600?
60Sekunden/Minute, 60 Minuten/Stunde, 24 Stunden Beobachtungszeitraum 
macht doch

60*60*24=86400, oder etwa nicht? :-)

von G24 -. (Firma: G24-tec e.K.) (g24-tec)


Lesenswert?

Daniel Dyla wrote:
> Ne andere Variante wäre ja ein laufender Mittelwert. Also den alten
> Mittelwert + den neuen Wert..
>
> Da das aber nur bedingt Sinn macht, könnte man den alten Mittelwert ja
> auch mit 3599 gewichten und den neuen dazu addieren. Das ganze dann
> durch 3600 und fertig. Sollte auch gar nicht so weit von dem korrekten
> Mittelwert entfernt sein.
> Edit: also das was Henning im 2ten Post mit "mitführen" meinte..

Also ich sage nur: ab und zu die Beiträge der anderen lesen...

von crazy horse (Gast)


Lesenswert?

man speichert erstmal nur jeweils 24 Werte und bildet daraus den 
Mittelwert. Diesen wiederum in den 3600er-Buffer, passt exakt. Die 24 
ergeben sich aus der Verknispung der Antibinoxe - kurz, du hast 
natürlich Recht.

von Gast (Gast)


Lesenswert?

Antiplinoxe !

von Ralph (Gast)


Lesenswert?

Speichere 60 Sekunden und berechne damit den minuten Schnitt, danach 
benutzte den Speicher für die nächtse Minute.
Speicher diesen minuten Schnitt, und wennn 60 Minuten zusammen sind 
berechnest du den Stunden Schnitt=> speichern ..........

So benötigst du für diese Berechnug 60 * Sekunden Variable + 60 * 
Minuten Variable + 24 mal Stunden Variable.

von Gast (Gast)


Lesenswert?

Hallo,
ich würde die Mittelwerte stündlich "gleitend" wie folgt ermitteln:

Summe(n) = Summe(n-1) + x(n)

Mittel(n) = Summe(n) / n

Die 24 Stundenwerte würde ich speichern und daraus das 24-Stunden-Mittel 
rechnen.
Das ist meiner Meinung sogar genau für die Werte zur ganzen Stunde.

Gruß

von Gast (Gast)


Lesenswert?

M = (3600*Summe(Mi)(i=1-23) + ((3600-n)*M24 + n * 
Ma)(n=1-3600))/(24*3600)

mit
Mi ... Mittelwerte aus den Stunden (-1h ... -24h)
Ma ... Mittelwert aus der aktuellen Stunde
n  ... Sekunde der aktuellen Stunde (1-3600)

Gruss

von Henning (Gast)


Lesenswert?

ich bin in mathe ganz ehrlich einfach eine totalniete. g
könnte ich die werte vielleicht gewichten?!

also wenn ein neues wert dazukommt rechne ich halt (bei sekunden) 86399 
teile des alten durschnitts + 1 teil des neuen durschnitts = 
NEUDURSCHNITT
aber dann wird ja die nachpegelung des wertes je nachdem wie lange die 
schaltung lief immer flacher?! ich will ja nur die letzten 24h als bezug 
nehmen!

von Gast (Gast)


Lesenswert?

Hallo,
wenn Du nur den 24 Stundenmittelwert haben willst, musst Du ältere Werte 
rauswerfen. Da Du aber nicht genug Speicher investieren willst, musst Du 
die Daten verdichten. Meine obige Formel rechnet mit den 24 Mittelwerten 
der letzten 24 Stunden.
Der Mittelwert einer Stunde ergibt sich aus der Summe aller Messwerte 
einer Stunde dividiert durch deren Anzahl:

Summe = Summe + Messwert (pro Messung)

Stundenmittel = Summe / 3600 (am Ende der Stunde)

Der 24 Stundenmittelwert ist:

M24 = [Mittel(1) + ... + Mittel(24)] / 24  (Formel 1)

Nach jeder abgelaufenen Stunde musst Du den neuen Stundenmittelwert 
speichern und den 24 Stunden alten wegschmeißen. Die Werte rutschen also 
eins durch:

M(24) <= M(23)
M(23) <= M(22)
...
M(2) <= M(1)
M(1) <= M(abgelaufene Stunde)

Nun liefert Formel 1 den neuen 24 Stundenmittelwert.

Während der Stunde kannst Du auch einen Mittelwert bilden, den 
Mittelwert seit Stundenbeginn:

Stundenmittel(n Sekunden) = Summe(n Sekunden) / n

Damit kannst Du auch während der Stunde einen 24 Stundenmittelwert 
berechnen. Wichtig ist hierbei die Gewichtung. Da Du nur 24 Stunden 
einbeziehen willst, musst Du soviele alte Werte rausschmeißen, wie neue 
Werte dazukommen.
Also:
Während der aktuellen Stunde kommen n neue Werte dazu:

Summe(n) = Summe(n-1) + Messwert(n)

der aktuelle Mittelwert:

M(a) = Summe(n) / n

Wie kombiniert man das nun mit den letzten 24 Stunden?

Vorschlag: n neue Werte ersetzen n alte Werte so, dass n mal der 
Mittelwert  vor 24 Stunden entfern wird:

n*M(a) + (3600-n)*M(24)

Die anderen 23 Stundenmittelwerte haben je das Gewicht von 3600 
Messungen:

3600 * [M(1) + ... + M(23)]

Alle Messungen zusammen ergeben den 24 Stundenmittelwert:

M24 = {3600 * [M(1) + ... + M(23)] + n*M(a) + (3600-n)*M(24)} / (24 * 
3600)

Das ist der in jeder Sekunde beste Mittelwert aus 24 Stunden Messung mit 
stündlicher Messwerteverdichtung.

Gruß

von Henning (Gast)


Lesenswert?

ja genau das war der hakpunkt in meiner überlegung. das mit dem 
verdichten immer auf stündliche werte war mir klar, jedoch war mir nicht 
klar wie ich dann den "durchlaufend stabilen mittelwert" erreiche.

würd ich die minus 24ste stunde komplett killen dann würde mein 
mittelwert ja total aus dem konzept kommen da ihm dann ja 3799 
sekundenwerte auf einmal fehlen täten! ;)

von rene (Gast)


Lesenswert?

Schau dir mal die seite an :
http://www.ibrtses.com/embedded/exponential.html

Fuer eine Zeitkonstante von 87600 samples kann man 65656 als 2^16 nehmen 
und ist sehr nahe. Also

output:=input * 1/65536 + output -( output * 1/65536)
oder
output:=input shr 16  + output - output shr  16

Ist doch einfach...

von Gast (Gast)


Lesenswert?

Hallo,
das ist ein Tiefpass 1. Ordnung kein Mittelwertbildner! Das ist nicht 
das selbe! Die Gewichtung eines Messwertes fällt exponentiell mit dem 
alter.
Ein Mittelwertbildner gewichtet konstant im Auswertungszeitraum!

Gruß

von rene (Gast)


Lesenswert?

Das ist korrekt. Ein kleiner akademischer Unterschied. Und deswegen 
lohnt sich der ganze Aufwand ?

von Gast (Gast)


Lesenswert?

Was soll man dazu sagen:

1. Versuch
Der Unterschied zwischen Mittelwert und Tiefpass ist nicht nur 
akademisch! Der Unterschied ist Mathematik und Systemtheorie.
Manchmal stürzen Raumschiffe wegen solcher Unterschiede ab.

2. Versuch
Meine Wetterstation kann das machen wie sie will. Das ist mir egal.

3. Versuch
Die Frage war nach dem Mittelwert. Die nächste Frage könnte nach einer 
Vereinfachung sein. Die nächste aber eben!

Gruß

von Henning (Gast)


Lesenswert?

naja da die rechenleistung sicherlich nicht an ihre grenzen stößt 
sondern eben nur der arbeitsspeicher möchte ich das eigentlich schon 
recht genau haben, ob der unterschied auffällt ist wieder eine andere 
geschichte, aber ich hätte es halt gern so...

von rene (Gast)


Lesenswert?

Der Unterschied zwischen Tiefpass und Mittelwert isr sicher da. Zum 
einen ist der Tiefpass kontinuierlich, der Mittelwert nicht. Es kommt 
auf die Aussage an, was den sinnvoller ist. Ich wuerd mal beides 
probieren, Der Tiefpass sind ein paar Register, der Mittelwert braucht 
etwas mehr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.