【问题标题】:Difference in transit time for the Sun太阳传播时间的差异
【发布时间】:2012-09-05 08:15:02
【问题描述】:

执行此代码片段:

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

所以没有区别。

最好的问候,

大理石

【问题讨论】:

    标签: python sun pyephem


    【解决方案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
    

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

    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() 函数在这方面做得更好,所以你应该使用它。

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

    这是否涵盖了您的所有顾虑?

    【讨论】:

      【解决方案2】:

      这是因为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 表示的单位是什么?我想这不是这个问题的一部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        相关资源
        最近更新 更多