【问题标题】:How to simulate Orbits如何模拟轨道
【发布时间】:2016-07-06 15:36:27
【问题描述】:

当我运行我的代码时,地球似乎趋向于一个极限,而不是围绕太阳公转,是我遗漏了方程式还是我的代码有问题?

这是我得到的错误:

Warning (from warnings module):
  File "C:\Python32\lib\site-packages\visual\visual_all.py", line 52
    return numpy(x)
RuntimeWarning: invalid value encountered in sqrt

这是我写的代码:

from visual import *

def SUVAT(A,B):
        global EarthFinalV
        global Acceleration
        EarthFinalV = sqrt((A) + 2*Acceleration*(B))

GravitationalConstant = 1

Sun = sphere(pos=(0,0,0), radius=10, color=color.red,
             make_trail=True)

Earth = sphere(pos=(50,0,0), radius=5, color=color.yellow,
               make_trail=True)

Sun.mass = 50
Earth.mass = 10

EarthInitialV = vector(0,1000,0)
EarthFinalV = vector(0,0,0)

while True:
    rate(1)
    Distance = Earth.pos - Sun.pos

    GravitationalEquation = (GravitationalConstant*Sun.mass*Earth.mass) / mag(Distance)**2
    Acceleration = GravitationalEquation/Earth.mass

    SUVAT(EarthInitialV,Distance)

    Earth.pos = Earth.pos - EarthFinalV

【问题讨论】:

  • 这是警告的完整跟踪吗?此外,就像一个挑剔的人。您应该考虑不使用全局导入(即from visual import *),它可能会不时引起问题。您知道代码的哪一部分导致了问题吗?
  • 我不知道 SUVAT 是如何获得Acceleration 的,因为它应该超出范围。你能发表你认为你的方程式应该在更少程序化、更数学意义上的内容吗?

标签: python vpython


【解决方案1】:

我注意到你的重力方程是错误的。你应该除以半径的平方,而不是半径的两倍。代替mag(Distance)*2,试试Distance * Distance,或Distance**2

【讨论】:

  • 我收到了一个错误,因为它是一个 3D 矢量。如果我没有向量的大小,它就不会运行代码。
  • 对,Mag(vector) = 矢量长度。这是有道理的,物理课已经有一段时间了。但是:F=g * m1 * m2 / (r * r)。所以让分母 Mag(Distance) ** 2,而不是 Mag(Distance)*2。额外的星号将导致半径平方而不是加倍。
  • 我现在对其进行了编辑,使距离为平方,但现在它趋向于一个没有错误的极限,它仍然没有绕太阳运行。您认为是什么原因造成的?
  • 你看过上面的@busfault 评论了吗?您已定义 SUVAT() 以使用参数 Acceleration,但它未定义。我相信Acceleration 的默认值将是“无”。所以尝试传入Acceleration。那个,或者像你为EarthFinalV做的那样让它成为全球性的
  • 另外,如果你是在linux上开发,在代码上运行pychecker。 pychecker module.py。这是一个足够的静态分析工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多