Расстояние от Земли до Юпитера с помощью Skyfield

Я пытаюсь использовать Skyfield, чтобы построить расстояние в а.е. от Земли до планет солнечной системы как функцию времени. Это очень просто и даже указано на первой странице домашней страницы пакета. Однако, хотя это отлично работает для Меркурия, Венеры и Марса, это не работает для других планет. Я не знаком с файлами эфемерид JPL, но кажется, что, например, Юпитер не имеет ключевой записи в файле 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?

Спасибо !


person Fabio    schedule 19.01.2016    source источник
comment
Вы пробовали planets['jupiter barycenter']?   -  person Psytho    schedule 19.01.2016


Ответы (2)


Как говорится в ошибке, вам нужно использовать JUPITER BARYCENTER вместо jupiter.

person BlueMoon93    schedule 19.01.2016
comment
Спасибо за быстрый ответ, проблема решена. Просто из любопытства, а есть ли разница между MARS BARYCENTER и MARS в файле? или это просто псевдоним? Возвращенные значения расстояния идентичны. - person Fabio; 19.01.2016
comment
@Fabio Фактическое вычисление, табуляция и интерполяция эфемерид JPL немного сложны, но после прочтения некоторых ссылок (следующий комментарий) я думаю, что барицентр Земля-Луна (центр масс) проходит как планета в солнечном Системные расчеты, а затем относительное движение между Землей и Луной рассматривается как несколько отдельный расчет. Для Земли-Луны они также разбиты отдельно для нас, но для барицентра Юпитера (планета плюс все ее луны) в Skyfield не разбивается отдельно. Юпитер настолько велик, что разница очень мала. - person uhoh; 19.01.2016
comment
См., Например, this, this и это - person uhoh; 19.01.2016
comment
Так что случай Плутона и Харона особенно интересен - барицентр находится в пространстве между два тела. - person uhoh; 19.01.2016

Это просто дополнение, если оно полезно - принятый ответ решил проблему.

Я хотел показать, что, поскольку позиции находятся в барицентрических координатах, ['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()
person uhoh    schedule 19.01.2016
comment
Спасибо за подробное понимание! Теперь я лучше понимаю «центр тяжести» в файлах JPL. - person Fabio; 19.01.2016