5

我正在尝试使用 Skyfield 来绘制从地球到太阳系行星的 au 距离作为时间的函数。这超级简单,甚至在包主页的首页中都有。然而,虽然这对水星、金星和火星非常有效,但它不适用于其他行星。我不熟悉 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' 替换为 'mars',它不会崩溃。

---->  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 网站(此处)上阅读了星历文件的描述,但不确定我是否完全理解它。

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

谢谢 !

4

2 回答 2

7

就像错误说的那样,您需要使用JUPITER BARYCENTER而不是jupiter.

于 2016-01-19T10:11:14.537 回答
3

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

我想表明,由于位置位于重心坐标中,因此['solar system barycenter']将保持在原点。但我被挫败了,因为它返回一个零值,而不是一个向量(或None)。反正

重心框架中的太阳运动

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()

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

地球、月球和重心的各种运动

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()
于 2016-01-19T12:16:19.753 回答