probleme mit diskreter n-body-simulation



  • hey
    da die abstände der einzelnen diskreten zeitschritte natürlich weit über der planckzeit sind, möchte ich gerne fragen wie man dennoch ein kontinuierliches verhalten approximieren kann.

    das problem äussert sich dadurch dass z.b. zwei teilchen aufeinander zufliegen und wenn sie mal nahe sind, "explodieren" sie teilweise einfach, da in einem frame die beschleunigung & geschwindigkeit extrem hoch berechnet wird (aufgrund der kurzen distanz und der daraus resultierenden hohen gravitation) und sie dann im nächsten frame viele duzend pixel voneinander entfernt sind (und die gravitation dann noch kaum greift). gelöst habe ich das atm so, dass die distanz geclampt wird und sie dann minimal 0.01 oder so sein kann. wirklich zufrieden bin ich mit der lösung natürlich nicht, daher würde ich gern mal nachfragen wie sowas wirklich gemacht werden soll und ob es überhaupt möglich ist, da die objekte in meiner simulation keine kollisionen verursachen können.

    gruss


  • Mod

    Dann musst du den Zeitschritt weiter verkleinern. Es gibt auch Techniken, bei denen der Zeitschritt bei Bedarf verkleinert wird, aber das Grundproblem hier ist, dass dein Zeitschritt zu groß ist in anbetracht der vorkommenden Kräfte und Geschwindigkeiten.

    da die objekte in meiner simulation keine kollisionen verursachen können.

    Das ist natürlich eine der Ursachen, wieso in deiner Simulation überhaupt so große Kräfte und Geschwindigkeiten vorkommen. Aber das lässt sich nicht zufriedenstellend lösen, ohne das Modell zu ändern (also eben doch abstoßende Kräfte einführen oder das Potential abschneiden (so wie du es effektiv getan hast)).

    da die abstände der einzelnen diskreten zeitschritte natürlich weit über der planckzeit sind, möchte ich gerne fragen wie man dennoch ein kontinuierliches verhalten approximieren kann.

    Wenn du eine Theorie der Physik auf Planckebene hast, dann lass mal hören.



  • danke dir für deine antwort.

    hm, habe ich mir schon fast gedacht, dass das ohne kollisionen nichts wird, da in der realen welt auch keine kollisionsfreien partikel existieren (zumindest keine mir bekannten). die zeitschritte dynamisch in anbetracht der distanzen zu verkleinern klingt doch richtig anspruchsvoll, vor allem dann noch die auslastung über meine threads hinweg zu verteilen.



  • Dunkle Materie ist kollisionslos.

    Wenn du mal wissen willst, wie die Profis das machen, kannst du dir ja mal Volker Springels Gadget-2 Code anschauen.

    Prinzipiell würde ich versuchen, Differenzialgleichungen aufzustellen und dann einen Löser mit variabler Schrittweite draufwerfen.



  • Disclaimer: Ich hab' keine praktische Erfahrung mit Simulationen dieser Art. Das Folgende ist einfach nur das was ich - eben ohne konkrete Erfahrung - als sinnvoll erachten würde, und was ich, wenn es mein Projekt wäre, vermutlich als erstes versuchen würde.

    asfasfd schrieb:

    die zeitschritte dynamisch in anbetracht der distanzen zu verkleinern klingt doch richtig anspruchsvoll

    Ich würde die Zeitschritte nicht nach den Distanzen richten, sondern nach den auftretenden Kräften.
    Bzw. nach der aus der Kraft resultierenden Beschleunigung.
    Und/oder anhand der Geschwindigkeit.

    Also delta-T so wählen, dass die max. Beschleunigung die in einem Frame passiert eine bestimmte Grenze nicht überschreitet. Und/oder eben dass die max. zurückgelegte Distanz eines Teilchens eine bestimmte Grenze nicht überschreitet.

    EDIT: Noch besser wäre vermutlich wenn das Limit nicht eine absolute zurückgelegte Distanz wäre, sondern eine zur kleinsten momentanen Distanz zwischen zwei Partikeln relative Distanz. Wobei irgendwann u.U. dann der Punkt erreicht ist, dass in der Simulation einfach nix mehr weiter geht. Vor allem wenn du zwei Teilchen direkt aufeinanderballerst. Den Fall müsste man dann wieder vermeiden, indem man eine fixe Mindestzeit vorgibt. Oder aber irgendwie wild rumtrickst - wobei ich jetzt nicht wüsste wie man das genau anpacken könnte/sollte. /EDIT

    vor allem dann noch die auslastung über meine threads hinweg zu verteilen.

    Naja, die Berechnung der ganzen Kräfte sollte recht einfach zu parallelisieren sein. Jeder Thread guckt sich einfach N Teilchen an, und berechnet für diese die einwirkenden Kräfte und die daraus resultierende Beschleunigung.
    Jeder Thread schreibt dabei dann das Maximum der Werte mit das er selbst errechnet hat.
    Dann musst du auf alle Threads warten, und rechnest dann das Maximum der Maxima aus. Dann kannst du den Zeitschritt bestimmen, und die Teichen entsprechend weiterbewegen. (Dieser letzte Schritt könnte natürlich wieder in mehreren Threads parallel erfolgen, aber da dabei nur 1x über alle Teicheln drübergegangen werden muss, wird es vermutlich kaum was bringen.)



  • Mr.Fister schrieb:

    Dunkle Materie ist kollisionslos.

    Wieso sollte sie das sein? Bzw. wieso muss sie das sein?
    Oder noch besser: wie kann sie das überhaupt sein?

    Klar, dunkle Materie ist per Definition dunkel. Interagiert daher also nicht über die elektromagnetische Kraft (schliesst das dann auch automatisch die schwache Wechselwirkung mit ein?).

    Aber ist denn klar dass sie nicht mit sich selbst interagiert/kollidiert? Bzw. nicht vielleicht doch mit normaler Materie über ander Kräfte interagiert?

    Und mit "klar sein" meine ich nicht dass es "bewiesen" wäre, denn bewiesen ist in der Physik ja eigentlich gar nichts -- sondern nur ob es nach dem momentanen Stand der Physik sinnvoll ist das anzunehmen, und (vorerst) alle anderen Möglichkeiten ausser acht zu lassen.



  • Aber ist denn klar dass sie nicht mit sich selbst interagiert/kollidiert? Bzw. nicht vielleicht doch mit normaler Materie über ander Kräfte interagiert?

    Ja, und wenn dann nur schwach. Ansonsten würde sie Formationen wie Sterne bilden. Ohne Kollision kann ein DM Teilchen aber seinen Impuls/Drehmoment beim Kollaps nicht verlieren und bildet ganz andere Strukturen - solche Strukturen, wie wir sie eben beobachten.

    Eindrucksvoll visualisiert im Bullet cluster



  • hey und sorry dass ich mich erst jetzt wieder melde.

    @Mr.Fister: ich habe kurz nach Gadget-2 gesucht und das paper hier (http://www.mpa-garching.mpg.de/gadget/gadget2-paper.pdf) gefunden. der für mich relevante teil dürfte 2.1 sein. ich verstehe es aber nicht da ich keine ahnung von der hamiltonschen mechanik habe. diese methode überschreitet also meine skills leider.

    @hustbaer: klingt schonmal recht gut und so kann ich mir die umsetzung auch besser vorstellen. der fall den du im edit beschrieben hast lässt sich verhindern, wenn man zwei partikel - sobald deren distanz zueinander < 1^-9 oder so ist - eins einfach löscht und dann das andere anhand der summe der massen / dem mittelwert der geschwindigkeiten bestimmt. das dürfte doch physikalisch gesehen korrekt sein oder irre ich mich da? wenn zwei kollisionsfreie partikel aufeinander zufliegen, dann konvergiert die distanz der positionen gegen 0. und wenn die distanz *fast* 0 ist dann sind die kräfte *fast* unendlich, so dass alle anderen kräfte bedeutungslos sind. so kann man die beiden partikel doch als vereint betrachten, ja?



  • asfasfd schrieb:

    und wenn die distanz *fast* 0 ist dann sind die kräfte *fast* unendlich, so dass alle anderen kräfte bedeutungslos sind. so kann man die beiden partikel doch als vereint betrachten, ja?

    wenn sie nicht kollidieren, dann fliegen sie nachher wieder auseinander.
    für sowas könnte man aber vermutlich diese beiden partikel einfach mit 2-body simulieren, wo der simulationsstep ja beliebig gross werden darf.
    also zumindest wenn man davon ausgeht dass alle partikel die so nah beinander sind, gleichzeitig deutlich weiter von allen anderen entfernt sind.



  • Mr.Fister schrieb:

    Aber ist denn klar dass sie nicht mit sich selbst interagiert/kollidiert? Bzw. nicht vielleicht doch mit normaler Materie über ander Kräfte interagiert?

    Ja, und wenn dann nur schwach. Ansonsten würde sie Formationen wie Sterne bilden.
    ...

    Color me skeptical 😃



  • Habe letzte Woche einen Vortrag über N-body Simulationen gehört und einiges gelernt.

    1. Das Potential sollte so aussehen: V=m*M*G/(r+epsilon)
    epsilon ist die "softening length", die verhindert dass die Kräfte zu groß werden. Ich würde hier mit verschiedenen Werten experimentieren.

    2. Die Zeitschritte sollten variabel sein und etwa proportional zu sqrt(epsilon/a), wobei a die Beschleunigung des Teilchens ist. Die Schrittweite ist dann für jedes Teilchen anders.

    3. Normale Zeitschritte erhalten die Energie nicht, selbst DGL Algorithmen wie Runge-Kutte erhalten die Energie nicht. Man braucht ein symplektisches Verfahren. Ich weiß nicht, warum das "symplektisch" heißt, aber was gemeint ist, ist, dass man Ort und Geschwindigkeit versetzt aktualisiert, dh:

    x(t+t0) = x(t) + t0v(t)
    v(t+t0/2) = v(t-t0/2) + t0
    a(t-t0/2)

    Hoffe das hilft.

    Desweiteren wurde natürlich noch erklärt wie man mit Milliarden von Teilchen umgeht, dh. Mesh methoden vs Tree methoden etc., aber nur wenn du nur wenige Dutzend Teilchen hast müsste das auch so naiv gehen.


Anmelden zum Antworten