Zum Inhalt springen

Fluss pro Sekunde aus einzelnen Flüssen (1/15 s) berechnen


Empfohlene Beiträge

Geschrieben

Hallo!

Ich betrachte in einer Simulation, wie viele sich bewegende Objekte zwischen zwei Simulationsschritte eine bestimmte Grenze überschritten haben. Ein Simulationsschritt beträgt 1/15 Sekunde. Meine Daten sehen also z.B. so aus:

t Fluss

0 0

1 1

2 0

3 0

4 1

5 0

6 2

...

Nun brauche ich aber den Fluss pro Sekunde zu jedem Zeitpunkt (u.a. für eine visuelle Darstellung). Einfach die Werte mit 15 multiplizieren, würde viel zu große Ergebnisse geben, da die Werte der Einzelflüsse nicht besonders konstant sind. Was ich also mache ist folgendes: Will ich den Fluss pro Sekunde zu t = 20 haben, so addiere ich die Einzelflüsse von t = 6 bis t = 20. Das sind dann also 15 Werte, also 15 * 1/15 = 1 Sekunde.

Allerdings habe ich dann zwei Probleme:

1. Die Berechnung kann erst ab t = 14 funktionieren, für frühere Werte ist der Fluss pro Sekunde nicht berechenbar.

2. Der Fluss pro Sekunde "hängt immer hinterher". Sagen wir mal, dass aus irgendeinem Grund der Fluss ab t = 30 komplett stoppt (also alle t >= 30 einen Einzelfluss von 0 liefern). Dann wäre es ja schön, wenn der Fluss pro Sekunde bei t = 30 auch 0 wäre. Da ich aber die Einzelflüsse von t = 16 bis t = 30 addieren würde, würde ich erst verzögert merken, dass der Fluss gestoppt ist, möglicherweise erst zu t = 44. Ich will aber unter anderem einen Zusammenhang zwischen Änderungen der Flussrate pro Sekunde und bestimmten Ereignissen feststellen können, dafür ist es äußerst ärgerlich, dass es diese "Verschiebung" gibt und sich Änderungen an den Einzelflüssen nur langsam bemerkbar machen.

Ist mein Vorgehen da irgendwie zu primitiv und gibt es eine bessere Möglichkeit den Fluss pro Sekunde zu einem Zeitschritt t zu berechnen? Vielleicht hat ja einer von euch eine gute Idee...

Gruß

Tornado

Geschrieben

Wenn Du die Zeit äquidistant diskretisiert hast, dann kannst Du via Summierung eben die Zeitschritte zusammenfassen. In Deinem Fall also 15 Elemente entsprechend einer Sekunde.

Natürlich solltest Du Dir Gedanken darüber machen, wie sich pro Diskretisierung das ganze verhält, sprich Du musst schon das Abtasttheorem erfüllen, damit Du die Daten korrekt erfassen kannst. Nach Deiner Beschreibung würde ich darauf tippen, dass Du das Theorem nicht erfüllst, aber im Grunde fehlen in Deinem Posting diese informationen

Geschrieben

Also in der Simulation haben die Objekte zu jedem Zeitschritt t einen Punkt x, y an dem sie sich befinden. Die Simulation berechnet dann die nächsten Positionen für t + 1. Die maximale Geschwindigkeit der Objekte ist in Meter pro Sekunde bekannt und die neue Position ist dann von dieser maximalen Geschwindigkeit sowie der Beeinflussung durch die anderen Objekte gegeben. Zwischenwerte zwischen t und t + 1 gibt es in der Simulation nicht.

Beispiel:

Die Grenze liegt bei y = 10.

3 von 100 Objekten hatten zu Zeitschritt t einen y-Wert <= 10 und zu Zeitschritt t + 1 einen y-Wert > 10. Sie haben also zwischen den Zeitschritten die Grenze überschritten. Für diesen Fall wäre der Einzelfluss dann 3.

Geschrieben
Die maximale Geschwindigkeit der Objekte ist in Meter pro Sekunde bekannt und die neue Position ist dann von dieser maximalen Geschwindigkeit sowie der Beeinflussung durch die anderen Objekte gegeben. Zwischenwerte zwischen t und t + 1 gibt es in der Simulation nicht.

Doch es gibt Werte zwischen t und t+1, denn eine Bewegung ist etwas kontinuierliches und nichts diskretes: Bewegung (Physik)

was man dann mit Hilfe einer Differentialgleichung beschreibt

Einer Bewegung liegen mehrere Kräfte zu Grunde, die auf ein Objekt einwirken z.B. Beschleunigung, Reibung, Masse, etc.

Die Simulation einer Bewegung eines Objektes wird mit Hilfe der DGL beschrieben, wobei man dafür dann einen Solver verwenden kann, um die Bewegung zu simulieren. Diese Solver nutzen numerische Verfahren (letztendlich die Lösung von Integralen), um die Bewegungsbahn des Objektes zu berechnen. Der Solver muss aber Kenntnisse über die DGL haben und anhand der Simulation muss man den passenden Solver wählen. Ein einfacher Solver ist z.B. Eulersches Polygonzugverfahren

Geschrieben

Na gut, aber in diesem speziellen Fall haben wir es mit einer Multi-Agenten-Simulation zu tun und die Objekte (Agenten), in diesem Fall Personen, entscheiden aufgrund ihrer Logik wo sie sich hinbewegen. An der Simulation selbst kann ich auch nichts ändern. Es geht nur um eine geeignete Auswertung der Aufzeichnungen und dort stehen mir nur die Positionen zu bestimmten Zeitpunkten t zur Verfügung. Die Objekte sind außerdem Moving Point Objects (MPO), also sich bewegende Punkte in einem Raum. Somit kann sich der Punkt nur genau vor/auf der Grenze befinden oder dahinter.

Geschrieben
Es geht nur um eine geeignete Auswertung der Aufzeichnungen und dort stehen mir nur die Positionen zu bestimmten Zeitpunkten t zur Verfügung. Die Objekte sind außerdem Moving Point Objects (MPO), also sich bewegende Punkte in einem Raum.

Die stehen die Positionen nur zu den diskreten Zeitpunkten zur Verfügung, d.h. was dazwischen ist, ist formal erst einmal nicht definiert. Wenn die Objekte eine "Bahn" beschreiben sollen, dann musst Du Dir eben überlegen was Du zwischen den Diskretisierungspunkten machst (Stichwort Interpolation).

Da Du mit 15 Hz diskretisierst, solltest Du auf das Abtasttheorem achten. Wie sich nun die Simulation eben für eine ganze Sekunde verhält, sprich Du musst mehrere Punkte zusammenfassen, musst Du Dir überlegen, denn das ist domänenspezifisch. Wie Du nun diese Zusammenfassung berechnest, also ob nun die Stützstelle der gröberen Interpolation nun am Anfang der feineren, in der Mitte oder am Ende liegt, musst Du ebenfalls abhängig von Deinen Daten. Bsp: 1, 2, 3 => 0.5*(1+2), 0.5*(2+3) => 1.5, 2.5

In diesem Fall liegt die neue Stützstelle zwischen zwei anderen. Man kann gewichtet, äquidistant oder im Grunde frei definiert arbeiten. Letztendlich kommt es auf die bestehende Diskretisierung an, wie und was man interpoliert.

Ja nach Komplexität der Bewegung wäre auch eine Beschreibung als DGL sinnvoll, die man dann entsprechend visualisiert. Theoretisch wären aber auch distanz- / topologiebasierte Visualisierungsverfahren eine weitere Möglichkeit. Letzteres wäre bei größeren Datenmengen empfehlenswert.

Du sprichst in Deinem ersten Post von "Fluss", dafür gibt es entsprechende Definitionen:

Fluss (Physik)

Der Fluss (mathematisch genauer: skalarer Fluss eines Vektorfeldes) ist definiert als das innere / skalare Produkt aus Vektorfeld und Fläche. Das Vektorfeld ist hier über die Fläche konstant, sonst erfolgt Integralbildung. Die Ausrichtung der Fläche wird durch den Normalenvektor bestimmt.

Was man letztendlich sehr vereinfacht als Bewegung von Objekten durch eine Fläche pro Zeiteinheit ansehen kann.

Zusätzlich noch Diffusion

Ebenso, wenn die Objekte sich im Raum bewegen auch Brownsche Bewegung

Eine reine Bewegung eines Objektes ist kein Fluss. Ohne die Daten und das was Du letztendlich auswerten möchtest zu kenne, wird man hier nicht viel Informationen geben können. Ich meine Du kannst den Pfad jedes Objektes entsprechend visualisieren, wobei Du dann natürlich zwischen zwei Diskretisierungspunkten passend interpolieren musst.

Geschrieben

Ich glaube du hast noch etwas falsche Vorstellungen von dem, was ich eigentlich mache. Der von mir betrachtete Fluss ist folgendermaßen definiert:

Der spezifische Fluss ist die Anzahl Personen, die einen bestimmten Querschnitt pro Meter lichter

Breite und pro Sekunde passieren. Die Einheit ist Personen/ms.

Es geht also zum Beispiel darum, wie viele Personen einen Durchgang pro Sekunde durchqueren können (dividiert durch die Breite dieses Durchganges).

Geschrieben

Es geht also zum Beispiel darum, wie viele Personen einen Durchgang pro Sekunde durchqueren können (dividiert durch die Breite dieses Durchganges).

Das ist doch per Definition korrekt, nur du hast hier keine Fläche sondern eine 1-dimensionale Größe (Breite)

Gast runtimeterror
Geschrieben

Ich habe das Gefühl, ihr redet aneinander vorbei.

Da ich in den Beispielmesswerten keine negativen Zahlen sehe, gehe ich davon aus, dass die Summation monoton steigend ist. Da zudem Werte > 1 vorkommen gehe ich davon aus, dass keine Grenzüberschreitung ausgelassen wurde. Unter diesen Voraussetzungen ist die Abtastgeschwindigkeit egal - es wird kein Ereignis übersehen.

Was du zu suchen scheinst ist ein Tiefpassfilter für deine Messwerte. Diese leben prinzipbedingt immer etwas in der Vergangenheit.

Dein Vorschlag mit der Summation der letzten 15 Werte entspricht einem FIR-Filter mit Rechteckfenster. Ist leicht zu programmieren aber hat ansonsten sehr miese Eigenschaften.

Ich empfehle einen IIR-Filter nach folgender Art:

f[n + 1] := f[n] * a + v[n] * (1 - a)

a = [0 .. 1]

f[0] = 0

Das entspricht in der E-Technik einem Tiefpass erster Ordnung ohne Resonanzfrequenz und glättet deine Messwerte. Mit a kannst du die Stärke der Glättung einstellen:

- Werte gegen 1 glätten stark und reagieren nur träge (geringe zeitliche Auflösung)

- kleine Werte für a reagieren stärker auf schwankende Messwerte (hohe zeitliche Auflösung)

Ist relativ einfach zu implementieren und bietet schon recht gute Ergebnisse.

Geschrieben

Ich hatte jetzt die letzten Tage nicht viel Zeit, deshalb bin ich erst jetzt wieder hier.

Da ich in den Beispielmesswerten keine negativen Zahlen sehe, gehe ich davon aus, dass die Summation monoton steigend ist. Da zudem Werte > 1 vorkommen gehe ich davon aus, dass keine Grenzüberschreitung ausgelassen wurde. Unter diesen Voraussetzungen ist die Abtastgeschwindigkeit egal - es wird kein Ereignis übersehen.

Genau. Die Personen sind entweder vor oder hinter der Grenze, dazwischen gibt es nichts. Wenn sie zu t vor der Grenze waren und zu t+1 dahinter, dann haben sie zwischen t und t+1 die Grenze überschritten. Sowas wie "zur Hälfte überschritten" oder ähnliches gibt es aber nicht. Hat eine Person die Grenze überschritten so wird es auf jeden Fall gemerkt (sie gehen auch nicht wieder zurück, so dass man das einmal übersehen könnte).

Die Anzahl an Personen, die zwischen Zeitschritt t und t+1 die Grenze überquert haben (-> Personenfluss), muss immer >= 0 sein und kann nur ganzzahlig sein. Der Personenfluss pro Zeitschritt kann aber sehr stark varieren, weil sich die Personen gegenseitig behindern und "verklemmen" können.

Was du zu suchen scheinst ist ein Tiefpassfilter für deine Messwerte. Diese leben prinzipbedingt immer etwas in der Vergangenheit.

Dein Vorschlag mit der Summation der letzten 15 Werte entspricht einem FIR-Filter mit Rechteckfenster. Ist leicht zu programmieren aber hat ansonsten sehr miese Eigenschaften.

Welche miesen Eigenschaften meinst du? Die, die ich beschrieben habe? Also, dass es sehr träge auf die Änderungen reagiert?

Ich empfehle einen IIR-Filter nach folgender Art:

f[n + 1] := f[n] * a + v[n] * (1 - a)

a = [0 .. 1]

f[0] = 0

Das entspricht in der E-Technik einem Tiefpass erster Ordnung ohne Resonanzfrequenz und glättet deine Messwerte. Mit a kannst du die Stärke der Glättung einstellen:

- Werte gegen 1 glätten stark und reagieren nur träge (geringe zeitliche Auflösung)

- kleine Werte für a reagieren stärker auf schwankende Messwerte (hohe zeitliche Auflösung)

Ist relativ einfach zu implementieren und bietet schon recht gute Ergebnisse.

Das werde ich mir dann mal angucken. Danke! Leider bin ich kein E-Techniker und habe deshalb mit sowas noch keine Erfahrung. Wo kann man deine Formel nachlesen? Bzw. was ist hier v[n]? Und wie lässt sich a am besten bestimmen? Ich will ja meine Ergebnisse durch den Filter eigentlich nicht verfälschen.

Gast runtimeterror
Geschrieben
Welche miesen Eigenschaften meinst du? Die, die ich beschrieben habe? Also, dass es sehr träge auf die Änderungen reagiert?

Die Miesen Eigenschaften, die ich meinte sind Aliasing-Artefakte. Messschwankungen, deren Wellenlänge ein Vielfaches der Länge des Durchschnittintervalles haben werden komplett ausgelöscht (ist etwas schwierig zu erklären).

Siehe auch (Die deutsche Übersetzung ist bei den Nachteilen nicht präzise genug)

https://en.wikipedia.org/wiki/Window_function#Rectangular_window

Ohne zu tief in die Filtertechnik einzusteigen fällt mir das ehrlich gesagt schwer, das zu erklären.

Das werde ich mir dann mal angucken. Danke! Leider bin ich kein E-Techniker und habe deshalb mit sowas noch keine Erfahrung. Wo kann man deine Formel nachlesen? Bzw. was ist hier v[n]?

Sorry, v[n] sind deine Messwerte und f[n] sind die geglätteten Messwerte.

Nachlesen ... hmmm. Strenggenommen ergibt sie sich hieraus:

https://de.wikipedia.org/wiki/RC-Glied#Tiefpass

Als Pseudocode:


a := [0.0 .. 1.0]

f := 0

Für alle Messwerte in v

    f := f * a + v * (1.0 - a)

    Ausgabe: f

Ah, hab's gefunden - hat tatsächlich einen Namen:

https://de.wikipedia.org/wiki/Exponentielle_Gl%C3%A4ttung

Und wie lässt sich a am besten bestimmen? Ich will ja meine Ergebnisse durch den Filter eigentlich nicht verfälschen.

Das ist ein Widerspruch in sich. Wenn du die Messwerte nicht verfälschen wolltest, müsstest du sie nehmen, wie sie sind.

Du kannst dich mit a entscheiden, ob du eine hohe zeitliche Auflösung oder eine hohe Auflösung der Messwerte willst.

Weitere Verfahren findest du unter (deine Variante ist der Rechteck-Filter - auch hier nochmal die Nachteile):

https://de.wikipedia.org/wiki/Gl%C3%A4tten_%28Mathematik%29

Die anderen Verfahren benötigen Werte aus der Zukunft - das geht nur, wenn du deiner Software etwas Zeit gibts die Werte zu sammeln. Ideal ist ein sinc-Filter, der allerdings theoretisch unendlich viele Werte aus der Vergangenheit und der Zukunft benötigt.

Geschrieben

Danke für die ganze Informationen!

Wenn du die Messwerte nicht verfälschen wolltest, müsstest du sie nehmen, wie sie sind.
Das würde ich auch am liebsten, nur brauche ich halt leider den Fluss pro Sekunde und habe die Einzelflüsse. Bei einem höheren Fluss pro Sekunde sind die Einflüsse gar nicht unbedingt höher, sondern es gibt einfach weniger Zeitschritte in denen z.B. 0 Personen die Grenze überschritten haben (die Einzelflüsse betragen meistens 0 oder 1, ganz selten 2). Daher reicht das Betrachten der Einzelflüsse leider nicht aus.

Die anderen Verfahren benötigen Werte aus der Zukunft - das geht nur, wenn du deiner Software etwas Zeit gibts die Werte zu sammeln.
Ich habe ja die Werte einer abgeschlossenen Simulation. Also prinzipiell auch Zukunftswerte. Bloß gegen Ende der Aufzeichnung gehen mir dann natürlich die Zukunftswerte aus.
Gast runtimeterror
Geschrieben

Ok, ich dachte, das müsse in Echtzeit passieren.

Dann bilde doch einfach für den Wert bei t=20 (um dein Beispiel im Eingangsposting aufzugreifen) den Durchschnitt der Werte für t=13 bis t= 27. Dann hängen die Messwerte auch nicht hinterher. Für die Intervallgrenzen (nahe t=0 und nahe t=tMax) verkürzt du dein Interpolationsintervall einfach.


sampleRate := 15 ; in Hz, immer ungerade

tVon := Max(t - (sampleRate - 1) / 2, 0)

tBis := Min(t + (sampleRate - 1) / 2, tMax)

geglätteterWert[t] := durchschnitt(tVon, tBis)


Funktion durchschnitt(tVon, tBis)

    Summe := 0

    Zähle in t von tVon bis tBis

        Summe := Summe + v[t]

    Ergebnis := Summe / (tBis - tVon + 1)

Ende Funktion

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...