太阳系星历#
astropy.coordinates
可以计算出 SkyCoord
太阳系的一些主要天体。默认情况下,它使用使用 PyERFA 例程,但它也可以使用使用JPL星历(从动力学模型派生)的更精确的星历。默认的喷气推进实验室星历(DE430)提供了大约在1550到2650年之间有效的预测。该文件大小为115 MB,在您第一次使用此功能时需要下载,但之后将被缓存。对于您可能拥有的特定用例,可以按名称请求其他JPL星历(请参见下面的示例)。
备注
使用JPL星历要求 jplephem 安装程序包。这最方便的实现方式是通过 python -m pip install jplephem
,尽管您使用的任何包管理系统可能也有它。
提供两个功能; get_body()
和 get_body_barycentric()
。第一次回归 SkyCoord
中的对象 GCRS
帧,而后者返回一个 CartesianRepresentation
指物体的重心位置(即,在 ICRS
帧)。
实例#
以下是将这些函数与内置星历表一起使用的示例(即,无需下载大型星历文件):
>>> from astropy.time import Time
>>> from astropy.coordinates import solar_system_ephemeris, EarthLocation
>>> from astropy.coordinates import get_body_barycentric, get_body
>>> t = Time("2014-09-22 23:22")
>>> loc = EarthLocation.of_site('greenwich')
>>> with solar_system_ephemeris.set('builtin'):
... jup = get_body('jupiter', t, loc)
>>> jup
<SkyCoord (GCRS: obstime=2014-09-22 23:22:00.000, obsgeoloc=(3949481.69182405, -550931.91022387, 4961151.73597633) m, obsgeovel=(40.159527, 287.47873161, -0.04597922) m / s): (ra, dec, distance) in (deg, deg, AU)
(136.91116253, 17.02935396, 5.94386022)>
上面,我们用过 solar_system_ephemeris
作为上下文,它在 with
子句,并在末尾重置它。
为了获得比内置星历更精确的位置(参见 内置星历的精度 ),您可以使用 de430
上面提到的星历,或者,如果你只关心1950年到2050年之间的时间,选择 de432s
星历,它存储在一个较小的约10 MB的文件中(设置星历时将下载并缓存该文件):
>>> solar_system_ephemeris.set('de432s')
<ScienceState solar_system_ephemeris: 'de432s'>
>>> get_body('jupiter', t, loc)
<SkyCoord (GCRS: obstime=2014-09-22 23:22:00.000, obsgeoloc=(3949481.69182405, -550931.91022387, 4961151.73597633) m, obsgeovel=(40.159527, 287.47873161, -0.04597922) m / s): (ra, dec, distance) in (deg, deg, km)
(136.90234846, 17.03160654, 8.89196021e+08)>
>>> get_body('moon', t, loc)
<SkyCoord (GCRS: obstime=2014-09-22 23:22:00.000, obsgeoloc=(3949481.69182405, -550931.91022387, 4961151.73597633) m, obsgeovel=(40.159527, 287.47873161, -0.04597922) m / s): (ra, dec, distance) in (deg, deg, km)
(165.51854528, 2.32861794, 407229.55638763)>
>>> get_body_barycentric('moon', t)
<CartesianRepresentation (x, y, z) in km
(1.50107535e+08, -866789.11996916, -418963.55218495)>
对于给定星历的一次性计算,也可以将其直接传递给各种函数:
>>> get_body_barycentric('moon', t, ephemeris='de432s')
...
<CartesianRepresentation (x, y, z) in km
(1.50107535e+08, -866789.11996916, -418963.55218495)>
>>> get_body_barycentric('moon', t, ephemeris='builtin')
...
<CartesianRepresentation (x, y, z) in AU
(1.00340683, -0.00579417, -0.00280064)>
对于可以计算其位置的实体列表,请执行以下操作:
>>> solar_system_ephemeris.bodies
('sun',
'mercury',
'venus',
'earth-moon-barycenter',
'earth',
'moon',
'mars',
'jupiter',
'saturn',
'uranus',
'neptune',
'pluto')
>>> solar_system_ephemeris.set('builtin')
<ScienceState solar_system_ephemeris: 'builtin'>
>>> solar_system_ephemeris.bodies
('earth',
'sun',
'moon',
'mercury',
'venus',
'earth-moon-barycenter',
'mars',
'jupiter',
'saturn',
'uranus',
'neptune')
备注
虽然太阳包含在这些星历中,但重要的是要认识到 get_sun
始终使用内置的多项式模型(因为这不需要特殊下载)。因此,假设 get_body(time, 'sun')
和 get_sun(time)
都会给出同样的结果。
备注
在使用JPL星历时,请注意,如果您不小心理解您所处的框架,答案可能会在一定程度上发生变化,这可能会令人惊讶。例如,请参阅DE440s星历的情况,详细说明请参见 astropy PR #11608 。因此,为了保持一致性,通常最好保持在相同的星历内。
内置星历的精度#
用于计算地球以外的行星的位置和速度的算法 ERFA 作者为J.L.西蒙、P.布雷塔尼翁、J.查普雷特、M.查普兰特-图兹、G.Francou和J.Laskar(法国巴黎经度局)。从与JPL星历DE102的比较中,他们引用了下面1800-2050年的最大误差。有关更多详细信息,请参阅 PyERFA 例行公事 erfa.plan94
。对于地球,位置和速度的均方根误差分别约为4.6公里和1.4毫米/S(见 erfa.epv00
)。
行星 |
L(弧秒) |
B(弧秒) |
R(公里) |
水星 |
4 |
1 |
300 |
金星 |
5 |
1 |
800 |
EMB |
6 |
1 |
1000 |
火星 |
17 |
1 |
7700 |
木星 |
71 |
5 |
76000 |
土星 |
81 |
13 |
267000 |
天王星 |
86 |
7 |
712000 |
海王星 |
11 |
1 |
253000 |