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.
tja, ganz stumpf, 3600 Werte sammeln, addieren, durch 3600 teilen.
Aber es gibt verschiedene Mittelwerte und dementsprechend verschiedene
Methoden, diesen zu ermitteln.
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.
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...
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..
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...
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.
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.
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ß
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
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!
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ß
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! ;)
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...
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ß
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ß
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...
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.