我编写了一个计算冥王星轨道并制作动画的程序,并开始使用类重写它,因为这似乎是将更多行星引入模拟的明智方法。即有一个定义物理学的类,然后输入特定行星数据以获得轨道数据。
class Planet(object):
m_sun = 1.989*(10**30)
G = 6.67*(10**-11)
dt = 1
coords = []
def __init__(self, x, y, vx, vy, m):
self.x = x
self.y = y
self.vx = vx
self.vy = vy
self.m = m
def genData(self):
while self.dt < 100000000:
r = ((self.x)**2 + (self.y)**2)**0.5
a = ((self.G*self.m_sun)/r**2)
ax = -a*((self.x)/r)
ay = -a*((self.y)/r)
self.vx = self.vx + ax*self.dt
self.vy = self.vy + ay*self.dt
self.x = self.x + self.vx*self.dt
self.y = self.y + self.vy*self.dt
coord = (self.x, self.y)
print coord
self.coords.append(coord)
self.dt = self.dt + 1000
pluto = Planet(4495978707000, 0, 0, 4670, 1.305*(10**22))
pluto.genData()
我敢肯定它并不完美,但它似乎可以正常工作(这是我自己构建的第一个类)。我的问题是如何将“坐标”中的数据提取到我可以在类外使用的列表中。
我想为每个星球生成数据,然后使用这些数据在 Pygame 中创建动画。例如,冥王星、地球、土星等的 (x,y) 坐标列表。就目前而言,它会生成数据,但似乎无法从类外部访问。
我希望我的问题是有道理的。
谢谢!
请您参考如下方法:
您的问题已得到解答,但我有一些信息对您改进程序很有用。从技术上讲,此信息属于评论(因为您实际上并没有在您的问题中询问这个问题),但它不适合。 :)
冥王星的轨道相当倾斜于黄道,因此如果您想将它与太阳系中的其他几颗行星一起绘制,您需要在 3D 中工作才能准确。但我想这对您的应用程序来说没什么大不了的。
与冥王星相比,地球的轨道很小,因此您可能需要实现缩放才能在一个动画中同时看到它们。
您可以使用 Standard gravitational parameter 提高计算的准确性而不是使用单独的 G 值和质量。
您计算速度和位置的算法称为 Euler integration .相当于用多边形来近似轨道的曲线。它有效,但不是很准确。所以你需要让时间增量非常小,否则轨道不会很真实,甚至可能不是闭合曲线。即使这样也无济于事,因为误差是累积的,所以最终计算出的轨道与现实几乎没有相似之处。
没有一种数值积分技术是完美的(除了非常简单的函数),但是一个流行的更准确的积分技术系列(因此可以在更大的时间步长下工作)是 Runge-Kutta methods .您可以找到许多使用 Runge-Kutta 方法进行轨道计算的示例代码;大多数代码示例使用称为 RK4 的变体。
但是,我强烈敦促您尝试Leapfrog一体化。编写 Leapfrog 的同步形式的代码非常容易,它比 Runge-Kutta 的一个主要好处是它是辛的,这(大致)意味着它节约能量,因此误差不会从一个轨道累积到另一个轨道。
