【问题标题】:Modeling the trajectory of the planet around the sun. Ellipse is not closing模拟行星绕太阳运行的轨迹。椭圆没有闭合
【发布时间】:2020-01-27 12:27:47
【问题描述】:

我试图创建行星围绕太阳的投影。使用 RungeKutta 我正在尝试投影和创建 matplotlib 图。但是,外椭圆没有闭合。你能帮我吗,我到底在哪里做错了?

使用 Runge Kutta 找到位置随时间变化的向量 R。当我使用绘图来绘制轨迹时,它并没有画出我应该找到的椭圆。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

#unités de normalisation 
UA=149.59787e6                       #distance moyenne Terre-Soleil
MASSE=6.0e24                         #masse Terre
JOUR=24*3600                      

#données : 
k=0.01720209895  
G=(k**2)                             # constante de gravitation en km^3/kg/s²
r0= 1                                # distance initiale terre soleil en m    
Ms = 2.0e30/MASSE                    #masse Soleil
Mt = 1                               #masse Terre

w0 = 30/(UA/JOUR)                    #vitesse angulaire en Km/s
C = r0*(w0**2)
m = (Ms*Mt/Ms+Mt)                    #masse réduite

K = G*m                              #on choisit K > 0 

b = 2 #beta


def RK4(F, h, r, theta, t, *args):
    k1=F(t,r,theta,)[0]
    l1=F(t,r,theta,)[1]
    k2=F(t+h/2,r+h*k1/2,theta+h*l1/2)[0]
    l2=(t+h/2,r+h*k1/2,theta+h*l1/2)[1]
    k3=F(t+h/2,r+h*k2/2,theta+h*l2/2)[0]
    l3=F(t+h/2,r+h*k2/2,theta+h*l2/2)[1]
    k4=F(t+h,r+h*k3,theta+h*l3/2)[0]
    l4=F(t+h,r+h*k3,theta+h*l3/2)[1]

    return [r +(h/6)*(k1+2*k2+2*k3+k4),theta +(h/6)*(l1+2*l2+2*l3+l4)]

def F1(t,r,theta):
    return np.array([r[1],r[0]*theta[1]**2-K/r[0]**b]),np.array([theta[1],-2*r[1]*theta[1]/r[0]])

def RK4N(F1,N,r0,r1,theta0,theta1,ta,tb):
    h=0.05
    ri=np.array([r0,r1])
    thetai=np.array([theta0,theta1])
    ti=ta
    R=np.zeros((N,2))
    THETA=np.zeros((N,2))
    lt=np.zeros(N)
    lt[0], R[0],THETA[0] = ta , ri ,thetai
    for i in range (1, N):
        a = ri
        ri = RK4(F1,h,ri,thetai,ti)[0]
        thetai=RK4(F1,h,a,thetai,ti)[1]
        ti=ti+h
        R[i]=ri
        THETA[i]=thetai
        lt[i]=ti
    return R,THETA,lt
def trace_position(F1,N,r0,r1,theta0,theta1,ta,tb):

    R,THETA,lt=RK4N(F1,N,r0,r1,theta0,theta1,ta,tb)
    lx,ly=[],[]
    for i in range(N):
        lx.append(R[i][0]*np.cos(THETA[i][0]))
        ly.append(R[i][0]*np.sin(THETA[i][0]))
    plt.plot(lx,ly)
    plt.plot(0,0)
    plt.show()

    # rapport a/b    
    max_x,min_x,max_y,min_y= max(lx),min(lx),max(ly),min(ly)
    rapport = (max_x-min_x)/(max_y-min_y)
    print("rapport a/b = ",rapport)
    if abs(rapport-1)< 10e-2:
        print("le mouvement est presque circulaire")
    else:
        print("le mouvement est elliptique")

def trace_Ep(F1,N,r0,r1,theta0,theta1,ta,tb):
    R,THETA,lt=RK4N(F1,N,r0,r1,theta0,theta1,ta,tb)
    lEp = []
    for i in range(N):
        lEp.append(-K/R[i][0]**(b-1))

    #fig, (ax1, ax2) = plt.subplots(1, 2)
    #ax1.plot(lt,lEp)
    #ax2.plot(R[:,0],lEp)
    plt.plot(lt,lEp)
    plt.show()

trace_position(F1,380,r0,0,0,w0,0,1)

输出:

【问题讨论】:

    标签: python-3.x math differential-equations runge-kutta orbital-mechanics


    【解决方案1】:

    您犯了一个不常见的复制粘贴错误。有一个错误的除以两个剩下的

    k4=F(t+h,r+h*k3,theta+h*l3/2)[0]
    l4=F(t+h,r+h*k3,theta+h*l3/2)[1]
    

    还要注意l2 行中缺少的F。

    您可以缩短这些计算并避免冗余或重复计算,并通过使用元组赋值将错误的位置减少一半

    k4,l4 = F(t+h,r+h*k3,theta+h*l3)
    

    以后

    ri, thetai = RK4(F1,h,ri,thetai,ti)
    

    按照最初的预期将步长计算更改为h=(tb-ta)/N,并使用tb=150 获得闭环,对于选择的细分,通过

    for k in range(4):
        N = [16,19,25,120][k]
        plt.subplot(2,2,k+1,aspect='equal')
        trace_position(F1,N,r0,0,0,w0,0,150)
    

    【讨论】:

      【解决方案2】:

      Runge-Kutta 方法无法为您提供完美闭合的轨迹,因为存在能量漂移(能量逐渐减少)。

      如果您需要能量保持接近初始值,您可以使用辛积分器。您可以在Chris Rackauckas's answer on "What does 'symplectic' mean[...]" 中阅读更多相关信息。

      但是,正如 Lutz Lehmann 指出的那样,您的时间步长足够小,所以这不是您的轨迹没有明显闭合的原因。其他人可能会对此信息感兴趣,所以我将这个答案留在这里。

      【讨论】:

      • 您的说法是完全错误的,要使用正确实施的 RK4 在椭圆轨道上获得这种间隙,您需要将一个周期内的点数显着减少到 N=19(使用 ta,tb =0,150 和 h=(tb-ta)/N)。一般来说,能量的误差也是 O(h^4*t),随着时间的推移缓慢下降,但即使对于适度的小步长也相当小。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      相关资源
      最近更新 更多