Tornado Geschrieben 20. November 2012 Geschrieben 20. November 2012 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 Zitieren
flashpixx Geschrieben 20. November 2012 Geschrieben 20. November 2012 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 Zitieren
Tornado Geschrieben 20. November 2012 Autor Geschrieben 20. November 2012 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. Zitieren
flashpixx Geschrieben 20. November 2012 Geschrieben 20. November 2012 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 Zitieren
Tornado Geschrieben 20. November 2012 Autor Geschrieben 20. November 2012 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. Zitieren
flashpixx Geschrieben 21. November 2012 Geschrieben 21. November 2012 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. Zitieren
Tornado Geschrieben 21. November 2012 Autor Geschrieben 21. November 2012 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). Zitieren
flashpixx Geschrieben 21. November 2012 Geschrieben 21. November 2012 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) Zitieren
Gast runtimeterror Geschrieben 21. November 2012 Geschrieben 21. November 2012 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. Zitieren
Tornado Geschrieben 24. November 2012 Autor Geschrieben 24. November 2012 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. Zitieren
Gast runtimeterror Geschrieben 24. November 2012 Geschrieben 24. November 2012 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. Zitieren
Tornado Geschrieben 25. November 2012 Autor Geschrieben 25. November 2012 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. Zitieren
Gast runtimeterror Geschrieben 25. November 2012 Geschrieben 25. November 2012 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 Zitieren
Empfohlene Beiträge
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.