【问题标题】:Earth to Jupiter distance with Skyfield地球到木星的距离与 Skyfield
【发布时间】:2016-04-24 18:10:20
【问题描述】:

我正在尝试使用 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 网站 (here) 上阅读了星历文件的描述,但不确定我是否完全理解。

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

谢谢!

【问题讨论】:

  • 你试过planets['jupiter barycenter']吗?

标签: python astronomy skyfield


【解决方案1】:

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

我想表明,由于位置处于重心坐标,['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()

【讨论】:

  • 感谢您提供详细的见解!我现在更好地理解了 JPL 文件中的“重心”。
【解决方案2】:

正如错误所说,您需要使用JUPITER BARYCENTER 而不是jupiter

【讨论】:

  • 感谢您的快速回答,它解决了问题。只是出于好奇,文件中的 MARS BARYCENTER 和 MARS 之间有区别吗?或者它只是一个别名?返回的距离值是相同的。
  • @Fabio JPL星历表的实际计算、制表和插值有点复杂,但看了一些链接(下一条评论)后,我认为地球-月球重心(质心)在太阳系计算中被视为“行星”,然后地球和月球之间的相对运动被视为一个有点独立的计算。对于地球-月亮,它们也为我们单独分解,但对于木星重心(行星加上它的所有卫星),它并没有在 Skyfield 单独分解。木星那么大,差别很小。
  • 参见例如thisthisthis
  • 所以冥王星和卡戎的情况特别有趣——重心在空间between这两个天体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多