Астрономическое программное обеспечение прогнозирует местоположение Солнца, принимая 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()
, и посмотрите, что произойдет!
Если я действительно закончил красться, я, безусловно, возьму во внимание «половину интервала». Благодаря! – davehunt00