轨道力学Verlet积分中误差最小化的方法

2024-09-27 07:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次在这里问问题,因为我几天前才开始编写代码,我可能需要你的帮助来更精确地定义我的问题

我想模拟一些开普勒轨道,但我有反复出现的问题与所需的精度。例如,当我的点接近重心时,它会把它抛出每一个合理的轨道(我的理论是,与时间窗dt相比,加速度急剧增加,在重力“有机会”把它拉回来之前,它就达到了逃逸速度。)另一个问题是轨道本身绕着重心旋转。我还没有详细研究这个问题,但我想,这次的小错误总结起来,从而创造了这种花一样的效果

首先想想为什么会出现这些错误: 正如标题中所写,我使用一个简单的Verlet集成来近似真实的解决方案。我知道还有其他的可能性,比如龙格库塔法,但我看到人们用一个简单的欧拉近似做了一些很好的模拟。所以我认为二阶Verlet近似就足够了。也许事实并非如此,那么我应该使用另一种近似方法吗

第二个想法: 我只是把它编码得很糟糕,而且有更好的方法来处理它,使数值误差最小化。为了进一步分析,我在这里上传了我的小代码片段:

t = t + dt
i = 1
while t <= T and i <= n:
    #A_list was the idea of calculating the acceleration more efficient, i append the necessary entries, calculate the acceleration and delete the entries again to repeat the process  
    A_list.append(x_list[i])
    A_list.append(y_list[i])
    r    = np.sqrt(A_list[0]**2 + A_list[1]**2)
    A_x  = -(G*M/r**2) * A_list[0] * 1/r 
    A_y  = -(G*M/r**2) * A_list[1] * 1/r
    x_i1 = 2*A_list[0] - x_list[i-1] + A_x * dt**2
    y_i1 = 2*A_list[1] - y_list[i-1] + A_y * dt**2
    del A_list[1]
    del A_list[0]
    i = i + 1
    t = t + dt
    x_list.append(x_i1)
    y_list.append(y_i1)
    t_list.append(t)

我希望这是有点可读性,有人谁愿意帮助一个年轻的程序员了。:)

澄清图片:

enter image description hereenter image description here


Tags: andthe方法代码错误dtlistentries

热门问题