近地点和远地点的计算减少了几分钟

时间:2019-09-10 21:33:14

标签: skyfield

我正在尝试计算近地点和远地点(或者在已知第二个物体(例如太阳和行星等)的情况下,通常是apsis)

from skyfield import api, almanac
from scipy.signal import argrelextrema
import numpy as np

e = api.load('de430t.bsp')

def apsis(year = 2019, body='moon'):
    apogees = dict()
    perigees = dict()
    planets = e
    earth, moon = planets['earth'], planets[body]

    t = ts.utc(year, 1, range(1,367)) 
    dt = t.utc_datetime()

    astrometric = earth.at(t).observe(moon)
    _, _, distance = astrometric.radec()

    #find perigees, at day precision
    localmaxes = argrelextrema(distance.km, np.less)[0]
    for i in localmaxes:
       # get minute precision
       t2 = ts.utc(dt[i].year, dt[i].month, dt[i].day-1, 0, range(2881))
       dt2 = t2.utc_datetime()  # _and_leap_second()
       astrometric2 = earth.at(t2).observe(moon)
       _, _, distance2 = astrometric2.radec()
       m = min(distance2.km)
       daindex = list(distance2.km).index(m)
       perigees[dt2[daindex]] = m

    #find apogees, at day precision
    localmaxes = argrelextrema(distance.km, np.greater)[0]
    for i in localmaxes:
        # get minute precision
        t2 = ts.utc(dt[i].year, dt[i].month, dt[i].day-1, 0, range(2881))
        dt2 = t2.utc_datetime()  
        astrometric2 = earth.at(t2).observe(moon)
        _, _, distance2 = astrometric2.radec()
        m = max(distance2.km)
        daindex = list(distance2.km).index(m)
        apogees[dt2[daindex]] = m

    return apogees, perigee

当我在2019年运行此命令时,下一个顶点将计算为2019-09-13 13:16。这与John Walker's(13:33),Fred Espenak's(13:32),Time and Date dot com(13:32)之类的表相差几分钟。

由于其他原因,例如四舍五入和截断秒数,我希望上面提到的其他时间相差一分钟,但是相差超过15分钟似乎并不常见。我已经用de431t和de421星历进行了尝试,结果相似。

这里有什么区别?我正在计算每个身体中心的距离,对吗?我在搞砸什么?

1 个答案:

答案 0 :(得分:1)

经过更多研究并将天空字段的输出与JPL的Horizo​​ns的输出进行比较,看来Skyfield的计算是正确的,至少对于JPL星历而言是正确的(不出意外)

我将上面的代码片段切换为使用HORIZONS使用的相同(大规模)de432t SPICE内核。这与“地平线”输出一致(见下文,由各种消息来源报道的远地点标出),月球开始向远处移动(观察者(地心地球)与目标物体(地心月球)之间的delta或射程速率变为负值

Ephemeris / WWW_USER Fri Sep 13 17:05:39 2019 Pasadena, USA      / Horizons    
*******************************************************************************
Target body name: Moon (301)                      {source: DE431mx}
Center body name: Earth (399)                     {source: DE431mx}
Center-site name: GEOCENTRIC
*******************************************************************************
Start time      : A.D. 2019-Sep-13 13:10:00.0000 UT      
Stop  time      : A.D. 2019-Sep-13 13:35:00.0000 UT      
Step-size       : 1 minutes
*******************************************************************************
Target pole/equ : IAU_MOON                        {East-longitude positive}
Target radii    : 1737.4 x 1737.4 x 1737.4 km     {Equator, meridian, pole}    
Center geodetic : 0.00000000,0.00000000,0.0000000 {E-lon(deg),Lat(deg),Alt(km)}
Center cylindric: 0.00000000,0.00000000,0.0000000 {E-lon(deg),Dxy(km),Dz(km)}
Center pole/equ : High-precision EOP model        {East-longitude positive}
Center radii    : 6378.1 x 6378.1 x 6356.8 km     {Equator, meridian, pole}    
Target primary  : Earth
Vis. interferer : MOON (R_eq= 1737.400) km        {source: DE431mx}
Rel. light bend : Sun, EARTH                      {source: DE431mx}
Rel. lght bnd GM: 1.3271E+11, 3.9860E+05 km^3/s^2                              
Atmos refraction: NO (AIRLESS)
RA format       : HMS
Time format     : CAL 
EOP file        : eop.190912.p191204                                           
EOP coverage    : DATA-BASED 1962-JAN-20 TO 2019-SEP-12. PREDICTS-> 2019-DEC-03
Units conversion: 1 au= 149597870.700 km, c= 299792.458 km/s, 1 day= 86400.0 s 
Table cut-offs 1: Elevation (-90.0deg=NO ),Airmass (>38.000=NO), Daylight (NO )
Table cut-offs 2: Solar elongation (  0.0,180.0=NO ),Local Hour Angle( 0.0=NO )
Table cut-offs 3: RA/DEC angular rate (     0.0=NO )                           
*******************************************************************************
 Date__(UT)__HR:MN                delta      deldot
***************************************************
$$SOE
 2019-Sep-13 13:10     0.00271650099697   0.0000340
 2019-Sep-13 13:11     0.00271650100952   0.0000286
 2019-Sep-13 13:12     0.00271650101990   0.0000232
 2019-Sep-13 13:13     0.00271650102812   0.0000178
 2019-Sep-13 13:14     0.00271650103417   0.0000124
 2019-Sep-13 13:15     0.00271650103805   0.0000070
 2019-Sep-13 13:16     0.00271650103977   0.0000016 <----- Skyfield, HORIZONS
 2019-Sep-13 13:17     0.00271650103932  -0.0000038
 2019-Sep-13 13:18     0.00271650103670  -0.0000092
 2019-Sep-13 13:19     0.00271650103191  -0.0000146
 2019-Sep-13 13:20     0.00271650102496  -0.0000200
 2019-Sep-13 13:21     0.00271650101585  -0.0000254
 2019-Sep-13 13:22     0.00271650100456  -0.0000308
 2019-Sep-13 13:23     0.00271650099112  -0.0000362
 2019-Sep-13 13:24     0.00271650097550  -0.0000416
 2019-Sep-13 13:25     0.00271650095772  -0.0000470
 2019-Sep-13 13:26     0.00271650093778  -0.0000524
 2019-Sep-13 13:27     0.00271650091566  -0.0000578
 2019-Sep-13 13:28     0.00271650089139  -0.0000632
 2019-Sep-13 13:29     0.00271650086494  -0.0000686
 2019-Sep-13 13:30     0.00271650083633  -0.0000740
 2019-Sep-13 13:31     0.00271650080556  -0.0000794
 2019-Sep-13 13:32     0.00271650077262  -0.0000848  <------ Espenak, T&D.com
 2019-Sep-13 13:33     0.00271650073751  -0.0000902 
 2019-Sep-13 13:34     0.00271650070024  -0.0000956
 2019-Sep-13 13:35     0.00271650066081  -0.0001010

$$EOE

再看一下Espenak的页面,他的计算是基于让·梅厄斯(Jean Meeus)的《天文算法》一书的(对于使用此书的人来说必不可少)。那本书中的月球星历表来自让·夏普朗特(Jean Chapront)的ELP2000 / 82。尽管已将其安装到DE430中(以及其他),

果然,当今天使用ELP2000模型查找最大月球距离时,您将获得2019-09-13 13:34。参见下面的代码。

Meeus的公式基于1982年版的Ephemeride Lunaire Parisienne,下面的源代码利用了Chapront的2002年更新,但是几乎与其他源代码一样。

所以我认为我的答案是,他们是不同的答案,因为他们使用的是不同的模型。 Skyfield正在利用由JPL开发星历表表示为数值积分的模型,而ELP是一种更具分析性的方法。

最后,我意识到这是一个挑剔的选择,我只是想更好地了解我所使用的工具。但这引出了一个问题,哪种方法更准确?

根据我的阅读,DE430及其同位素已经适合观测数据,即月球激光测距(LLR)测量。如果只是出于LLR的考虑,我想我会坚持使用Skyfield来计算月球距离。

from elp_mpp02 import mpp02 as mpp
import julian
import pytz
import datetime

def main():
    mpp.dataDir = 'ELPmpp02'
    mode = 1  # Historical mode
    jd = 2451545
    data = dict()
    maxdist = 0
    apogee = None
    for x in range(10,41):
        dt = datetime.datetime(2019, 9, 13, 13, x, tzinfo=pytz.timezone("UTC"))
        jd = julian.to_jd(dt, fmt='jd')
        lon, lat, dist = mpp.compute_lbr(jd, mode)
        if dist > maxdist:
            maxdist = dist
            apogee = dt
    print(f"{maxdist:.2} {apogee}")