【问题标题】:How can I compute sunrise/sunset times? [closed]如何计算日出/日落时间? [关闭]
【发布时间】:2010-10-16 18:54:17
【问题描述】:

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

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

【问题讨论】:

  • 坦率地说,杰森,我不确定我是否属于这里。我很讨厌发现我一年前提出的问题被黑客入侵并被拉到其他网站上。这是一个编程问题,不是吗?
  • 如果他们被“黑掉”或被拉到其他网站上,这是有原因的。你会去银行问出纳员的汽油价格是多少?我只是不相信这是一个编程问题,我仍然不是。没有提到与编程有关的任何事情,只是算法和计算。有一个site for that。您还将您的问题标记为“天文学”。还有一个site for that。这并不意味着您的问题是错误的或无效的,只是它在错误的地点。
  • 要获得 NASA 级别的精度,请使用 CSPICE 库:naif.jpl.nasa.gov/naif/tutorials.html 如果您在 astronomy.stackexchange.com 上重新提出此问题,我可以给您一个更完整的答案(我不想回答一个封闭的问题)。
  • 嘿,我知道我迟到了,但我已经在 NOAA 网站上编写了一个 MATLAB 函数来计算日出和日落时间。关注this link
  • 您可能需要考虑 skyfield python 库。使用示例:astronomy.stackexchange.com/a/30141

标签: time astronomy


【解决方案1】:

您可以考虑阅读维基百科在sunrise equations 上的文章。开头段落给出了等式:

地点:

  • ωohour angle 在日出(取负值时)或日落(取正值时)的度数 (°)
  • φ 是地球上观察者的纬度,以度为单位
  • δ 是太阳declination 度数

【讨论】:

  • 如果 OP 担心 1 分钟的差异,您必须比球形地球近似值做得更好
【解决方案2】:

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

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

【讨论】:

  • 如何使用 NOAA 自己的算法 (srrb.noaa.gov/highlights/sunrise/program.txt)。 srrb.noaa.gov/highlights/sunrise/calcdetails.html 中描述的详细信息
  • @Pat NOAA 在此处发布的算法计算给定时间的太阳位置。这个问题是关于计算日出和日落时间,这是解决给定位置的时间。这些问题是相关的,但不是一回事!
  • @mattexx 我不确定 javascript 中的所有内容,但我知道它为他们的日出/设置计算器 (srrb.noaa.gov/highlights/sunrise/sunrise.html) 提供动力,它根据位置告诉日出/设置的时间。据我了解,这正是 OP 想要做的。
  • @Pat 是的,他们的工具确实可以计算日出和日落,但据我所知,NOAA 并未公开这部分代码。如果是的话,我很想看看!顺便说一句,我有一个计算日出和日落的本地 ruby​​gem。我正在努力发布它(试图了解 ruby​​forge 发布过程)。如果您真的有兴趣查看某些代码,我可以将其发送给您,或者在我将其发布后将其指向已发布的链接。
  • @matexx 代码在srrb.noaa.gov/highlights/sunrise/sunrise.html 上。这只是 javascript,所以view source 会告诉你一切。
【解决方案3】:

对于 5 分钟范围内的准确度,您必须考虑 'which' sunset
你想要太阳底部接触地平线的时间还是太阳顶部经过地平线以下的时间?

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

【讨论】:

【解决方案4】:

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

#!/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

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

【讨论】:

  • "如果它是开源库,那么您可以修复它而不是创建一个带有新错误的新库。"
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    我在 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 的东西。

    【讨论】:

    【解决方案7】:

    You might want to look at an earlier entry on calculating the position of the sun. 具体来说,我指的 Solpos 程序支持日出/日落。

    【讨论】:

      【解决方案8】:

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

      SO 问题“Position of the sun given time of day, and lat/long”的答案和上面的答案实际上可能就是您所需要的。

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

      【讨论】:

      • 我喜欢查找表方法,但我想知道如何在代码中实现它,此时我想知道我正在使用的数据背后的算法是什么,因为我是使用结果很不靠谱。
      • 此外,我还在尝试用算法替换昼夜平分点/至日的查找表。 :)
      • 如果纬度和经度是任意的,我认为查找表不会起作用。再分点,不妨看看:astronomy.stackexchange.com/questions/13008/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多