2

执行此代码片段:

import ephem
oma=ephem.Observer()
oma.lat='50.7975189'
oma.lon='4.3579155'
oma.elevation=114.43
oma.epoch=ephem.now()
sun=ephem.Sun(oma)
print "object transit time: ",sun.transit_time
print "observer next transit time: ", oma.next_transit(sun)

这给出了以下输出:

object transit time:  2012/9/5 11:41:03
observer next transit time:  2012/9/5 11:41:06

因此,太阳物体的时间与为太阳观察者计算的时间之间存在 3 秒的差异。两者哪个最靠谱?如果我们将这些值与本地计算值进行比较,则观察者的下一个传输时间是最接近的。

如果我们对火星做同样的计算:

import ephem
oma=ephem.Observer()
oma.lat='50.7975189'
oma.lon='4.3579155'
oma.elevation=114.43
oma.epoch=ephem.now()
mars=ephem.Mars(oma)
print "object transit time: ",mars.transit_time
print "observer next transit time: ", oma.next_transit(mars)

这给出了以下输出:

object transit time:  2012/9/5 15:05:32
observer next transit time:  2012/9/5 15:05:32

所以没有区别。

此致,

大理石

4

2 回答 2

1

要确定哪个函数最准确,只需将它们给您的两次输入到观察者的compute()函数中,然后查看当方位角正好为 180° 时哪些着陆点最接近实际的凌日时刻:

import ephem
oma = ephem.Observer()
oma.lat, oma.lon = '50.7975189', '4.3579155'
oma.elevation = 114.43
sun = ephem.Sun()
for t in ('2012/9/5 11:41:03',
          '2012/9/5 11:41:06'):
    oma.date = t
    sun.compute(oma)
    print 'azimuth at', t, 'was', sun.az

此脚本的输出表明,11:41:06较新next_transit()函数的时间给出了更准确的结果:

azimuth at 2012/9/5 11:41:03 was 179:58:45.4
azimuth at 2012/9/5 11:41:06 was 179:59:49.5

.transit_time属性的较低准确性是当前 PyEphem 文档建议始终使用next_transit()它适用的所有运输计算的原因。(这意味着除了地球卫星之外的所有东西,.transit_time无论如何都会切换到不同的算法。)

事实上,当前的文档甚至没有提到请求.next_transit非地球卫星甚至是可能的,并且该属性仅用于古代向后兼容。

这两个函数的工作方式相同:通过猜测时间,检查当时的方位角,然后一遍又一遍地完善他们的猜测,直到他们喜欢答案。更新的next_transit()函数在这方面做得更好,所以你应该使用它。

这两个函数给你相同的火星答案的原因只是巧合——如果你在 9 月 5 日以外的日期对火星运行函数,你会看到不同的答案。这完全取决于函数进行一系列猜测的顺序,以及最后的猜测是否碰巧靠近或相距甚远。而且,我敢打赌,即使在 9 月 5 日,他们的答案也没有真正匹配——他们只匹配到第二个,这就是所有显示的内容!如果您要通过打印每个答案的 来显示这两个答案的全精度朱利安日期repr(float(…)),那么您无疑会发现小数点以下的分歧远远超出了一秒的分辨率能够显示给您的程度。

这是否涵盖了您所有的担忧?

于 2012-09-08T00:10:12.940 回答
0

这是因为transit_time 不适用于观察者。

我改进并更改了您的代码:

from ephem import Observer, Sun, now
oma=Observer()
oma.lat='50.7975189'
oma.lon='40.3579155'
oma.elevation=114.43
oma.epoch=now()
sun=Sun(oma)
print "object transit time: ",sun.transit_time
print "observer next transit time: ", oma.next_transit(sun)

这给出了:

object transit time:  2012/9/6 09:16:48
observer next transit time:  2012/9/7 09:16:27

现在,为什么将 lon 从 4 更改为 40 会有一天的差异(或 -11 秒)?那些 lon 和 lat 以 ehem 表示的单位是什么?我想这不是这个问题的一部分。

于 2012-09-06T09:28:00.537 回答