2013-02-24 8 views
3

Я использую PyEphem для расчета местоположения Солнца в небе в разное время.PyEphem: могу ли рассчитать высоту Солнца от азимута

У меня есть точка наблюдения (бывает в Стоунхендже) и может использовать PyEphem для расчета восхода, захода солнца и угла высоты и азимута (в градусах от N) для Солнца в любой час дня. Блестящий, без проблем.

Однако, мне действительно нужно, чтобы можно было вычислить угол высоты Солнца по известному азимуту. Поэтому я бы установил ту же точку наблюдения (long/lat/elev/date (только yy/mm/dd, а не время)) и азимут для Солнца. И из этого ввода вычислите высоту Солнца и время, когда оно находится по этому азимуту.

Я надеялся, что смогу установить Sun.date и Sun.az и работать в обратном направлении от этих значений, но, увы. Любые мысли о том, как подойти к этому (и если он даже доступен) с PyEphem?

Единственный другой вариант, который я вижу в наличии, - это «подкрасться» по азимуту, повторив последовательность раз, пока я не получу допустимый запас азимута, но это просто грубо.

заранее спасибо, Дэйв

ответ

0

, не зная подробности внутренних расчетов, PyEphem это делать, я не знаю, насколько легко или трудно было бы инвертировать эти расчеты, чтобы дать желаемый результат.

Что касается опции «подкрасться», вы можете выбрать два времени начала (например, восход и полдень), где азимут, как известно, имеет любую сторону (на одну большую и одну меньше) желаемое значение. Затем просто используйте простой подход «с половиной интервала», чтобы быстро найти приблизительное решение.

+0

Если я действительно закончил красться, я, безусловно, возьму во внимание «половину интервала». Благодаря! – davehunt00

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(), и посмотрите, что произойдет!

+0

спасибо! Я проверю их и сообщит, в каком направлении я беру. Я ценю время, которое вы приняли для ответа. D – davehunt00