给定Sun的位置,计算Observer的时间

时间:2014-01-28 22:05:06

标签: time sun pyephem

我很想知道从观察者到太阳的视线上的障碍物会在什么时间投下阴影。

所以我想回来计算太阳相对于观察者在天空中特定位置的日期/时间。 (特定年份的所有事件)。

使用PyEphem非常简单地做相反的事情;对于一个观察者位置(纬度,长度)和时间计算太阳的位置 - 这让我想知道为什么反向不简单呢?

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

由于

1 个答案:

答案 0 :(得分:0)

这在各种各样的数学模型中都会产生一种有趣的不对称性 - 它们具有一个自然的“前向”方向,我们可以在时间 t 计算出我们期望的价值(如太阳的高度或方位角的值,但没有简单的方法来解决或表达另一个方向的公式。

因此,我们使用一系列技术,如优化,根寻找和曲线拟合,我们在“前向”公式中抛出不同的猜测并查看结果,调整输入直到输出足够接近值我们需要。

如果您在日常,日落和昼夜平分点等日常事件中查看PyEphem的内部情况,您将看到使用Newton方法的迭代搜索匹配情况的示例。

可以使用相同的技术来确定其他情况的时间,例如:太阳在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中:

http://docs.scipy.org/doc/scipy/reference/optimize.html