地球轨道模拟速度不正确

9

我是编程新手,拿到了一份学校作业,需要用 p5.js 创建地球绕太阳的模拟。我们有一个简化的计算引力的方法,但我想使用实际的公式 (Fg = GMm/r^2)。在我的代码中,一个像素等于10^9米或一百万千米。如果我使用太阳和地球的实际质量以及它们之间的实际距离,我必须将地球绕太阳的速度设置为每秒1个像素或1000000千米/秒,这大约是实际轨道速度的30000倍。我的代码:

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>

你知道可能的原因是什么吗?提前感谢。

3
我还没有完全理解这段代码,但是看起来你混合使用了两种计算地球位置的模型。开普勒模型假设轨道是一个椭圆,并从轨道参数中计算位置;而牛顿模型仅涉及力,而椭圆轨道是其结果。特别地,你计算两个物体之间的万有引力,然后将其“重定向”沿着椭圆轨道。你可以只使用牛顿模型,但那也会带来一些问题。要注意在处理大/小数时遇到精度问题的可能性。 - Etienne Ott
Etienne Ott,我不太明白你的意思。据我所知,重力可以根据其与质心的角度分为x和y两个分量。我不确定这是否是您所指的,因为我不知道开普勒模型和牛顿模型之间的区别,所以您能否再详细说明一下? - Gijsfwb
看起来我误解了你的代码。当使用力时,我通常不会费心将力分解为它们的分量角度。更容易的方法是计算沿着力方向的单位向量(长度为1),然后乘以确定力强度的标量。无论如何,代码似乎在那里做了正确的事情,所以让我们忽略它。现在我想知道的是变量的单位。例如,您的时间步长为1,但移动速度似乎比每次调用模拟前进1秒要快。很可能1并不意味着1秒。 - Etienne Ott
接下来我要做的是写下单位并在各种计算中进行转换,以查看例如速度的实际单位。另一件事是时间步长是固定的,但不清楚每秒实时时间内调用多少个时间步长,因此也不清楚模拟应该在所需时间范围内完成一年需要多长时间(即多少次调用)。您可以使模拟成为实时模拟,但我认为每年看到一次革命并不是非常有趣。;) - Etienne Ott
dt以每帧秒为单位,我相信这是正确的,因为我的所有计算都使用秒。我会尝试看看速度何时发生变化,但在我看来,它似乎在整个轨道上保持大致相同的速度。 - Gijsfwb
1个回答

6
你似乎拥有以米/秒 2 表示的加速度和以像素/秒表示的速度。然后你将它们组合起来:
vy += ay * dt;
vx += ax * dt;

你的重力加速度强了十亿倍。因此,你的星球必须比正常情况下快约31,623倍才能保持圆形轨道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接