pyephem、libnova、stellarium和JPL Horizons在月球赤经/赤纬上产生分歧?

10
< p>小修改:我之前说JPL的Horizons库不是开源的,但实际上它是开源的,并且可以在这里找到:http://naif.jpl.nasa.gov/naif/tutorials.html

在2013年1月1日00:00:00 UTC,位于0度北纬,0度东经,海平面高度的位置,月球的J2000历元赤经和赤纬是多少?

不幸的是,不同的库给出稍微不同的答案。总结结果(首先是赤经)转换为度数:

Stellarium: 141.9408333000, 9.8899166666 [precision: .0004166640, .0000277777] 
Pyephem: 142.1278749990,  9.8274722221 [precision .0000416655, .0000277777] 
Libnova: 141.320712606865, 9.76909442356909 [precision unknown] 
Horizons: 141.9455833320, 9.8878888888 [precision: .0000416655, .0000277777] 

我的问题是:为什么?注:

  • 我知道这些差异很小,但是:

    • 我使用pyephem和libnova来计算太阳/月亮的升起/落下时间,在高纬度地区(如午夜太阳)位置非常敏感。

    • 我可以理解JPL的Horizons库不开源,但其他三个库是应该的。难道没有人想把这些库中的差异合并起来吗?这是我主要的抱怨。stellarium/pyephem/libnova库的作者在如何进行这些计算方面有根本性的差异,还是他们只需要合并他们的代码?

  • 我也知道可能有其他原因导致计算结果不同,并且希望得到任何有助于纠正这些可能错误的帮助:

    • Pyephem和Libnova可能使用的是日期时代而不是J2000时代

    • 月球足够接近,观察者位置可能会影响其赤经/赤纬(视差效应)

    • 我正在使用Perl的Astro::Nova和Python的pyephem,而不是这些库的原始C实现。然而,如果这些差异是由于使用Perl/Python引起的,那在我看来就很重要。

  • 我的代码(带原始结果):

    • 首先是Perl和Astro::Nova:
#!/bin/perl
# RA/DEC of moon at 0N 0E at 0000 UTC 01 Jan 2013 use Astro::Nova; # 1356998400 == 01 Jan 2013 0000 UTC $jd = Astro::Nova::get_julian_from_timet(1356998400); $coords = Astro::Nova::get_lunar_equ_coords($jd); print join(",",($coords->get_ra(), $coords->get_dec())),"\n";
RESULT: 141.320712606865,9.76909442356909
- Second, Python and pyephem:
#!/usr/local/bin/python 

# 计算2013年1月1日00:00:00 UTC时,位于北纬0度,东经0度的月亮的赤经和赤纬 
import ephem; e = ephem.Observer(); e.date = '2013/01/01 00:00:00'; 
moon = ephem.Moon(); moon.compute(e); print moon.ra, moon.dec 

RESULT: 9:28:30.69 9:49:38.9
- The stellarium result (snapshot): 

在此输入图片描述

- The JPL Horizons result (snapshot): 

这里输入图片描述

[JPL Horizons需要POST数据(假装需要),所以我不能发布URL]。

  • 我没有将它们链接起来(懒),但我相信在stackoverflow上有许多未回答的问题实际上可以归结为这个问题(天文精度库的不一致性),包括我自己的一些问题。

  • 我正在进行这方面的尝试:https://github.com/barrycarter/bcapps/tree/master/ASTRO

1个回答

9
我不确定Stellarium在做什么,但我认为其他三个我是知道的。你说得对,只有Horizons在这种表面上的、局部特定的观测中使用J2000而不是日期时代。你可以通过单击“Table Settings”旁边的“change”并从“1.天文学赤经和赤纬”切换到“2. 表观赤经和赤纬”,使其与PyEphem达成接近一致。
Libnova的区别有点棘手,但我的猜测是Libnova使用UT而不是星历时间,所以要使PyEphem给出相同的答案,你需要将一个时间转换为另一个时间。
import ephem
moon, e = ephem.Moon(), ephem.Observer()
e.date = '2013/01/01 00:00:00'
e.date -= ephem.delta_t() * ephem.second
moon.compute(e)
print moon.a_ra / ephem.degree, moon.a_dec / ephem.degree

这将输出:
141.320681918 9.77023197401

这至少比以前更接近了。请注意,如果您想让PyEphem代码忽略折射并像您要求Horizons那样操作,您可能也希望在其中执行此操作;尽管对于特定的观察,我没有看到它有任何区别:

e.pressure = 0

任何残余差异很可能(但不一定;现在我可能没有想到其他误差源)是由于不同的程序使用不同的公式来预测星球的位置。PyEphem使用旧但广泛流行的VSOP87。Horizons使用更近期且更精确的DE405和DE406,如其输出所述。我不知道其他产品使用什么太阳系模型。


太棒了,谢谢!我还没有检查你说的所有内容,但很快就会! - user354134

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接