3

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

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

但是,我真正需要的是能够从已知的 azimuth 计算太阳的高度角。所以我会设置相同的观察点(long/lat/elev/date(只是 yy/mm/dd,不是时间))和太阳的方位角。从这个输入中,计算太阳的高度和它在那个方位角的时间。

我曾希望我能够设置 Sun.date 和 Sun.az 并从这些值向后工作,但是唉。关于如何使用 PyEphem 解决这个问题(如果它甚至是平易近人的)有什么想法吗?

我看到的唯一其他选择是通过迭代一系列时间来“潜入”方位角,直到我进入我想要的方位角的误差范围内,但这只是粗略的。

在此先感谢,戴夫

4

2 回答 2

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()or brentq(),看看会发生什么!

于 2013-02-25T00:07:28.777 回答
0

在不知道 PyEphem 正在执行的内部计算的详细信息的情况下,我不知道将这些计算反转以给出您想要的结果是多么容易或困难。

然而,关于“偷偷摸摸”选项,您可以选择两个开始时间(例如日出和中午),其中方位角已知为所需值的任一侧(一个大于和一个小于)所需值。然后只需使用简单的“将区间减半”方法即可快速找到近似解。

于 2013-02-24T21:12:02.867 回答