5

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」を「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 の Web サイト (ここ) でエフェメリス ファイルの説明を読みましたが、完全には理解できませんでした。

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']下の 2 つのプロット (以下) は、スカイフィールドで呼ばれる地球と月の重心に対する地球と月の動きを示しています。

地球、月、重心のさまざまな動き

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 に答える