23

我喜欢跟踪日出和日落时间。在过去的几年里,我一直在用一个用我最喜欢的编程语言的流行库编写的小程序来做这件事。在过去的两个月里,我比平时更经常地跟踪这些时间,我碰巧注意到,在春分那天,日出时间比前一天增加了 8 分钟!我知道这是不可能的,并与NOAA进行比较,发现我的起落时间已经中断了几天,实际上一年中的大部分时间似乎都偏离了大约一分钟。

在这一点上,我想自己实现计算。有哪些算法或公式可用于进行此计算?

4

8 回答 8

10

您可以考虑阅读维基百科关于日出方程式的文章。开头段落给出了等式:

在哪里:

  • ω o是日出(取负值时)或日落(取正值时)时的小时角,单位为度 (°)
  • φ 是地球上观察者的纬度,以度为单位
  • δ 是以度为单位的太阳偏角
于 2009-04-01T04:52:21.797 回答
7

如果你想匹配 NOAA,你必须参考 Jean Meeus 的天文算法(主要是第 15 章)。而且很复杂!马丁贝克特是正确的,你必须定义日落。通常这是太阳上肢的明显上升或落下,这使您的“标准”海拔高度为 -5/6 度(不是零)。而且你不能用 NOAA 的精度直接计算日出或日落。您必须为所讨论的那一天创建一组明显的赤经和赤纬控制方程,然后随着时间的推移对表观赤经和赤纬进行插值,以找到标准高度的准确上升和落下时间。

希望这可以帮助。当我遇到同样的事情时,我花了大约一个月的时间来消化AA并重写我们所有的太阳能代码,但我仍然花了一年多的时间来整理我的代码崩溃的一些极端情况。所以需要一些时间来弄清楚。我不知道该算法的任何公共代码示例,目前也没有任何可分享的内容,但如果可以的话,我很乐意帮助您解决一些令人头疼的问题。

于 2011-03-08T22:00:52.980 回答
4

对于 5 分钟范围内的准确性,您必须考虑“哪个”日落
你想要太阳底部接触地平线的时间还是太阳顶部经过地平线以下的时间?

太阳穿过地平线需要2分钟。
在 1 分钟以下,您还需要考虑大气折射。

于 2009-06-01T18:48:34.937 回答
4

日出/日落的定义可能会有所不同。例如,在ephem“上升和下降定义为身体上肢接触地平线的时刻(即身体的 alt 加半径等于 0 时)” [PyEphem 快速参考]

#!/usr/bin/env python
import datetime
import ephem # to install, run `pip install pyephem`

o = ephem.Observer()
o.lat, o.long, o.date = '34:3', '-118:15', datetime.datetime.utcnow()
sun = ephem.Sun(o)
print "Los Angeles"
print "sunrise:", o.next_rising(sun), "UTC"
print "sunset:",o.next_setting(sun), "UTC"

输出

Los Angeles, CA
sunrise: 2010/3/30 13:42:43 UTC
sunset: 2010/3/30 02:11:50 UTC

如果它是开源库,那么您可以修复它,而不是创建一个带有新错误的新库。

于 2010-03-29T21:34:22.043 回答
3

看看这本书:
Peter Duffett-Smith 的“用计算器进行实用天文学(平装本)”。
它很旧,但仍在印刷中... 链接

于 2009-06-01T18:36:39.063 回答
2

在 Ruby 中,我为时间等式写了这个。

include Math

# degrees to radians = PI/180
to_r = PI/180.0

#radians to degrees = 180/PI
to_d = 180.0/PI

puts "Day, Declination, EofT"

# test a celestial year worth of values.
for jday in 1..366

  et = -7.633 * sin(jday * (2 * PI)/365.24) + 9.65 * sin((jday - 78) * 180/92 * to_r)
  a_sin = sin(23.433 * to_r) * sin((2 * PI/366) * (jday - 81))
  declination = asin(a_sin) * to_d
  puts "#{jday}, #{declination}, #{et}"

end

那么对于上面的等式:

# center disk and refraction factor have been considered.
cos_omega = sin(-0.83 * to_r) - tan(latitude * to_r) * tan(declination * to_r)
semi_diurnal_arc = acos(cos_omega)

在http://www.analemma.com/上有一个专门的网站

  • 这些计算的关键是好的库,比如上面的 python 库。
  • 还使用日期和时间类。我会在 ruby​​forge 上寻找类似 ehem 的东西。
于 2011-02-23T19:25:38.123 回答
0

我确实在这个 NOAA 页面上的技术定义和计算详细信息标题下看到了一些有趣的东西,但我相信您已经阅读过。

SO问题“给定一天中的太阳位置和纬度/经度”的答案实际上可能就是您所需要的。

作为旁注(它不直接回答您的问题),您是否有理由不能提取 NOAA 数据并将其用作查找表而不是计算它?如今,存储往往相对便宜。

于 2009-04-01T04:50:18.060 回答
0

您可能想查看有关计算太阳位置的较早条目。 具体来说,我指出的 Solpos 程序支持日出/日落。

于 2009-04-01T04:55:48.903 回答