我的问题是 PyEphem 为至日和春分以及太阳几何的日期提供准确结果的时间跨度是多少。
到目前为止,我在 GitHub https://github.com/brandon-rhodes/pyephem/issues/61上的这篇内容非常丰富的帖子中发现了 BC 9998-03-20 到 AD 9999-12-31 的限制, 并总体表明结果在当前任一地点移动超过 +/- 20,000 年时变得不稳定。
我想澄清这一点,因为我试图在更长的时间内获得太阳的位置 - 通常可以追溯到 10,000 年 BP - 为了计算在给定的太阳高度和方位角的入射太阳辐射地点。PyEphem 似乎为 Berger, 1978 (J. Atmosph. Sc., 35: 2362-2367) 提供的功能提供了一个很好的替代方案。对我来说,PyEphem 相对于这些算法的一个重要优势是它还可以跟踪时间,而在上述算法中地球轨道通常固定在某个特定时刻(例如,3 月 21 日的春分)。
通常,使用 Berger 和其他人的算法在地球轨道上的变化是在末次冰期的规模上评估的(高达 126,000 年 BP)。在该范围内评估 PyEphem 时,当日期远在今天之前,我发现了一些关于至日日期的奇怪行为:
import ephem
date= ephem.date((-59000,1,1))
orbitPoints= ['vernal_equinox_start','summer_solstice',\
'autumnal_equinox','winter_solstice','vernal_equinox_end']
dates= {}
dates['vernal_equinox_start']= ephem.next_vernal_equinox(date)
dates['summer_solstice']= ephem.next_summer_solstice(dates['vernal_equinox_start'])
dates['autumnal_equinox']= ephem.next_autumnal_equinox(dates['vernal_equinox_start'])
dates['winter_solstice']= ephem.next_winter_solstice(dates['vernal_equinox_start'])
dates['vernal_equinox_end']= ephem.next_vernal_equinox(dates['winter_solstice'])
for orbitPoint in orbitPoints:
date= dates[orbitPoint]
distance= body_distance(sun, date)
hlon, hlat= body_hpos(sun, date)
print '%-20s %30s %8.4f %12s %12s' %\
(orbitPoint, date, distance, hlon, hlat)
print 'days between between equinoxes: %.1f, year length (vernal equinox): %.1f' %\
(dates['autumnal_equinox']-dates['vernal_equinox_start'],\
dates['vernal_equinox_end']-dates['vernal_equinox_start'])
给出:
vernal_equinox_start -59001/12/20 01:33:21 1.6255 180:01:53.6 0:00:01.7
summer_solstice -59000/2/19 04:16:18 1.3380 180:03:56.7 0:00:09.6
autumnal_equinox -59000/7/1 09:20:58 0.3704 0:00:42.2 0:00:09.6
winter_solstice -59000/10/9 07:35:39 1.1335 179:56:59.4 -0:00:12.4
vernal_equinox_end -58999/10/10 07:40:47 1.1348 180:00:52.7 0:00:16.2
days between between equinoxes: 193.3, year length (vernal equinox): 659.3
当我将日期设置为date= ephem.date((-25000,1,1))
.
如果 PyEphem 确实在我感兴趣的时期(10,000 年 BP)内给出了准确的结果,那将符合我的目的。但是,我想澄清这一点,并愿意提出扩大这个范围的建议,即使它只是为了验证。我将 SkyField 视为替代方案,但它似乎没有提供扩展范围。
对 PyEphem 有效性范围的清晰描述以及任何建议将不胜感激。