天文学软件通过 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()
,看看会发生什么!