我正在try 用Java编写一个太阳系模拟代码(使用真实世界的值).首先,我利用牛顿的引力公式和确定轨道时间的起始速度,制作了一颗绕太阳旋转的行星. 代码的工作原理是这样的:我有一个行星列表(假设太阳是一颗行星),在每一帧上,我循环通过该列表,并根据所有其他行星的总力为每一颗行星应用引力. 每个行星在2D空间中都有一个速度向量和一个位置向量,做功最多的两个函数如下所示:

private Point2D getAttractionForce(Planet planet){
    double distanceX = planet.x-this.x;
    double distanceY = planet.y-this.y;
    double distance = Math.sqrt(Math.pow(distanceX, 2)+Math.pow(distanceY, 2));

    double force = SolarSystem.G*this.mass*planet.mass/Math.pow(distance, 2);
    double angle = Math.atan2(distanceY, distanceX);
    double forceX = force * Math.cos(angle);
    double forceY = force * Math.sin(angle);

    return new Point2D(forceX, forceY);
}

public void updatePosition(List<Planet> planets){
    double totalForceX = 0;
    double totalForceY = 0;

    for (Planet planet : planets){
        if (planet == this) continue;
            Point2D force = getAttractionForce(planet);
            totalForceX += force.getX();
            totalForceY += force.getY();
        }
    }

    this.xVelocity += totalForceX/this.mass*TIMESTEP;
    this.yVelocity += totalForceY/this.mass*TIMESTEP;

    this.x += this.xVelocity*TIMESTEP;
    this.y += this.yVelocity*TIMESTEP;
}

The problem

我的问题是,当我在地球附近加上一个月亮时:

Planet moon = new Planet(Color.GRAY, 4, 7.35e22, -(1.50e11+4e8), 0, 0, 1022);

月球受到太阳的吸引,并不像它应该做的那样绕地球自转.出于调试目的,我计算了以下值:

Distance moon-sun: 1.504E11
Sun force for moon: 4.313523549126089E20
Distance moon-earth: 4.0E8
Earth force for moon: 1.831019119125E20

我得到的月球-太阳引力是月球-地球引力的4倍. 我试着改变月球的初始速度,但我得到的只是月球绕太阳旋转. 我做错了什么?

下面是完整的代码(需要JavaFX):https://pastebin.com/fiU4m7Te

感谢您的任何帮助,谢谢

推荐答案

从太阳上看,地球和月球在几乎相同的方向上以几乎相同的速度运行.太阳对月球施加强大的力是有道理的,但这种力应该主要导致月球和地球一起绕太阳运动,因为两者经历的加速度几乎相同.

只有当你仔细观察时,这种分离的运动才会变得明显.在那里,你对地球的吸引力较弱,而且由于位置略有不同,你对太阳的加速度也略有不同.

你也在处理地月系统中非常不同的速度.如果模拟以离散时间步长运行,这可能会导致严重问题,因为它可能会导致地球在一个时间点的位置与下一个时间点的位置大不相同.

如果你知道哪些卫星围绕哪些行星运行(比如,你不需要模拟如果一颗流氓行星捕获月球并将其拉走会发生什么),那么只关注差异可能会得到更好的结果.假设在最大的部分,月球的运动方式和行星一样.然后计算由行星的引力和太阳的位置差所产生的加速度差,并使用该加速度差来跟踪位置差的演变,即参考系中以行星为中心的轨道.

还有一些方法可以使用更高级的数值积分技术,例如Runge-Kuttasymplectic integrators,但学习它们可能需要一些时间.

Java相关问答推荐

为什么我的画布没有显示在PFA应用程序中?

@ EnableRouting注释在Kotlin项目中不工作

参数值[...]与预期类型java.util.Date不匹配

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

使用标记时,场景大纲不在多个线程上运行

为什么在maven中,getLast方法不适用于List?

我如何知道MediaDiscoverer何时完成发现介质?

Spring Security不允许加载js

二进制数据的未知编码/序列化

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

Android应用程序为错误的显示类型 Select 尺寸文件

无法将GSON导入到我的JavaFX Maven项目

在java中使用不同的application.properties-jar而不使用Spring

未调用OnBackPressedCallback-Activitiy立即终止

无限递归Java问题

谷歌应用引擎本地服务器赢得';t在eclipse上运行

javax.crypto-密码对象-提供者服务是如何工作的?

当我try 返回可选时,Mock无法正常工作

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

更新不可变的深层嵌套字段