PyEphem:我能从方位角计算太阳高度吗

3 投票
2 回答
1875 浏览
提问于 2025-04-17 16:58

我正在使用PyEphem这个工具来计算太阳在天空中不同时间的位置。

我有一个观察点(恰好是在巨石阵),可以用PyEphem来计算日出、日落,以及太阳在一天中任何时刻的高度角和方位角(从北开始的度数)。这太棒了,没问题。

不过,我真正需要的是能够根据已知的方位角计算太阳的高度角。也就是说,我会设置同样的观察点(经度/纬度/海拔/日期(只要年/月/日,不需要具体时间))和太阳的方位角。然后根据这些输入,计算出太阳的高度角以及它在这个方位角时的时间。

我原本希望能直接设置Sun.date和Sun.az,然后从这些值反推,但可惜并不行。你有什么想法可以用PyEphem来解决这个问题吗?(或者说这个问题是否能解决)

我看到的唯一其他选择是通过不断尝试不同的时间来“接近”这个方位角,直到我得到一个接近我想要的方位角的结果,但这样做实在太麻烦了。

提前谢谢你,Dave

2 个回答

0

我不知道PyEphem内部计算的具体细节,所以我不太清楚要反向计算出你想要的结果有多简单或多难。

不过关于“逐步接近”的方法,你可以选择两个起始时间(比如日出和正午),在这两个时间点的方位角是已知的,一个大于你想要的值,一个小于。然后你可以用一种简单的“二分法”来快速找到一个大致的解决方案。

2

天文学软件通过使用喷气推进实验室(JPL)对地球和太阳位置的预测,来计算太阳的位置。JPL用一系列多项式来表示这些预测,这些多项式覆盖了特定的日期范围。当你问“太阳什么时候会在方位角z?”时,其实是在问三个不同的多项式(分别代表太阳、围绕太阳转动的地月重心和围绕重心转动的地球)在不同的变化速率下,何时会使这两个位置之间的差异恰好达到一个特定的角度。

结果发现,这个问题属于“复杂”的数学问题,或者说专业人士称之为“没有封闭解的问题”。我喜欢你用的“复杂”这个词,因为它很好地表达了我们大多数人在发现很多事情需要通过反复尝试而不是直接给出答案时的感受。

幸运的是,科学中有很多问题都是“复杂”的,这意味着我们有一些标准的方法来询问“这个复杂的函数什么时候会达到确切的值z?”如果你能安装并试用SciPy,这是一个越来越受欢迎的Python科学库,你会发现它有一整套程序可以帮助你找到解决方案,每个程序都使用不同的策略。其他回答者已经提到了一种策略——每次尝试时将搜索范围减半,但这通常是最慢的(尽管在某些极端情况下是最安全的)方法;这里还有一些其他的方法:

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

你可以创建一个小函数,返回在某个时间t时,太阳的方位角与想要的方位角之间的“差距”,当方位角完全正确时,这个函数最终会返回零,比如:

def f(t):
    ...        
    return desired_az - sun.az

然后可以尝试使用SciPy页面上的某个“根查找标量函数”。bisect()函数就像其他回答者建议的那样,会不断将搜索范围减半来缩小范围。但我猜你会发现牛顿法要远不那么“复杂”,而且速度更快——试试newton()brentq(),看看会发生什么!

撰写回答