【问题标题】:Earth goes out of orbit in java simulation地球在java模拟中脱离轨道
【发布时间】:2015-12-27 19:02:03
【问题描述】:

首先,我对 java 很陌生,抱歉。我正在尝试模拟地球绕太阳运行。绘制结果后,很明显地球在旋转一圈后就螺旋出轨道!

我已经检查并再次检查了常数,例如太阳和地球的质量以及初始速度和位置。我不确定我哪里出错了,同事和讲师也确认了方程式是正确的。

代码由 4 个类组成:

找到。

【问题讨论】:

  • 最后一个类是向量类,我确定那里不存在错误。
  • 问问自己每次执行“时间步”或每次模拟以数字方式近似计算时会发生什么。
  • 您正在使用离散步骤估计未来位置,并且在数学上您可能需要更高阶近似值(泰勒或麦克劳林级数)时使用一阶近似值。不过,我不确定在代码中执行此操作的最有效方法。
  • 您正在使用的数字遍布整个规模。浮点数学不适用于这种情况。对于涉及如此广泛的值的任何事情,您应该使用一些具有明确定义的错误边界的更精确的数字表示。使用 BigDecimal 重写所有内容,选择适当的舍入级别(这可能不是显而易见的步骤),您应该会得到更好的结果。
  • 这是作业吗?如果是这样,那么作业的重点可能就是展示这种建模方法的局限性......

标签: simulation


【解决方案1】:

不好:

y += yVelocity * timeStep;     
x += xVelocity * timeStep;

当您使用离散时间步长时,您不仅必须将速度添加到您的位置,还必须在此期间加速度对您的速度产生的影响。

更好:

yAccel = Sun.componentY();     
xAccel = Sun.componentX();

y += (yVelocity + yAccel * timeStep * 0.5) * timeStep;
x += (xVelocity + xAccel * timeStep * 0.5) * timeStep;

yVelocity += yAccel * timeStep;
xVelocity += xAccel * timeStep;

这假设加速度在整个时间步长的持续时间内保持不变,但实际上并非如此。不过,它应该更接近您想要实现的目标。

最佳:

使用积分您应该能够完美地模拟真实行为(忽略浮点问题)。

加速度、速度和位置都可以使用积分来表示,然后您应该能够求解 t 到 t+dt 的每帧模拟范围。我发现 Mathematica 的试用许可证在这种情况下非常有用。

【讨论】:

  • 谢谢,。我刚刚试过这个,你的权利它确实越来越近了,但是地球仍然离开了轨道。你的意思是 y+= (yVelocity +(yAccel*timestep*0.5))*timestep 吗?
  • 是的,我就是这个意思。然而,应该会遇到同样的事情。
  • 这种计算方法假设加速度在时间步长的持续时间内保持不变,但实际上并非如此。因此结果不能准确,但会随着更小的时间步长变得更好。您也可以尝试在时间步长期间模拟加速度变化,这会让您更接近,但我想它永远不会完美。
猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多