【问题标题】:Earth orbit plot Python地球轨道图 Python
【发布时间】:2020-05-03 10:15:49
【问题描述】:

我正在用 Python 完成一个关于行星运动的项目,第一个任务是为地球绕太阳运行的轨道编写代码。这是我目前所拥有的:

def earth_orbit(rEar,v0):
    
    #r0 = xEar[0] = rEar 
    #v0 = vyEar[0] = np.sqrt(mu/rEar) 
    
    #Set parameters:
    N = 365                     # Earth days in a year
    dt = 1.00/N                 # Time Step: Fractions of a year - 1 Earth day (i.e. 1/365)
    mu = 4*np.pi**2             # Gravitational parameter 

    #Create an array, for all variables, of size N with all entries equal to zero:
    xEar = np.zeros((N,))
    yEar = np.zeros((N,))
    vxEar = np.zeros((N,))
    vyEar = np.zeros((N,))

    # Initial Conditions:
    xEar[0] = rEar                   # (x0 = r, y0 = 0) in AU
    vyEar[0] = v0                    #units: AU/yr

    #Implement Verlet Algorithm:
    for k in range(0,N-1):
        rEar = (xEar[k]**2+yEar[k]**2)**0.5
        vxEar[k+1] = vxEar[k] - (mu*xEar[k])/((rEar)**3)*dt
        xEar [k+1] = xEar[k] + vxEar[k+1]*dt
        vyEar[k+1] = vyEar[k] - (mu*yEar[k])/((rEar)**3)*dt
        yEar [k+1] = yEar[k] + vyEar[k+1]*dt

     #Plot:
    a = plt.plot(xEar, yEar, 'go', markersize = 1, label = 'Earth trajectory')
    plt.plot(0,0,'yo', label = 'Sun positon')        #yellow marker for the sun
    plt.plot(xEar[0],0,'bo', label = 'Earth initial positon')  #dark blue marker for earth's initial position
    plt.axis('equal')
    plt.xlabel ('x')
    plt.ylabel ('y')
    
    return a, xEar, yEar

这很好用,但是对于项目的后续部分,我被告知我不应该将 AU 用于此基本代码,因为它会造成困难。我尝试更改引力参数并将输入置于标准单位中,但图形变为仅 2 个点(xEarvyEar 的值保持不变)而不是圆形轨道,我不知道为什么会这样?

【问题讨论】:

  • IIUC,你有一个工作功能,所以试着逐步改变它到你想要的版本,并在每一个小步骤之后进行测试,看看是什么导致了问题。
  • 问题可能仅仅是您更改了尺寸(如果您已从 AU 更改为米,则会更改多个数量级)但没有更改初始值?我一直在努力让您的代码正常工作,但我懒得弄清楚参数的合理值是多少,所以我一直在猜测,到目前为止,我还没有实现任何类似轨道的东西。 (编辑:当我写这篇文章时,我想到给定单位,1 和 2*Pi 将是初始值的明显选择,我现在有一个圆形轨道)
  • 我试图改变初始值以及重力参数,我只是不明白为什么将所有从 AU 更改为 km 或 m 时它根本不起作用

标签: python simulation orbital-mechanics


【解决方案1】:

由于引力常数的定义,当你改变长度单位时,你必须将mu的值改变为比例因子的立方。

为方便起见,我将mu 的定义拉到函数之外。

import numpy as np
import matplotlib.pyplot as plt

def earth_orbit(rEar, v0):

    #Set parameters:
    N = 365      # Earth days in a year
    dt = 1. / N  # Time Step: Fractions of a year - 1 Earth day (i.e. 1/365)

    #Create an array, for all variables, of size N with all entries equal to zero:
    xEar = np.zeros((N,))
    yEar = np.zeros((N,))
    vxEar = np.zeros((N,))
    vyEar = np.zeros((N,))

    # Initial Conditions:
    xEar[0] = rEar                   # (x0 = r, y0 = 0) in AU
    vyEar[0] = v0                    #units: AU/yr

    #Implement Verlet Algorithm:
    for k in range(0, N-1):
        rEar = (xEar[k]**2+yEar[k]**2)**0.5
        vxEar[k+1] = vxEar[k] - ((mu * xEar[k]) / (rEar**3)) * dt 
        xEar [k+1] = xEar[k] + vxEar[k+1]*dt
        vyEar[k+1] = vyEar[k] - ((mu * yEar[k]) / (rEar**3)) * dt 
        yEar [k+1] = yEar[k] + vyEar[k+1]*dt

     #Plot:
    a = plt.plot(xEar, yEar, 'go', markersize = 1, label = 'Earth trajectory')
    plt.plot(0,0,'yo', label = 'Sun positon')                  # yellow marker
    plt.plot(xEar[0],0,'bo', label = 'Earth initial positon')  # dark blue marker
    plt.axis('equal')
    plt.xlabel ('x')
    plt.ylabel ('y')

    return a, xEar, yEar


# average distance earth-sun (1 AU) in meter
au_to_m = 149_597_870_700.

mu = au_to_m**3 * 4 * np.pi**2  # Gravitational parameter 

earth_orbit(au_to_m, np.sqrt(mu / au_to_m));

【讨论】:

  • 这很有帮助,但是我对您在这里用于 v0 的数字有点困惑?该项目的一个问题是验证当初始位置为 (0,rEar) 和切向初始速度 (0, 29.8km/s) 时您是否找到了一个闭合轨道,但是我尝试输入这个并且输出只是一条水平线,所以我不确定测试这个的正确方法
  • @178971 我从原始代码顶部附近关于v0 的评论中得到了表达式np.sqrt(mu / au_to_m),只需为rEar 插入au_to_m,因为这是地球的轨道半径米。请注意,您的代码中的时间单位是年,因此您要验证的初始 y 速度是 29800 * 60 * 60 * 24 * 365.25 米/年,结果实际上与我使用的值相同。
  • 哦,是的,我现在明白了,谢谢您的帮助!我的最后一个问题是,我一直在研究人们为模拟地球轨道所做的类似代码,其中大部分都包括太阳的质量,所以我有点担心不包括它,但是因为这段代码有效我很困惑如果需要我会在哪里实现它?
  • @178971 如果要明确使用地球和太阳的质量,可以使用牛顿公式计算万有引力,使用 F = m*a 更新速度。见en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation
  • 我一直在尝试,但我的输出只有 2 个点。我试图在 for 循环中包含加速度的计算,但我认为这是不对的,你有关于如何在我的代码中实现它的任何提示吗?
猜你喜欢
  • 2018-03-15
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多