我很想知道什么时候从观察者到太阳的视线上的障碍物会投射阴影。
所以我想反向计算太阳相对于观察者在天空中特定位置的日期/时间。(特定年份的所有事件)。
使用 PyEphem 做相反的事情非常简单;对于观察者的位置(纬度,经度)和时间计算太阳的位置 - 这让我想知道为什么做相反的事情并不简单?
我一直在寻找解决此问题的方法,但找不到。任何帮助将不胜感激。
谢谢
这在广泛的数学模型中带来了一个有趣的不对称性——它们有一个自然的“向前”方向,我们可以在时间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 例程,您可能希望使用这些例程来代替newton()
上面使用的脆弱的小方法PyEphem 内置: