Cannot get RK4 to solve for position of orbiting body in Python

后端 未结 2 1442
栀梦
栀梦 2020-12-01 20:20

I am trying to solve for the position of a body orbiting a much more massive body, using the idealization that the much more massive body doesn\'t move. I am trying to solve

2条回答
  •  余生分开走
    2020-12-01 21:06

    You are not using rkx, rky functions anywhere! There are two return at the end of function definition you should use return [(kx1 + 2*kx2 + 2*kx3 + kx4)/6, (mx1 + 2*mx2 + 2*mx3 + mx4)/6] (as pointed out by @eapetcho). Also, your implementation of Runge-Kutta is not clear to me.

    You have dv/dt so you solve for v and then update r accordingly.

    for n in range(1,len(t)): #solve using RK4 functions
        vx[n] = vx[n-1] + rkx(vx[n-1],vy[n-1],t[n-1])*dt
        vy[n] = vy[n-1] + rky(vx[n-1],vy[n-1],t[n-1])*dt
        x[n] = x[n-1] + vx[n-1]*dt
        y[n] = y[n-1] + vy[n-1]*dt
    

    Here is my version of the code

    import numpy as np
    
    #constants
    G=1
    M=1
    h=0.1
    
    #initiating variables
    rt = np.arange(0,10,h)
    vx = np.zeros(len(rt))
    vy = np.zeros(len(rt))
    rx = np.zeros(len(rt))
    ry = np.zeros(len(rt))
    
    #initial conditions
    vx[0] = 10 #initial x velocity
    vy[0] = 10 #initial y velocity
    rx[0] = 10 #initial x position
    ry[0] = 0 #initial y position
    
    def fx(x,y): #x acceleration
         return -G*M*x/((x**2+y**2)**(3/2))
    
    def fy(x,y): #y acceleration
         return -G*M*y/((x**2+y**2)**(3/2))
    
    def rk4(xj, yj):
        k0 = h*fx(xj, yj)
        l0 = h*fx(xj, yj)
    
        k1 = h*fx(xj + 0.5*k0 , yj + 0.5*l0)
        l1 = h*fy(xj + 0.5*k0 , yj + 0.5*l0)
    
        k2 = h*fx(xj + 0.5*k1 , yj + 0.5*l1)
        l2 = h*fy(xj + 0.5*k1 , yj + 0.5*l1)
    
        k3 = h*fx(xj + k2, yj + l2)
        l3 = h*fy(xj + k2, yj + l2)
    
        xj1 = xj + (1/6)*(k0 + 2*k1 + 2*k2 + k3)
        yj1 = yj + (1/6)*(l0 + 2*l1 + 2*l2 + l3)
        return (xj1, yj1)
    
    for t in range(1,len(rt)):
        nv = rk4(vx[t-1],vy[t-1])
        [vx[t],vy[t]] = nv
        rx[t] = rx[t-1] + vx[t-1]*h
        ry[t] = ry[t-1] + vy[t-1]*h
    

    I suspect there are issues with fx(x,y,t) and fy(x,y,t)

    This is the case, I just checked my code for fx=3 and fy=y and I got a nice trajectory.

    Here is the ry vs rx plot:

提交回复
热议问题