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:
Das obige Diagramm ist eine Position Vs. Zeitdiagramm.
Wie kann ich den Code anpassen, um vernünftigere Ergebnisse zu erhalten?
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:
particle1[4]
, verwenden aber nur zwei Komponentendt
In Bezug auf den ersten Punkt würde ich a struct
fü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.
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.
Jared
Jared
Jared
Kenshin
Jared
Kenshin
Jared
QMechaniker
Jared
Floris
David Hammen
JamalS
Kyle Kanos
Kyle Kanos
using namespace std
, .