【问题标题】:How to calculate continuous effect of gravitational pull between simulated planets如何计算模拟行星之间引力的连续效应
【发布时间】:2011-10-23 02:54:21
【问题描述】:

所以我正在对不同的行星进行简单的模拟,这些行星具有各自的速度在太空中飞行并相互绕行。

我计划通过将每个行星视为投射自己的“重力矢量场”来模拟它们之间的相互拉动。每个时间步我将添加从每个行星单独的向量场方程(V = -xj + (-yj) 或类似的符号)输出的向量,除了在计算中受到影响的那个,并使用受影响的行星位置作为方程的输入。

但是,这会不准确,并且不认为引力是连续的和恒定的。如果每个行星都持续影响其他行星,我应该计算行星的运动吗?

谢谢!

【问题讨论】:

  • 谷歌搜索“多体问题”

标签: physics gravity


【解决方案1】:

除了 Blender 写的关于使用牛顿方程的内容之外,您还需要考虑如何在“加速度场”上进行积分(正如您在对他的回答的评论中所说的那样)。

最简单的方法是使用Euler's Method。问题在于它会迅速发散,但它具有易于编码和相当快的优势。

如果您正在寻找更好的准确性,并且愿意牺牲一些性能,那么Runge-Kutta methods(可能是 RK4)之一通常是一个不错的选择。我会提醒你,如果你的“加速场”是动态的(即它会随着时间而变化......也许是由于行星在它们的轨道上移动的结果)RK4 将是一个挑战。

更新(基于下面的评论/问题):

如果要计算某个时间步t的力向量Fi(tn) n 应用于特定对象 i,然后您需要使用 Blender 引用的方程式计算模拟中所有其他对象贡献的力。也就是说,对于每个对象,i,您会计算出所有其他对象是如何拉(施加力)的,并且这些向量在求和时将是施加到 i 的总力向量.从算法上看,这看起来像:

对于每个对象 i
    Fi(tn) = 0
    对于每个对象 ji
        Fi(tn) = Fi (tn) + G * mi * mj / |pi(tn)-p j(tn)|2

其中 pi(tn) 和 pj(tn) 是对象ij在时间tn 分别和 | |是标准欧几里得 (l2) 法线...即两个对象之间的欧几里得距离。另外,G 是gravitational constant

欧拉方法将模拟分解为离散的时间片。它着眼于当前状态,在您的示例中,考虑将所有力汇总到模拟中的所有对象,然后在时间片期间将这些力作为常数应用。使用时

ai(tn) = Fi(tn)/mi

(ai(tn) = t时刻的加速度矢量n sub>应用于对象iFi(tn)是在时间 tn 作用于物体 i 的力向量,mi 是物体 的质量i),力矢量(因此加速度矢量)在时间片的持续时间内保持不变。在您的情况下,如果您确实有另一种计算加速度的方法,则无需计算力,而是可以直接计算加速度。在任一情况下,在加速度保持恒定的情况下,时间 tn+1p(tn+1) 和物体在时间 tn+1, v(tn+1) 的速度将由下式给出:

pi(tn+1) = 0.5*a i(tn)*(tn+1-tn) 2 + vi(tn)*(tn +1-tn)+pi(tn)
vi(tn+1) = ai(tn+1)*(tn+1-tn) + vi(tn)

RK4 方法将您的系统驱动程序拟合到一个 2 次多项式,该多项式可以更好地逼近其行为。详细信息在我上面引用的 wikipedia 站点上,您应该能够在网络上找到许多其他资源。基本思想是,不是为特定时间片选择单个力值,而是在特定时间计算四个力向量,然后将力向量拟合到二次多项式。如果您的力矢量场在时间片之间没有变化,那很好。如果您使用重力来导出矢量场,并且作为重力源的物体移动,那么您需要计算它们在四个子间隔中的每一个的位置,以便计算力矢量。可以做到,但你的表现会比使用欧拉方法差很多。从好的方面来说,您可以获得更准确的对象相对于彼此的运动。因此,从某种意义上说,这是一个挑战,因为它的计算成本很高,而且在迭代的时间片中找出四个样本的所有对象应该在哪里有点麻烦。

【讨论】:

  • 谢谢andand,但是“挑战”是指难以准确还是难以理解/在代码中工作?另外,我仍然不太确定要搜索什么来学习如何使用欧拉方法通过矢量场进行积分,尤其是由每个对象投影的多个场组成的“全局场”。最重要的是,由于“全局场”引起的加速度,我如何考虑物体的不断变化的速度。
  • 哇,非常感谢您的解释!是的,向量领域正在发生变化,那么这是否意味着提高准确性的唯一方法是通过更多的迭代/估计该领域在时间片内将如何变化?我试图避免在时间片内将力矢量保持为常数。
【解决方案2】:

在与计算机打交道时,没有“连续”之类的东西,因此您必须以非常小的时间间隔来近似连续性。

话虽如此,您为什么要使用矢量场?牛顿怎么了?

物体上的力的总和就是上面的方程。将两者相等并求解a

因此,您只需逐个遍历所有对象并找到其上的加速度。

【讨论】:

  • 嗯,我发现矢量场更灵活,更易于可视化。我计划最终将这个模拟中编码的重力用于我可能想要通过编辑矢量场方程来稍微“弯曲或扭曲”重力的游戏。另外,我知道计算机不是“连续的”,但我最近了解了自然指数“e”,它解决了计算连续复利的问题……这让我认为必须有一种方法来做类似的事情一颗行星在重力场中移动……你怎么看?
  • 你好像有点被重力搞混了。上面的等式是如何计算由于重力而对物体施加的力。如果您要使用其他任何东西,那么您将不会计算重力,而是计算其他力。牛顿物理学中没有e,因为复利只是有极限的,在这种情况下用处不大。
  • 除此之外,你打算如何使用向量场?您将对其进行集成,这将是 3D 中的绝对地狱,并且具有不断变化的字段(因为您必须将 所有 字段添加在一起)。
  • 好吧,我想我不应该把它称为重力,因为它实际上更像是一个加速度场,根据它的位置定义一个物体在哪个方向上加速多少。我计划使用矢量场在不同物体之间形成有趣和扭曲的吸引力、液体/风动力学,以及与非接触和一些接触力有关的一切。而这个不断变化的场的问题正是我未来要解决的问题,但现在我如何找到一个物体在混合的静态加速度场中的确切运动?
  • 没有精确的解,所以一切都是近似值。您仍然需要遍历所有对象。对于每个被循环的对象,循环所有其他个对象,找到它们的吸引力,然后在一段时间内加速你的对象(在所有对象都被循环之后)。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2019-05-29
  • 2022-01-19
相关资源
最近更新 更多