Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Algorithmus "events pro Stunde" (https://www.delphipraxis.net/192063-algorithmus-events-pro-stunde.html)

myicq 17. Mär 2017 11:35

Algorithmus "events pro Stunde"
 
Ich habe eine Applikation mit Anwender-erstellte Envent (zb Knopfdruck).

Ich wurde gefragt eine Anzeige darzustellen "events pro Stunde" - dH "wieviele Events wird passieren mit gleicher geschwindigkeit".

Ich kenne die genaue Zeit einer Event, und kann deshalb relativ einfach das berechnen. Beispiel: 5 Minuten Event 1 zu Event 2 = 12 Events pro Stunde.

Wie kann ich das im Praxis umsetzen ? Und würde es nicht sinn machen über eine größere Anzahl Events auszurechnen, statt nur letzter 2 ?

Erste gedanken - eine Shiftregister über "N" events.

Gibt es schon Algorithmen für etwas ähnliches.

Hoffentlich verständlich erklärt.

Danke

t.roller 17. Mär 2017 12:04

AW: Algorithmus "events pro Stunde"
 
Nehmen wir als Beispiel einen EKG-Monitor:
Fast jeder Mensch hat einen unregelmässigen Herzschlag - das liegt zum Teil an der Abhängigkeit von der Atmung (Beschleunigung bei der Einatmung, Verringerung bei der Ausatmung), zum Teil an der Herzschädigung.
Da die Anzeige der Herzfrequenz/Min ständig springen würde, wenn man nur den Abstand von 2 R-Zacken auswerten würde, nimmt man den Mittelwert von 2 Abständen innerhalb von 3 R-Zacken.

Wenn dann immer noch grosse Sprünge in der Digital-Anzeige auftreten, kann die Elektronik (Arrhythmie-Erkennung) auch mehr R-Zacken auswerten.

Bei Events anderer Art hängt es von der möglichen Abweichung ab, wie viele Events man auswertet.

myicq 17. Mär 2017 12:14

AW: Algorithmus "events pro Stunde"
 
Genau so ist das.

Ist meine Idee korrekt, eine "schieberegister" zu verwenden, zB eine TList oder Array[1..N] (N=Samplezahl) zu nehmen, und dann duchschnitt damit auszurechnen ?

Damit habe ich zB
Code:
S[0] = 00:00:01
S[1] = 00:05:01
S[2] = 00:15:01
..
S[N] = 00:51:09
Jetzt habe ich 0-1 = 5 min, 1-2 = 10 min... etc. Und kann dadurch über N-1 werte durchschnitt ausrechnen, und dann in Dezimalstunden umrechnen.

t.roller 17. Mär 2017 12:51

AW: Algorithmus "events pro Stunde"
 
Wenn die Events tatsächlich REGELMÄSSIG auftreten, muss man sie beispielsweise nur für einen BESTIMMTEN ZEITRAUM (z.B. 10 min) zählen und mit 6 multiplizieren.
Wenn sie UNREGELMÄSSIG auftreten, zählt man 10 Minuten lang, multipliziert man mit 6, zählt wieder 10 Minuten lang, multipliziert mit 3, zählt wieder 10 Minuten lang, multipliziert mit 2.
Dann wird die Anzeige ziemlich genau.

Kleiner Test mit der SPACE-Taste - wertet nur 2 Intervalle aus:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
a1:= 0; a2:= 0; a3:= 0; // globale var
Form1.Tag:=0;
end;
// KeyPreview:= TRUE;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Form1.Tag>2 then BEGIN
Label1.Caption:= INTTOSTR(((a3-a2)+(a2-a1))div 2)+' msec';
Form1.Tag:=0; a1:= 0; a2:= 0; a3:= 0;
END;
Form1.Tag:= Form1.Tag + 1;
case Form1.Tag of
1: a1:= GetTickCount;
2: a2:= GetTickCount;
3: a3:= GetTickCount;
end;
end;

BrightAngel 17. Mär 2017 14:57

AW: Algorithmus "events pro Stunde"
 
Ist das nur eine Anzeige, oder darfst du auch Optionen vom Benutzer verlangen?

Folgende Probleme sehe ich für "allgemeine Zählung" Betreff der Regelmäßigkeit: Wie sensitiv soll das System Ausreißer anzeigen? Je größer dein "gemitteltes Fenster" desto träger und unwesentlicher Ausreißer (Option 1: Ausreißersensitivität).
Du kannst dafür auch mitteln und dann die Standardabweichung entscheiden lassen, ob du den Ausreißer als wirkliche Änderung oder nur als "Rauschen" interpretierst (Option 2: Standardabweichungsschwellwert).
Dann kannst du zusätzlich vielleicht abhängig wie groß die Standardabweichung grade ist die Fenstergröße über die du mittelst einstellen (Option 3: Sensitivität der Fenstergröße)

Für generelle Umgebungen ein statisches Modell zu finden ist denke ich schwer. Gerade weil von den unterschiedlichen Systemen unterschiedliche Verhalten zu erwarten sind. Vielleicht helfen dir die Stellgrößen, die ich hier mal Hemdsärmlig definiert habe weiter...? :idea::stupid:

Zudem: Eine Anzeige muss ja nicht nur eine Zahl sein. Darfst du ein Diagramm malen? Eventuell kannst du im zeitlichen Verlauf auf einem kartesischen Koordinatensystem auch eine geglättete Kurve über die Vergangenheit anzeigen und oben und unten einen "Funktionsschlauch" drumrum, der die (evtl Ausreißer berücksichtigenden) Standardabweichung zu den jeweiligen Zeitpunkten abbildet? :)
Oder wenn du nicht malen darfst: Wenigstens zusätzlich die gegenwärtige (über ein kleineres Fenster geglättete) Standardabweichung anzeigen?

Brighty

myicq 18. Mär 2017 00:05

AW: Algorithmus "events pro Stunde"
 
@BrightAngel: ich muss nur eine Zahl darstellen, und muss nicht absolut genau sein.

Es wird gebraucht für events die Häufig zw 5000 und 40.000 mal der Stunde vorkommt. Wenn ich da so etwa +/- 200 bin ist es schon nicht schlecht.

Ich habe soweit verstanden. Danke an alle.

Rollo62 18. Mär 2017 07:20

AW: Algorithmus "events pro Stunde"
 
Wie BrightAngel schon andeutet:
Das sollte man mit einfacher Statistik machen.

Also gleitenden Mittelwert, über eine definierbare Laufzeit (schneller/langsamer), je nachdem
wie schnel und wie stabil die Zahl sich ändern soll.

Ich würde auch auf Ausreisser oder schnelle Änderungen adaptiv reagieren, damit die Zahl Trendänderungen schnell folgen kann, aber nicht zu sehr rauscht.

Mit Standardabweichung kannst du die Schwankungsbreiten aus dem Signal abschätzen, und darauf entsprechend dynamisch reagieren.

Ein Vorteil wäre noch das du echte Ausreisser schnell erkennen kannst, und vieleicht gesondert anzeigen kannst.

Rollo


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz