Warum funktioniert mein Zweikörpermodell nicht? [geschlossen]

Ich habe ein einfaches 1-dimensionales Zweikörper-Partikelmodell in C++ erstellt. Im Modell beginnt Partikel 1 an Position (0,0) und Partikel 2 an Position (1,0). Die Teilchen werden mit einer Geschwindigkeit aufeinander zu beschleunigt, die proportional zum Abstand zwischen ihnen ist.

Der Code sieht für mich in Ordnung aus, aber die Ergebnisse sehen sehr basar und völlig unphysisch aus. Ich vermute, dass das Problem mit den diskreten Zeitschritten zusammenhängt, die unternommen werden. Ich habe versucht, die Beschleunigungsrate proportional zum Abstand ^ 2 zu machen, und die Ergebnisse sehen nicht realistischer aus.

Hier ist der Code und die Ergebnisse:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Das obige Diagramm ist eine Position Vs. Zeitdiagramm.

Wie kann ich den Code anpassen, um vernünftigere Ergebnisse zu erhalten?

Ich denke, Sie sollten Ihrer Frage hinzufügen, was Sie erwarten . Es klingt für mich so, als ob "mit einer Geschwindigkeit proportional zum Abstand zwischen ihnen aufeinander zu beschleunigt" bedeutet, dass dies ein harmonischer Oszillator sein sollte. Ist das korrekt??
Ich würde auch vorschlagen, Ihren Code zu kommentieren ...
Aber im Code haben Sie, dass die Beschleunigung proportional ist 1 D (Schauen Sie sich insbesondere Ihre Definition von dv1dt an).
@Jared, die Schwerkraft ist proportional zu 1 / d ^ 2, aber die Schwerkraft verhält sich wie ein harmonischer Oszillator. Ich denke, 1/d sollte auch. Nichtsdestotrotz liefert 1/d^2 ebenso seltsame Ergebnisse.
Die Schwerkraft (insbesondere die Newtonsche Schwerkraft, wie Sie es zu tun scheinen) ist kein harmonischer Oszillator.
@Jared, ja nicht technisch, aber die Bewegung ist oszillierend mit einer maximalen Amplitude. Mein Diagramm zeigt deutlich, dass die Amplitude überall zunimmt (und abnimmt). Harmonische Oszillation oder nicht, die Ergebnisse scheinen nicht mit dem Code übereinzustimmen.
Es ist erwähnenswert, dass die durch die Poisson-Gleichung definierte Schwerkraft zu instabilen Umlaufbahnen in 1D oder 2D führt (sie führt zu stabilen Lösungen in 3D ... und ich denke, andere ... aber ich greife viel zu weit in meine klassische Mechanik zurück Klasse, hier wirklich einen guten Kommentar abzugeben).
Wäre Computational Science ein besseres Zuhause für diese Frage?
@Qmechanic Ich weiß es nicht. Ich kenne dieses Forum nicht, aber ich denke nicht, dass es für StackOverflow oder das Computer Science-Forum geeignet ist. Ich bin immer noch der Meinung, dass es einen guten Grund für die erhaltenen Ergebnisse gibt (das hat nichts mit Chaos oder Berechnung zu tun).
@Qmechanic - Ich stimme Jared zu: Hier geht es um numerische Methoden für die Physik. Während die numerische Integration etwas ist, das Nicht-Physiker studieren, sollten die Techniken, die dazu benötigt werden, für diese Gemeinschaft von Interesse sein. Die derzeit akzeptierte Antwort wird der Frage nicht gerecht ...
Ich wollte böse sein und eine böse Community-Wiki-Antwort schreiben. Stattdessen werde ich in einem Kommentar einfach böse sein und sagen, dass dieser Code schrecklich ist.
Sie sollten die Datei nicht manuell öffnen und schließen; Verwenden Sie RAII.
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da es um das Debuggen eines Programms und nicht um Physik geht. Vielleicht ist Computational Science für dieses Programm besser geeignet.
Hören Sie auch aufusing namespace std , .

Antworten (2)

In Situationen wie dieser ist es eine gute Idee, den Zeitschritt basierend auf dem Gradienten der Kraft anzupassen - denn das gesamte Konzept der numerischen Integration besagt, dass "sich die Dinge von jetzt an bis zum nächsten Zeitschritt nicht zu sehr ändern" und Diese Annahme wird verletzt, wenn Sie sich schnell durch eine Region mit sich schnell ändernder Kraft bewegen.

Dies hat einen riskanten Nebeneffekt: Wenn Sie den Zeitschritt "klein genug" machen, um mit der schnellen Variation fertig zu werden, und die Variation "unendlich schnell" wird, kann Ihr Algorithmus "stecken bleiben" - Sie könnten auf Xenos Paradoxon von stoßen Achilles und die Schildkröte.

Um nicht stecken zu bleiben, sind einige numerische Integrationen (wie Runge-Kutta) besser darin, die Krümmung höherer Ordnung zu berücksichtigen - was einen größeren Schritt ohne Genauigkeitsverlust ermöglicht.

In Ihrem Fall wird die Beschleunigung für den gesamten nächsten Zeitschritt jedoch durch die aktuelle Position bestimmt. Wenn Ihre Partikel also zu Beginn des Schritts nahe beieinander liegen, werden sie weit weggeschleudert, und da ihre Anziehungskraft dies tut dann stark verringert werden, werden sie es schwer haben, zurückzukommen.

Ein paar Kritikpunkte zu deinem Code:

  1. Sie definieren particle1[4], verwenden aber nur zwei Komponenten
  2. Sie codieren den Zeitschritt hart, anstatt eine Variable wie zu verwendendt
  3. Sie verwenden die grundlegendste Integrationsmethode ... bitte informieren Sie sich über andere
  4. Sie definieren implizit Masse = 1 und Kraftkonstante = 1; erwägen Sie, diese Variablen zu erstellen (auch wenn Sie sie auf 1 setzen)

In Bezug auf den ersten Punkt würde ich a structfür meine Partikel verwenden:

typedef struct{
  double x;
  double v;
} PARTICLE;

und dann können Sie mit auf ihre Eigenschaften zugreifen

PARTICLE p1, p2;
p1.v = 0.;
p1.x = 0.;
p2.v = 0.;
p2.x = 1.;

Was sofort besser lesbar ist ... Wenn Sie in zwei Dimensionen arbeiten möchten, können Sie sie entweder explizit als Teil Ihres struct: ( double x; double y; double vx; double vy;) schreiben oder sie zu Arrays machen.

Aber wirklich - variable Zeitschritte und Interpolationen höherer Ordnung würden zur Stabilität Ihrer Lösung beitragen.

Danke, Sie haben den Nagel auf den Kopf getroffen, was mit dem Programm nicht stimmt. Danke auch für deine Tipps, ich fange gerade erst mit numerischen Methoden an.
Das Schreiben eines gut erzogenen Simulators ist schwierig. Aber die Belohnungen sind fantastisch, wenn Sie alles lernen, was es zu wissen gibt. Sie befinden sich in Schritt eins und diese Antwort führt Sie durch die Schritte 2, 3 und 4. Je mehr Sie daran arbeiten, desto mehr Nuancen nehmen Sie in Angriff, die Sie durch die Schritte 5 bis 12 führen. Sie haben zu diesem Zeitpunkt promoviert.

Sie erhalten Partikel, die 0 Abstand voneinander haben und daher eine unendliche Beschleunigung haben. Der Computer kann dies nicht auflösen und explodiert daher, je nachdem, wie nahe der Schritt an Null herankommt.

Ich bin mir nicht sicher, was "physikalisches" Verhalten wäre, da Punktmassen in Nullentfernung schwer zu untersuchen sind. Wenn Sie jedoch eine y-Koordinate hinzufügen und ihr eine Anfangsgeschwindigkeit geben, erhalten Sie möglicherweise bessere Ergebnisse (im Grunde eine längliche Ellipse anstelle einer oszillierenden Linie).

Sie könnten die anfängliche y-Geschwindigkeit sehr klein machen, sodass Sie sich der X-Bewegung annähern. Oder fügen Sie Ihrer Division einfach einen kleinen Offset hinzu.

Es ist keine Chaostheorie, wenn es eine Computeranomalie ist.
Wenn Sie "Chaostheorie" wollen, dann können Sie sich meine folgende Animation ansehen , wo dies einen "Mond" bildet. Jede zusammengesetzte Kugel besteht aus zufällig verteilten Kugeln, und manchmal bekommt man einen Mond und manchmal nicht (ich habe zufällig eine der Zeiten aufgezeichnet, als sich ein Mond gebildet hat - was bei meiner Feinabstimmung etwa 1 zu 10 ist läuft).
Pot-a-to, pot-ah-to. Der Begriff Chaostheorie ist ohnehin nicht gut definiert. Aber was ich meine, ist, dass kleine Änderungen der Anfangsbedingungen große Änderungen in der Ausgabe verursachen.
Nein, der Begriff Chaos ist sehr klar definiert. Das bedeutet, dass bei gleichen Anfangsbedingungen geringfügige Abweichungen zu drastisch unterschiedlichen Ergebnissen führen.
Wenn also das OP seinen Zeitschritt ändert, ändert sich die Oszillation dramatisch? ;-)
Ich habe nur gescherzt. Du hast natürlich Recht. Aber der Punkt ist, dass die Berechnung wegen des Fehlers bei der Division durch Null schlecht definiert ist, der auftreten sollte , wenn der Zeitschritt genau richtig wäre.
Nun, es gibt etwas, dem wir zustimmen ... Sie sollten niemals zulassen, dass Punktteilchen unter irgendeiner Kraft in einer Entfernung von "nahe Null" kollidieren.
Das ist keine „Chaostheorie“. Das Zweikörperproblem ist nicht chaotisch. Das ist einfach schlechte Mathematik.
Das Zwei-Körper-Problem ist nicht chaotisch, aber Sie müssen eine positive Distanz zwischen ihnen wahren
Das Problem ist nicht chaotisch, aber der Lösungsansatz ist ... mit anderen Worten, durch die Verwendung eines festen Zeitschritts hat das OP ein nicht chaotisches Problem in ein chaotisches verwandelt (nämlich empfindlich gegenüber kleinen Abweichungen in der Eingabe). "Lass uns das Ganze absagen."