PyEphem: могу ли я рассчитать высоту Солнца по азимуту

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

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

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

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

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

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


person davehunt00    schedule 24.02.2013    source источник


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

person Brandon Rhodes    schedule 25.02.2013
comment
Спасибо! Я проверю их и доложу, в каком направлении я беру. Я ценю время, которое вы потратили на ответ. D - person davehunt00; 25.02.2013

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

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

person Stuart    schedule 24.02.2013
comment
Если я все-таки буду красться, я обязательно учту сокращение интервала вдвое. Спасибо! - person davehunt00; 25.02.2013