Time 给定太阳的位置,计算观察者一天的时间

Time 给定太阳的位置,计算观察者一天的时间,time,sun,pyephem,Time,Sun,Pyephem,我很想知道在什么时候,障碍物会在观测者到太阳的视线上投射出阴影 因此,我想反向计算太阳相对于观察者在天空中某个特定位置的日期/时间。(特定年份中的所有事件) 使用以弗所做相反的事情非常简单;对于观察者的位置(纬度,经度)和时间,计算太阳的位置——这让我想知道为什么做相反的事情不简单 我到处寻找这个问题的解决办法,但我找不到。任何帮助都将不胜感激 多亏了这在众多数学模型中提出了一个有趣的不对称性——它们有一个自然的“前进”方向,我们可以在时间t计算出我们期望的值(如太阳高度或方位角的值),但在另一

我很想知道在什么时候,障碍物会在观测者到太阳的视线上投射出阴影

因此,我想反向计算太阳相对于观察者在天空中某个特定位置的日期/时间。(特定年份中的所有事件)

使用以弗所做相反的事情非常简单;对于观察者的位置(纬度,经度)和时间,计算太阳的位置——这让我想知道为什么做相反的事情不简单

我到处寻找这个问题的解决办法,但我找不到。任何帮助都将不胜感激


多亏了

这在众多数学模型中提出了一个有趣的不对称性——它们有一个自然的“前进”方向,我们可以在时间t计算出我们期望的值(如太阳高度或方位角的值),但在另一个方向上没有简单的方法来求解或表达公式

因此,我们使用一系列技术,如优化、寻根和曲线拟合,我们对“正向”公式进行不同的猜测,看看结果如何,调整输入,直到输出足够接近我们需要的值

如果你看一下PyEphem的内部例程,比如日出、日落和分点,你会看到使用牛顿方法迭代搜索匹配环境的例子

同样的技术可以用来确定其他情况下的时间,例如:太阳何时处于20°高度

import ephem

boston = ephem.Observer()
boston.lat = '42.37'
boston.lon = '-71.03'
boston.date = '2014/1/29 03:12:47'

sun = ephem.Sun()
sun.compute(boston)
print 'Starting altitude:', sun.alt

def f(x):
    boston.date = x
    sun.compute(boston)
    return sun.alt - ephem.degrees('20.0')

x = boston.date
print 'Searching for the correct time...'
ephem.newton(f, x, x + 0.01)
print 'At the time and date', boston.date
print 'the solar altitude is', sun.alt
此脚本的输出为:

Starting altitude: -57:02:36.3
Searching for the correct time...
At the time and date 2014/1/28 19:30:49
the solar altitude is 20:00:00.0
因此,它正确地找到了太阳高度非常非常接近20度的时刻——因为Netwon函数寻找它们分析的函数的过零点,在让Netwon函数看到它之前,我们从高度中减去20度

如果您想了解更多关于如何使用和控制迭代过程的信息,在线上有大量关于优化的资源,还有一些非常好的支持优化的SciPy例程,您可能想使用这些例程,而不是Pyphem中内置的脆弱的小
newton()
方法:


感谢您的分享-非常有用!尽管我一直在研究这个方法,但我感到困惑的是,在上面的示例代码中,如果输入除整数以外的任何角度(例如20.5),返回的sun.alt会偏移一个小数度。在这种情况下,它返回以下结果;起始高度:-57:02:36.3正在搜索正确的时间。。。在2014年1月28日19:26:27的时间和日期,太阳高度是20:30:00.0我是否犯了一个错误,也许是从deg到rad的转换?不,看起来你的代码工作得很好-度量“20:30:00”意味着20°30'00',正好是20.5,因为30分钟是半小时(60分钟)。