这是我第一次在这里问问题,因为我几天前才开始编写代码,我可能需要你的帮助来更精确地定义我的问题
我想模拟一些开普勒轨道,但我有反复出现的问题与所需的精度。例如,当我的点接近重心时,它会把它抛出每一个合理的轨道(我的理论是,与时间窗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)
我希望这是有点可读性,有人谁愿意帮助一个年轻的程序员了。:)
澄清图片:
目前没有回答
相关问题 更多 >
编程相关推荐