Несоответствие азимута / высоты между PyEphem и Skyfield

Я не могу понять, почему я получаю другой азимут / высоту для расчета кометы между PyEphem и Skyfield, но совпадаю по прямому восхождению и склонению.

Пример кода:

#!/usr/bin/env python3


# External verification:
# https://in-the-sky.org/data/object.php?id=0088P
# https://theskylive.com/88p-info
# https://heavens-above.com/comet.aspx?cid=88P
# https://www.calsky.com/cs.cgi/Comets/3?


import datetime, ephem, io, skyfield.api, skyfield.constants, skyfield.data.mpc


now = datetime.datetime.strptime( "2020-07-22", "%Y-%m-%d" )
latitude = -33
longitude = 151

cometName = "88P/Howell"

# https://minorplanetcenter.net/iau/Ephemerides/Comets/Soft03Cmt.txt
cometDataPyEphem = "88P/Howell,e,4.3838,56.6855,235.9159,3.105737,0.1800765,0.56433120,347.8225,07/21.0/2020,2000,g 11.0,6.0"

# https://minorplanetcenter.net/iau/Ephemerides/Comets/Soft00Cmt.txt
cometDataSkyfield = "0088P         2020 09 26.6241  1.353073  0.564331  235.9159   56.6855    4.3838  20200721  11.0  6.0  88P/Howell                                               MPEC 2019-JE2"


print( "PyEphem:", ephem.__version__ )
print( "Skyfield:", skyfield.__version__ )


# PyEphem
observer = ephem.Observer()
observer.date = ephem.Date( now )
observer.lat = latitude
observer.lon = longitude

body = ephem.readdb( cometDataPyEphem )
body.compute( observer )

print( "PyEphem comet", cometName,
       "\n\tLat:", observer.lat,
       "\n\tLon:", observer.lon,
       "\n\tAlt:", body.alt,
       "\n\tRA:", body.ra,
       "\n\tDec:", body.dec )


# Skyfield
timeScale = skyfield.api.load.timescale( builtin = True )
topos = skyfield.api.Topos( latitude_degrees = latitude, longitude_degrees = longitude )
ephemeris = skyfield.api.load( "de421.bsp" )

with io.BytesIO( cometDataSkyfield.encode() ) as f:
    dataframe = skyfield.data.mpc.load_comets_dataframe( f ).set_index( "designation", drop = False )

sun = ephemeris[ "sun" ]
earth = ephemeris[ "earth" ]
body = sun + skyfield.data.mpc.comet_orbit( dataframe.loc[ cometName ], timeScale, skyfield.constants.GM_SUN_Pitjeva_2005_km3_s2 )

t = timeScale.utc( now.year, now.month, now.day, now.hour, now.minute, now.second )
alt, az, bodyDistanceToEarth = ( earth + topos ).at( t ).observe( body ).apparent().altaz()
ra, dec, bodyDistanceToEarth = ( earth + topos ).at( t ).observe( body ).radec()

print( "Skyfield comet", cometName,
       "\n\tAz:", az, 
       "\n\tAlt:", alt, 
       "\n\tRA:", ra, 
       "\n\tDec:", dec )

Соответствие RA / Dec между PyEphem и Skfield, а также с несколькими веб-сайтами (см. Раздел комментариев вверху). Хотя значения Skyfield для Az / Alt несколько близки к значениям, указанным в Heavens Above, Я не могу определить, почему расхождение между PyEphem и Skyfield для Az / Alt.

РЕДАКТИРОВАТЬ: измените сценарий, чтобы распечатать широту / долготу и образцы (правильные) результаты:

PyEphem: 3.7.6.0
Skyfield: 1.24
PyEphem comet 88P/Howell 
    Lat: -33:00:00.0 
    Lon: 151:00:00.0 
    Az: 109:52:54.6 
    Alt: -11:19:11.4 
    RA: 13:27:08.32 
    Dec: -9:56:54.6 
Skyfield comet 88P/Howell 
    Lat: -33deg 00' 00.0" 
    Lon: 151deg 00' 00.0" 
    Az: 109deg 53' 03.4" 
    Alt: -11deg 19' 23.4" 
    RA: 13h 26m 04.51s 
    Dec: -09deg 50' 37.9" 

person Bernmeister    schedule 22.07.2020    source источник
comment
Не могли бы вы включить вывод программы в свой вопрос? Это поможет людям понять размер несоответствия, даже если у них не установлено программное обеспечение, позволяющее запускать код самостоятельно.   -  person Brandon Rhodes    schedule 22.07.2020


Ответы (1)


Если вы попытаетесь распечатать местоположение наблюдателя PyEphem:

print(observer.lat)
print(observer.lon)

вы обнаружите, что координаты вашего наблюдателя отличаются от ожидаемых:

-1890:45:38.6
8651:39:45.7

Это потому, что PyEphem интерпретирует углы с плавающей запятой как радианы, именно так интерпретируются ваши числа -33 и 151. Чтобы PyEphem интерпретировал их как градусы, вместо этого отправьте строки:

observer.lat = str(latitude)
observer.lon = str(longitude)

В этом случае сценарий должен показать очень близкое соответствие между двумя библиотеками.

Теперь я считаю ошибкой попытки PyEphem сделать так, чтобы переключение между градусами и радианами было настолько «удобным», но это не может быть исправлено без нарушения всех существующих скриптов PyEphem. Поэтому я написал Skyfield, который никогда не принимает странных решений на основе типа и всегда пытается пометить значения degrees или radians, чтобы программисту было ясно, какие единицы ожидаются.

person Brandon Rhodes    schedule 22.07.2020
comment
Спасибо, Брэндон; должен был знать об этом, но был зациклен на просмотре Az / Alt! Одна вещь, которая не имеет смысла: несмотря на то, что широта и долгота так не работают, почему RA / Dec совпадает как для PyEphem, так и для Skyfield? - person Bernmeister; 23.07.2020
comment
Потому что комета находится в одном и том же месте на небе, на фоне одних и тех же звезд и созвездий для всех на Земле. - person Brandon Rhodes; 23.07.2020