Здравствуйте
Задался целью расчета лунных дней. Вроде бы информация не закрыта и информации много, как и готовых скриптов. Но - почему-то у меня все получается с погрешностью 1-2 суток (я сравниваю с онлайн-калькуляторами). Почему так - не знаю, вероятно нужно добавлять географическую составляющую или что.
Вот взять 2 первые ссылки из гугла:
_https://lyna.info/raschyot-lunnogo-dnya-rozhdeniya/
_http://redday.ru/informer/i_moon/225/bl.png
Там везде одинаково, а у меня так не получается.
В общем, посоветуйте скрипт (ЯП любой, я переведу), или нормальный алгоритм, или куда копать, в какую сторону.
Просто надо определять положение луны относительно Ас.
Восход луны считать методом деления отрезка пополам, например.
Простенький такой численный метод.
Первые сутки на момент новолуния, вторые на первый восход луны и т.п.
Ас это пересечение математического горизонта с эклиптикой. На востоке.
Есть тригонометрическая формула для его вычисления.
Отрезок делить между луной и Ас, когда она на восходе, при каком то шаге с нужной погрешностью координаты луны совпадут с координатой Ас.
Это будет начало новых лунных суток. Ну там разные, наверно, можно придумать алгоритмы совпадения луны и Ас, восхода луны.
Естественно вам понадобится вычисление координаты луны и солнца. Солнца для новолуния.
Соответственно, в первом случае нужно рассчитывать и позиции небесных объектов, и восходы Луны. Во втором случае только позиции небесных объектов.
Новолуние происходит в тот момент, когда Луна входит в точное соединение с Солнцем. Как рассчитать долготу Солнца я написал . Чтобы рассчитать позицию Луны там нужно поменять константу swisseph.SUN на swisseph.MOON.
Время восхода Луны рассчитывается примерно так:
Код:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import swisseph
if __name__ == "__main__":
year = 1957
month = 10
day = 15
hour = 0
minutes = 0
seconds = 0
lon = 25.1
lat = 58.95
# Высота в метрах.
alt = 0.0
# Атмосферное давление в миллибарах.
press = 0.0
# Температура в градусах Цельсия.
temp = 0.0
# Получение юлианского дня в ut.
et_ut = swisseph.utc_to_jd(year, month, day, hour, minutes, seconds, swisseph.GREG_CAL)
jd = et_ut[1]
# Флаг указывает, что используются швейцарские эфемериды.
flag = swisseph.FLG_SWIEPH
# Флаг указывает, что рассчитывается восход.
rsmi = swisseph.CALC_RISE
# Получения значения восхода Луны.
result = swisseph.rise_trans(jd, swisseph.MOON, lon, lat, alt, press, temp, rsmi, flag)
# Преобразование юлианской даты в UTC.
result = swisseph.jdut1_to_utc(result[1][0], swisseph.GREG_CAL)
print(result)
Нюанс: флаг rsmi может содержать несколько значений. Возможно еще потребуется их добавить.
Значения alt, press, temp можно указать для пущей точности.
Последний раз редактировалось Yuri197, 26.12.2018 в 01:41.