我正在使用PyEphem在不同时间计算太阳在天空中的位置。
我有一个观察点(碰巧在巨石阵)并且可以使用PyEphem来计算一天中任何时刻太阳的日出,日落以及高度角和方位角(从N开始的度数)。太棒了,没问题。
然而,我真正需要的是能够从已知方位角计算太阳的高度角。所以我会设置相同的观察点(长/纬度/升/日(只是yy / mm / dd,而不是时间))和太阳的方位角。从这个输入中,计算太阳的高度和它在该方位角的时间。
我原本希望能够设置Sun.date和Sun.az并从这些值中倒退,但唉。关于如何使用PyEphem来解决这个问题的想法(如果它甚至可以接近)?
我看到的另一个选择是通过迭代一段时间来“偷偷摸摸”方位角,直到我进入我想要的方位角的误差范围内,但这只是粗略的。
提前感谢,戴夫答案 0 :(得分: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()
,看看会发生什么!
答案 1 :(得分:0)
在不知道PyEphem正在进行的内部计算的细节的情况下,我不知道将这些计算反转以获得您想要的结果是多么容易或困难。
关于“偷偷摸摸”选项,你可以选择两个开始时间(例如日出和中午),其中已知方位角是所需值的一侧(一个更大,一个小于)。然后使用简单的“减半间隔”方法快速找到近似解。