地球到木星的距离与Skyfield

时间:2016-01-19 10:09:38

标签: python astronomy skyfield

我试图用Skyfield绘制从地球到太阳系行星的距离作为时间的函数。这非常简单,甚至在包主页的首页中给出。然而,虽然这对汞,金星和火星非常有效,但它对其他行星并不起作用。我不熟悉JPL星历文件,但似乎例如Jupiter在de421.bsp文件中没有关键条目,这可以解释这个问题。

这是一个最小的例子(来自主页的那个):

from skyfield.api import load, now

planets = load('de421.bsp')
earth, planet = planets['earth'], planets['jupiter']

jd = now()
position = earth.at(jd).observe(planet)
ra, dec, distance = position.radec()

print(distance)

错误如下。请注意,如果您更换' jupiter'由火星'在上面的代码中,它并没有崩溃。

---->  earth, planet = planets['earth'], planets['jupiter']
KeyError: "kernel 'de421.bsp' is missing 'JUPITER' - the targets it supports are:
SOLAR SYSTEM BARYCENTER, MERCURY BARYCENTER, VENUS BARYCENTER, EARTH BARYCENTER, 
MARS BARYCENTER, JUPITER BARYCENTER, SATURN BARYCENTER, URANUS BARYCENTER, 
NEPTUNE BARYCENTER, PLUTO BARYCENTER, SUN, MERCURY, VENUS, MOON, EARTH, MARS"

我是否以错误的方式使用星历文件(错误的重心?)或者这仅仅是de421.bsp文件的限制?我在Skyfield网站(here)上阅读了星历文件的描述,但不确定我是否完全理解它。

有关如何使用Skyfield执行地球 - 木星距离的简单计算的任何建议吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

如错误所示,您需要使用JUPITER BARYCENTER代替jupiter

答案 1 :(得分:2)

如果它有用,这只是补充 - 接受的答案解决了问题。

我想表明,由于位置是重心坐标,['solar system barycenter']将保留在原点。但是我被挫败了,因为它返回单个零值,而不是向量(或None)。无论如何

sun motion in barycentric frame

import matplotlib.pyplot as plt
from skyfield.api import load, JulianDate

data = load('de421.bsp')
sun  = data['sun']
bary = data['solar system barycenter']

years = [1975+i for i in range(51)]
sunpos, barypos = [], []

for year in years:
    jd = JulianDate(utc=(year, 1, 1))
    sunpos.append(sun.at(jd).position.km)
    barypos.append(bary.at(jd).position.km)

plt.figure()
x, y, z = zip(*sunpos)
plt.plot(years, x)
plt.plot(years, y)
plt.plot(years, z)
# x, y, z = zip(*barypos)
# plt.plot(years, x, '-k')
# plt.plot(years, y, '-k')
# plt.plot(years, z, '-k')

plt.title('suns motion in barycentric frame')
plt.savefig('bary one')
plt.show()

底部的两个图(下图)显示了地球和月亮相对于地球重心的运动,在Skyfield中被称为['earth barycenter']

various motions of earth, moon an barycenter

import matplotlib.pyplot as plt
import numpy as np
from skyfield.api import load, JulianDate

data  = load('de421.bsp')
earth = data['earth']
moon  = data['moon']
bary  = data['earth barycenter']

days = range(0, 366, 5)
earthpos, moonpos, barypos = [], [], []
for day in days:
    jd = JulianDate(utc=(2016, 1, day))  # seems to work
    earthpos.append(earth.at(jd).position.km)
    moonpos.append(moon.at(jd).position.km)
    barypos.append(bary.at(jd).position.km)
ep = np.array(earthpos).T
mp = np.array(moonpos).T
bp = np.array(barypos).T

plt.figure(figsize=[9,9])
plt.subplot(5,1,1)
for thing in ep:
    plt.plot(days, thing)
plt.subplot(5,1,2)
for thing in mp:
    plt.plot(days, thing)
plt.subplot(5,1,3)
for thing in bp:
    plt.plot(days, thing)
plt.subplot(5,1,4)
for thing in (ep-bp):
    plt.plot(days, thing)
plt.subplot(5,1,5)
for thing in (mp-bp):
    plt.plot(days, thing)
plt.savefig('bary two')
plt.show()