Kollisionen exakt berechnen, Impuls nicht erhalten..



  • Hi there!
    Ich habe hierzu über SUFU nichts gefunden..
    Ich versuche grade eine Physik-Simulation zu schreiben, welche beliebig viele "Kugeln" miteinander Energie und Impuls austauschen lässt.
    Letztes Problem! Die Impulssumme nach einem Stoß ist nicht identisch mit der Summe davor!
    Das liegt meiner Ansicht nach daran, dass der Kontakt zweier Kugeln zeitlich gesehen nicht symmetrisch verläuft! Nach Durchlaufen eines Maximums dauert die "Abstoßung" genau einen Zeitschritt dt länger, als zuvor die Annäherung.
    Ob sich zwei Kugeln des radius r berühren bestimme ich nach:
    s = x1-x2
    wenn abs(s) <=2r
    dann
    berechne Kraft F=-D
    (s-2r) zwischen Kugeln
    ansonsten F =0
    Ich schätze die Berechnung von s ist nicht exakt, sondern hat Rundungsfehler, so dass ich in den if-Block reinkomme, aber einen Schritt dt zu lange drin bleibe.
    Der Fehler in der Berechnung der folgenden Impulsänderung dp=F
    dt ist reproduzierbar und exakt auf die angesetzte zeitliche Auflösung dt zurückzuführen.
    Wie kann ich die hartcodierte Stoßbedingung ersetzen um dieses Problem zu umgehen? Wie funktionieren Physik-Engines bei solchen Problemstellungen?

    MFG ghosti!



  • Du musst den genauen Zeitpunkt der Kollision finden. D.h. du pruefst welche Kollisionen zwischen dem aktuellen Zeitpunkt und dem letzten auftraten indem du 4d Zylinder betrachtest (Durchmesser deiner Kugeln und Laenge des Zeitschritts) und die erste Ueberlappung zwischen denen (also auf der t Achse am kleinsten) berechnest. Genau zu diesem Zeitpunkt generierst du dein Kollisionsergebnis und machst einen neuen Schritt der von dem Kollisionszeitpunkt bis zur aktuellen Zeit reicht. So zumindest die ideale Theorie.



  • TGGC schrieb:

    Du musst den genauen Zeitpunkt der Kollision finden… So zumindest die ideale Theorie.

    *lach*



  • ghostwhisperer schrieb:

    Ob sich zwei Kugeln des radius r berühren bestimme ich nach:
    s = x1-x2
    wenn abs(s) <=2r
    dann
    berechne Kraft F=-D
    (s-2*r) zwischen Kugeln
    ansonsten F =0

    Wenn du mal schreiben würdest, was x und D sein sollten, wäre es einfacher...
    Und irgendwie sollte auch die Richtung der Kraft beachtet werden, oder treffen deine Kugeln immer exakt in Bewegungsrichtung aufeinander?



  • Solange Aktio = Reaktio gilt wird der Gesamtimpuls immer konstant sein. Daran liegt es nicht.



  • geben Sie einen Benutzern schrieb:

    ghostwhisperer schrieb:

    Ob sich zwei Kugeln des radius r berühren bestimme ich nach:
    s = x1-x2
    wenn abs(s) <=2r
    dann
    berechne Kraft F=-D
    (s-2*r) zwischen Kugeln
    ansonsten F =0

    Wenn du mal schreiben würdest, was x und D sein sollten, wäre es einfacher...
    Und irgendwie sollte auch die Richtung der Kraft beachtet werden, oder treffen deine Kugeln immer exakt in Bewegungsrichtung aufeinander?

    Hi! Danke für die bisherigen Antworten! Ich hab jetzt herausgefunden, dass es nicht an der Berührungsbedingung liegt, sondern an was anderem.
    s ist übrigens der Abstandsvektor, gebildet aus den zwei Ortsvektoren der Kugeln von Schwerpunkt zu Schwerpunkt und D eine Federkonstante! Ich betrachte im Prinzip die gegenseitige Verformung der Kugeln als einfache "Feder".
    Also! Das Problem ist nicht die Bedingung, sondern tatsächlich die endliche Auflösung dt der Zeit.
    Egal was ich simuliere, Federn, elektrische Kräfte oder Planetenbahnen, je kleiner dt desto geringer der Fehler! Und dieser kumuliert, d.h. ist immer positiv!
    Da ich Vielteilchen-Systeme simulieren will, kann ich nicht vorhersagen in welcher Richtung sich das ganze entwickelt. Daher kann ich den Fehler nicht durch Mittel der positiven und der negativen Ableitung der System-Größen minimieren..
    Gibt es dafür eine Lösung??
    MFG ghosti



  • Ich frage mal direkt:
    Wenn du das via Kräfte löst sollte ja Aktio = Reaktio gelten. Dann aber müsste ja gerade immer der Gesamtimpuls konstant sein, da eben dp = F*dt + (-F)*dt = 0 gilt.
    Wie genau dt da das gewünschte Zeitinkrement darstellt ist dabei egal. Daran kann es nicht liegen (es sei denn du berechnest das anders als ich denke).

    Ich denke eher es liegt daran, dass die Bewegungsrichtungen nicht beliebig genau sein können und daher dort durch Rundungen Fehler auftreten.



  • Problem gelöst! Die genaue Lösung steht hier:
    http://theorie2.physik.uni-greifswald.de/member/weisse/cmpp/teil2.html
    Über Velocity-Verlet werden (beliebige!) Kräfte numerisch exakt zu impulsen und Positionen integriert bzw summiert. Danke nochmal!


  • Mod

    volkard schrieb:

    TGGC schrieb:

    Du musst den genauen Zeitpunkt der Kollision finden… So zumindest die ideale Theorie.

    *lach*

    Lach nicht! Das ist eine gängige Simulationsmethode, die für diesen Fall sogar recht optimal wäre. Ich nehme von der Beschreibung her an, dass hier kein implizites Lösungsmittel vorliegt. Dann kannst du den Pfad jeder Kugel genau voraus berechnen und auch jede Kollision. Du hast dann keinen Zeitschritt mehr, sondern berechnest nur, wann und wo die nächste Kollision auftritt und was ihre Folgen sind. Das ist sehr genau (aka exakt!) für diese Art Modell und ziemlich ressourcensparend (wenn die mittlere freie Weglänge nicht zu klein ist).


Log in to reply