太阳系星历#

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