Лунный день по Харви и Джотишу (не совсем тренинг,но, кто хочет может потренероватьс)
Не совсем тренинг,но, кто хочет может потренероваться
Вычисление Лунных суток в том виде, как это понимается в западной астрологии дело довольно трудоемкое, требует довольно много строк кода, и "съедает" много машинного времени, особенно в случаях, когда вам нужно вычислить сразу 1000 дат.
Исходя из определения:
Лунные сутки это период времени между 2 восходами Луны, а лунный меяц отсчитывается с новолуния.
Необходимо:
1. Иметь алгоритм рассчета долготы Солннца
2. Алгоритм для расчета долготы Луны
(а достаточно точный алгоритм, расчета Солнца и Луны, - это как минимум, пара десятков страниц, состоящих из непонятных и страшных формул ).
3. Алгоритм (разумеетмся, итерационный) расчета момента новолуния.
4. Алгоритм работы с Асц.
5. И наконец, методом перебора, "прочесываем" все моменты восхода Луны, от начала лунного месяца до искомого момента, считаем эти восходы и навыхеде имеем вожделенный номер Лунного дня.
В общем, задача такая, что "Мама роди меня обратно!".
К счатью, не все так печально, иногда лунный день достаточно знать с некоторой погрешностью.
Тут у нас 2 варианта:
Посчитать Лунный день по Джотишу, либо воспользоваться формулой Харви.
К сожалению, обе формулы дают результат с точностью примерно 90%, но если вас съели - вас только 2 выхода.
С Джотишем все просто. Если в условиях, в которых вам пришлось работать без любимого компутера с установленным ZET'ом и срочно потребовался лунный день, - у вас есть доступ к бумажным эфмеридам Солнца/Луны или вы каким-то чудом узнали их координаты на нужную дату, то поступаем так:
1. Вычитаем долготу Солнца из Долготы Луны (кстати, если результат меньше 180, то речь идет о растущей Луне, если больше то Луна убывающая)
2. Делим то, что у нас получилось на 12
3. Прибавляем к результату 1.
4. Отбрасываем дробную часть.
5. Радуемся.
т.е. на компутерном языке формула выглядит так:
MoonDay = int((MO-SU)/12+1)
где int() - операция отбрасывания дробной части, если кто не знает.
Если вы работаете в западной астрологии, эта фармула даст вам приближенный результат (т.е. можно быть на 90% уверенным, что это именно тот лунный день), а если вы занимаетесь индийской астрологией, то беспокоится вам не о чем, формула очень точна, но джотиши её и так прекрасно знают :)
Если эфемерид Солнца и Луны под рукой нет, то мы можем воспользоваться формулой Харви,которую я недавно отрыл в интернете и она мне буквально спасла жизнь, для её применения дстаточно знать дату, но саму формулу нужно знать на изусть (для освоения мне хватило 30 минут практики, алгоритм не так сложен, как может показаться на первый взгляд).
Поясню.
Допустим, вам необходимо узнать, когда какой был лунный день 10 августа 1980 года (моя, кстати днюха).
1. Если речь идет об январе или об феврале месяце, то к номеру месяца прибавляем еще 12 (смотрите не забудьте!) , но поскольку в данном случае речь идет об августе, то номер месяца не трогаем.
2. Вычислим первый промежуточный парраметр eq. Делим номер года на 100 и округляем результат до ближайшего целого.
LordWilex проверь плиз:
а то что-то запуталась, у меня получилось так:
((1984/19)-104)*209=(104,42-104)*209=0,42*209=87,78 значит 0,78
(0,78+10+6-3)/30=13,78/30=0,459(3)
0,46*30=13,78+1=14,78, значит 14 день
на москву выходит, что 6 октября того года был 13 лунный день, может тут еще надо учитывать часовые пояса?
Последний раз редактировалось Бастет, 17.06.2009 в 14:07.
Я сам ни чего не понял, у меня вообще получился 12 день, причем в маткаде и в калькуляторе промежуточные итоги были разные, дак что это ты проверь плиз, ты же математик!! :))
eq=floor(1984/100)
19
cent=floor(eq/3) + floor(eq/4)+6-eq
-3
1984/19
104.42105263157894
A=(1984/19) - floor(1984/19)
0.4210526315789451
A=A*209
87.99999999999953
A=(A+10+6+cent)/30
3.366666666666651
MoonDay=(A-floor(A))*30+1
11.999999999999534
round(MoonDay)
= 12 лунный день
Ну и 12 и 14 день по моему близко к истине.... просто этот алгоритм заведомо дает погрешность 10%... но скорей всего там явно или у тебя или у меня где-то косяк с округлением... я сам долго разбирался где вверх округлять, где вниз, потому что в первоисточнике формула была описанна словами
Прилагаю файл с вычислениями в формате маткад, и на всякий, пожарный калькулятор, в котором я считал Бастет.zip
P.S. Пояса не нужно усчитывать, потому что формула сама по себе приближенная, хотя если по хорошему, то в точном алгоритме без этого не обойтись, верней не обойтись без алгоритма расчета восхода Луны на географической долготе.
P.P.S.
Цитата:
0,46*30=13,78+1=14,78, значит 14 день
Вообще-то не 14, а 15 получился, округлять-то до ближайшего целого в конце нужно...
Последний раз редактировалось LordWilex, 17.06.2009 в 18:13.
1. Если речь идет об январе или об феврале месяце, то к номеру месяца прибавляем еще 12 (смотрите не забудьте!) , но поскольку в данном случае речь идет об августе, то номер месяца не трогаем.
Люди я дико извиняюсь за дизинформацию. Нашел ошибку, нечайно старую картинку воложил в первом посте.
Если месяц январь или февраль, то нужно не только прибавлять к номеру месяца 12, но и от номера года отнимать 1.
Спасибо за формулу.
В благодарность, расчет по Джоришу, написанный на Lua.
Код:
getMoonDay = function(day,month,year)
Day=day
Month=month
Year=year
if(month<=2) then
month = month+12
year = year-1
end
local nc = math.floor(year/100)
local vc = ((math.floor(nc/3) + math.floor(nc/4)) +6) - nc
local a = (year/19)
local b = ((a-math.floor(a))*209)
local c = ( b + month + day + vc )/30
local MoonDay=math.round(((c - math.floor(c))*30)+1)
return MoonDay
end
Теперь ищу формулу расчета прохождения луны через знаки зодиака.
Поможете?