我试图用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执行地球 - 木星距离的简单计算的任何建议吗?
谢谢!
答案 0 :(得分:6)
如错误所示,您需要使用JUPITER BARYCENTER
代替jupiter
。
答案 1 :(得分:2)
如果它有用,这只是补充 - 接受的答案解决了问题。
我想表明,由于位置是重心坐标,['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()
底部的两个图(下图)显示了地球和月亮相对于地球重心的运动,在Skyfield中被称为['earth 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()