Die Erdumlaufbahnsimulation hat eine falsche Geschwindigkeit


8

Ich bin sehr neu in der Programmierung und habe eine Schulaufgabe bekommen, für die ich in p5.js eine Simulation der Erdumlaufbahn um die Sonne erstellen muss. Uns wurde eine vereinfachte Methode zur Berechnung der Anziehungskraft angeboten, aber ich wollte die tatsächliche Formel verwenden (Fg = G M m / r ^ 2). In meinem Code entspricht ein Pixel 10 ^ 9 Metern oder einer Million km. Wenn ich die tatsächlichen Massen von Sonne und Erde sowie den tatsächlichen Abstand zwischen ihnen verwende, muss ich die Geschwindigkeit, mit der sich die Erde bewegt, auf etwa 1 Pixel pro Sekunde oder eine Million km / s einstellen, was ungefähr der Fall ist 30.000-fache Geschwindigkeit der Erde im Orbit. Mein Code:

x = 550;
y = 400;
vy = -1;
vx = 0;
dt = 1;
sunSize = 80;
planetSize = 10;
// 1 pixel equals 1 million km
canvasSize = 800;
starAmount = 600;

function setup() {
  frameRate(60);
  noStroke()
  solarXY = 0.5 * canvasSize;
  xSun = solarXY;
  ySun = solarXY;
  createCanvas(canvasSize, canvasSize);
  M = 1.989 * pow(10, 30);
  m = 5.972 * pow(10, 24);
  background(0);
  for (i = 0; i < starAmount; i++) {
    starX = Math.random() * canvasSize;
    starY = Math.random() * canvasSize;
    starSize = Math.random() * 3 + 1
    ellipse(starX, starY, starSize, starSize);
  }
  fill(255, 192, 0);
  ellipse(xSun, ySun, sunSize, sunSize);
}

function draw() {
  r = sqrt(sq(xSun - x) + sq(ySun - y)) * pow(10, 9);
  Fg = 6.67 * pow(10, -11) * m * M / sq(r);
  if (x >= xSun) {
    angle = atan((ySun - y) / (x - xSun));
  } else {
    angle = PI + atan((ySun - y) / (x - xSun));
  }
  xOld = x;
  yOld = y;
  Fgx = cos(angle) * Fg
  Fgy = sin(angle) * Fg
  ay = Fgy / m;
  ax = -Fgx / m;
  vy += ay * dt;
  vx += ax * dt;
  y += vy * dt;
  x += vx * dt;
  fill(30);
  ellipse(xOld, yOld, planetSize, planetSize);
  fill(0, 0, 192);
  ellipse(x, y, planetSize, planetSize);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>

Wissen Sie, was die Ursache sein könnte? Danke im Voraus.


2
Ich habe den Code noch nicht vollständig verstanden, aber es scheint, dass Sie zwei Modelle zur Berechnung der Position der Erde mischen. Das Kepler-Modell nimmt an, dass die Umlaufbahn eine Ellipse ist, und berechnet die Position aus den Umlaufbahnparametern, während das Newton-Modell nur Kräfte berücksichtigt und die elliptische Umlaufbahn ein Ergebnis davon ist. Insbesondere berechnen Sie die Gravitationskraft zwischen zwei Körpern, "lenken" dann aber die Kraft entlang der Ellipse um. Sie können allein zum Newton-Modell wechseln, dies bringt jedoch einige Probleme mit sich. Achten Sie darauf, dass Sie bei großen / kleinen Zahlen nicht auf Präzisionsprobleme stoßen.
Etienne Ott

Etienne Ott, ich verstehe nicht wirklich, was du damit meinst. Soweit ich weiß, kann die Gravitationskraft basierend auf dem Winkel zum Massenschwerpunkt in eine x- und eine ay-Komponente aufgeteilt werden. Ich bin mir nicht sicher, ob Sie das gemeint haben, da ich nicht sicher bin, was der Unterschied zwischen dem Kepler-Modell und dem Newton-Modell ist. Könnten Sie also etwas aussagekräftiger sein?
Gijsfwb

Anscheinend habe ich Ihren Code falsch verstanden. Wenn ich mit Kräften arbeite, kümmere ich mich normalerweise nicht um Winkel, um die Kräfte in ihre Komponenten aufzuteilen. Es ist einfacher, den Einheitsvektor (mit der Länge 1) entlang der Kraftrichtung zu berechnen und dann mit dem Skalar zu multiplizieren, der die Stärke der Kraft bestimmt. Wie auch immer, der Code scheint dort das Richtige zu tun, also lassen Sie uns das ignorieren. Was ich mich jetzt frage, sind die Einheiten der Variablen. Zum Beispiel ist Ihr Zeitschritt 1, aber die Bewegung scheint schneller zu sein, als die Simulation um 1 Sekunde pro Anruf voranzutreiben. Vermutlich bedeutet 1 nicht 1 Sekunde.
Etienne Ott

Das nächste, was ich tun würde, ist, die Einheiten aufzuschreiben und sie durch die verschiedenen Berechnungen zu führen. Sehen Sie also, wie hoch die tatsächlichen Einheiten beispielsweise der Geschwindigkeit sind. Eine andere Sache ist, dass der Zeitschritt festgelegt ist, aber es ist nicht klar, wie oft ein Zeitschritt pro Echtzeitsekunde aufgerufen wird, und es ist auch nicht klar, wie lange (dh wie viele Anrufe) die Simulation dauern sollte, um ein Jahr im gewünschten Zeitrahmen abzuschließen. Sie könnten die Simulation in Echtzeit durchführen, aber ich denke nicht, dass es sehr interessant ist, eine Revolution pro Jahr zu sehen. ;)
Etienne Ott

dt ist in Sekunden pro Frame angegeben, und ich bin mir ziemlich sicher, dass dies korrekt ist, da alle Einheiten in meinen Berechnungen Sekunden verwenden. Ich werde versuchen zu sehen, was die Geschwindigkeit tut und wann, aber für mich sieht es so aus, als ob sie über die gesamte Umlaufbahn mehr oder weniger die gleiche Geschwindigkeit
beibehält

Antworten:


4

Sie scheinen eine Beschleunigung in Metern pro Sekunde 2 und eine Geschwindigkeit in Pixel pro Sekunde zu haben. Dann kombinieren Sie sie:

vy += ay * dt;
vx += ax * dt;

Ihre Gravitationsbeschleunigungen sind eine Milliarde Mal zu stark. Ihr Planet muss sich also ungefähr 31.623 Mal schneller als normal bewegen, um eine kreisförmige Umlaufbahn zu halten.


Das hat funktioniert! Vielen Dank!
Gijsfwb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.