Как работать со швейцарскими эфемеридами в Microsoft Office Excel
Мало кому известно, но швейцарские
эфемериды можно подключить к Excel и проводить астрономические/астрологические расщеты любой сложности прямо на рабочем листе.
Прежде всего эта информация пригодиться, если вы занимаетесь астрологическими исследованиями или желаете провести какие-то нестандартные расщеты, которые не получается сделать в стандартных астрологических программах.
Если вы умеете немного праграммировать на Visual Basic, то в сочетании со математическими/статистическими возможностями в Exel и возможностью создавать макросы, - перед вами откроются безграничные возможности в моделировании експериментов, которые не может дать ни одна астрологическая/математичекая программа.
Но даже без знания Visual Basic можно сделать очень многое!!!
И так начнем с основ.
Для начала нам нужно будет подключить сами эфемериды к книге.
Т.е. задекларировать основные функции швейцарских эфемерид в рабочей книге и установить библиотеку швейцарских эфемерид.
Для этого:
1. Скопируйте файл: "swedll32.dll" в папку c:/windows/System32.
Этот файл входит в комплект постави многих астрологических программ, на пример ZET , но если его у вас нет, скачать его (вместе с документацией на английском языке, исходниками и др. полезностями) можно по ссылке: ftp://ftp.astro.com/pub/swisseph/sweph.zip (4 MB).
2. Теперь идем в Exel. Создаем новый документ.
Далее заходим: Меню "Сервис" -> "Макросы" -> "Редактор Visual basic".
Находим надпись "книга1.xls" (Если вы назвали документ по другому, то ваше название), и кликаем правой кнопкой мыши, выбираем "insert"->"module"
и вставляем в появившеся окне следующий текст (єто основные деклорации функций):
Продолжение в следующем посте....
Последний раз редактировалось LordWilex, 24.06.2008 в 03:05.
Ксожалению не поместилось в пост....
Короче, тогда просто вставляем содержимое этого файла в окно: SweDecl.zip
И так, основа у нас теперь есть, но с в таком виде с большинством функций работать очень сложно, поэтому добавим в конец следующий текст:
Function jday(year As Integer, month As Integer, day As Integer, hour As Integer, _
min As Integer, sec As Double, Optional greg) As Double
' returns julian day number given date in gregorian calender (greg=1)
' or julian calendar (greg = 0). If greg ommited, then Gregorian is assumed.
Dim a As Double
Dim b As Integer
a = 10000# * year + 100# * month + day
If (a < -47120101) Then MsgBox "Warning: date too early for algorithm"
If (IsMissing(greg)) Then greg = 1
If (month <= 2) Then
month = month + 12
year = year - 1
End If
If (greg = 0) Then
b = -2 + Fix((year + 4716) / 4) - 1179
Else
b = Fix(year / 400) - Fix(year / 100) + Fix(year / 4)
End If
a = 365# * year + 1720996.5
jday = a + b + Fix(30.6001 * (month + 1)) + day + (hour + min / 60 + sec / 3600) / 24
End Function
Public Function Plc(ByVal JD As Double, ByVal pl As Variant, Optional ByVal CType, Optional ByVal XPos) As Double
Dim x(6) As Double
Dim cusp(13) As Double
Dim ascmc(10) As Double
swe_set_ephe_path ("D:\SWESEMPHES")
iflag = SEFLG_SPEED + SEFLG_MOSEPH
If pl > 99990 And pl < 100018 Then
asss = swe_houses_ex(JD, iflag, CType, XPos, asc("P"), cusp(0), ascmc(0))
csp = pl - 99990
Plc = cusp(csp)
Call swe_close
Exit Function
End If
If CType = "Def" Then iflag = SEFLG_SPEED + SEFLG_MOSEPH
If CType = "STrop" Then iflag = SEFLG_TRUEPOS + SEFLG_SWIEPH
If CType = "SSid" Then iflag = SEFLG_SIDEREAL + SEFLG_SWIEPH
If CType = "SHel" Then iflag = SEFLG_HELCTR + SEFLG_SWIEPH
If CType = "SXYZ" Then iflag = SEFLG_XYZ + SEFLG_SWIEPH
If CType = "SRad" Then iflag = SEFLG_RADIANS + SEFLG_SWIEPH
If CType = "MTrop" Then iflag = SEFLG_TRUEPOS + SEFLG_MOSEPH
If CType = "MSid" Then iflag = SEFLG_SIDEREAL + SEFLG_MOSEPH
If CType = "MHel" Then iflag = SEFLG_HELCTR + SEFLG_MOSEPH
If CType = "MXYZ" Then iflag = SEFLG_XYZ + SEFLG_MOSEPH
If CType = "MRad" Then iflag = SEFLG_RADIANS + SEFLG_MOSEPH
If XPos = 1 Or XPos = "Lat" Then Plc = x(1)
If XPos = 2 Or XPos = "Lon" Then Plc = x(2)
If XPos = 3 Or XPos = "Dis" Then Plc = x(3)
If XPos = 4 Or XPos = "SpdLat" Then Plc = x(4)
If XPos = 5 Or XPos = "SpdLon" Then Plc = x(5)
If XPos = 6 Or XPos = "SpdDis" Then Plc = x(6)
If XPos = 7 Or XPos = "Er" Then Plc = serr$
DoEvents
End Function
Public Function ASPECT(x, y)
ASPECT = Abs(swe_difdeg2n(x, y))
End Function
Public Function ASPECT2(x, y)
ASPECT2 = swe_difdeg2n(x, y)
End Function
Это основной "джентльменский" набор функций, другие функции мы будем добавлять сюда же..
Внимание!!! Не забудьте заменить D:\SWESEMPHES на путь к файлам со швейцарскими эфемеридами на вашем компьютере, иначе почти ни чего работать не будет!!!
Сами файлы эфемерид, если у вас их нет, - можно скачать здесь: ftp://ftp.astro.com/pub/swisseph/ephe/.
И так, сохраняем и теперь мы можем работать с эфемеридами прямо на рабочем листе.
Продолжение следует
Последний раз редактировалось LordWilex, 24.06.2008 в 03:17.
Ура!!! Теперь мы можем начать работать, давайте попробуем вычислить тропическую долготу Солнца на 10 авнуста 1980 года в 13:58:40 GMT.
Для начала нам все же понадобиться определить юлианскую дату, на это время (к сожаления все функции работают только с юлианскими датами).
Для этого либо нажимаем кнопку Fx на панели инструментов, либо заходим в меню "вставка" -> "функция", и в, появившеся окне выбираем категирию "определенные пользователем", дальще ищем функуцию "jday" и выбираем её.
Теперь у нас появится вот такое окно:
Вводим дату, нажимаем ОК. И так, юлианска дата на 10-8-1980 13:58:40 была: 2444462,082.
Теперь опять заходим во "вставка" -> "функция" -> "определенные пользователем", и ищем функцию plc
И дальше аналогично предыдущему пункту:
Параметр pl - это номер планеты в системе швейцарских эфемерид.
Параметр JD - это юлианская дата
Параметр CType - это выбор зодиака (STrop - трапический, SSid Сидерический). Буква S в начале означает швейцарские эфемериды, а T - эфемериды Мошьера (TTrop), которые тоже включены в файл swedll32.dll.
Параметр XPos - это выбор координаты (на пример 0 это долгота, 1 Широта, можно на пример получить XYZ координаты и т.д. )
Короче нажимаем ОК и получаем результат.
И так 10-8-1980 в 13:58:40 GMT Долгота Солнца была 138,0711226 (или 18-й градус льва).
Спасибо, очень рад, что єта технология пригодиться не только мне
Прежде чем продолжать, хотелось бы по подробней раскрыть некоторые неясные моменты из прошлых постов, в основном это касается функции plc.
1. Параметр CType, это выбор системы зодиака, а так же вида эфемерид. Первая буква в параметре, как я уже сказал, указывает тип эфемерид.
S - Швейцарские эфемериды, - более точные, но требуют помимо библиотеки swedll32.dll присутствия на компьютере самих файлов эфемерид (хотя ты бы файлов: sepl_18.se1, semo_18.se1, seas_18.se1). Их сточность сопоставима с точностью эфемерид DE405/DE406, поэтому их вполне можно использовать и для научных целей.
M - Эфемериды Мошьера. Встроены в файл swedll32.dll, поэтому ни чего дополнительного для работы с ними скачивать не нужно (к астероидам это утверждение не относится). Являются апроксимацией эфемериды DE404. Но во первых они не так точны, как швейцарские эфемериды, и для кретичных к точности научных задач, обычно не подходят. Во вторых работают они медленей швейцарских эфемерид, а при большом объеме вычислений это может отнять у вас лишних пару дней. Но для практических задачь очень даже подойдут. Единственный существнный +, - это небольшой размер.
Пример использования:
STrop - тропический задиак по швейцарским эфемеридам.
MTrop - Тропический зодиак, Эфемериды Мошьера.
*****
SSid (MSid) - Вернуть координаты планеты в сидерическом зодиаке
SHel (MHel) - Вернуть координаты планеты в гелиоцентре
SXYZ (MXYZ) - Вернуть XYZ координаты (используется в астрономии)
SRad (MRad) - Вернуть координаты в радианах
2. Параметр pl - номер планеты в системе швейцарских эфемерид (координаты планет вычисляются аналогично солнцу в предыдущем посте, только 0 нужно заменить на номер планеты).
**** (Система Луна-Земля)
10 - Средний Восх. узел
11 - Истинный Восх. узел
12 - Средний апогей Луны (Лилит)
13 - Истиный апогей Луны
14 - Земля (в любом случае, результат в гелиоцентре).
*** (Основные астероиды. Эти астероиды включены в стандартный файл seas_18.se1)
15 - Хирон
16 - Фол
17 - Церара
18 - Плалада
19 - Юнона
20 - Веста
****
21 - INTP APOG (не знаю, что это такое, очевидно какой-то апогей...)
23 - INTP PERG (тоже не знаю, но явно перегей какой-то)
**** (Другие фиктивные планеты)
48 - Изида
49 - Нибиру (? В англиской транскрипции: Nibiru, Очевидно один из результатов "вычисления" 10-й планеты Солнечной системы).
50 - Харингтон (то же самое)
51 - Нептун Леверьера
52 - Нептун Адамса
53 - Плутон Лоуэла
54 - Плутон Пикеринга
*****
Так же, имеется возможность добавлять орбитальные элементы других фиктивных плапнет (как для земной орбиты, так и для солнечной), записав их в специальный файл.
Кстати, нам ни чего не мешает записать туда же и орбитальные элементы астероидов, если нет желания скачивать его эфемериды, правда точность таких координат астероида будет весьма сомнительна.
**** Особенности работы с астероидами. Номера астероидов.
Для того, чтобы вычислить астероид нужно:
а). Закачать файл с эфемиридами астероида (на сегоднешний момент на сайте швейцарских эфемерид их доступно уже десятки, если не сотни тысяч)и положить его в папку с эфемеридами.
б). Прибавить к номеру астероида 10000, а дальше, вставляем в функцию и вычисляем, как и все остальные планеты.
На пример, если вам нужно вычислить астероид Урания (Urania) порядковый № которого 30, мы:
- Скачиваем файл se00030s.se1, и кладем его в папку с эфемеридами.
- Прибавляем к 10000 № астероида. 10000 + 30 = 10030 , - это и будет номер, который мы подставляем в функцию plc
**** Особенности работы с домами.
Так же при помощи этой функции можно вычислить координаты начала домов в системе Плацидуса.
Для этого нужно к номеру дома прибавить 99990 и подствавить это число в функцию plc вместо планеты.
На пример:
Асцендент = 99990 +1 = 99991
II дом = 99990 + 2 = 99992
и т.д...
К сожалению, этот алгоритм писался мной для личных целей, а я работаю только с плацидусом или равнодомной системой, поэтому работа с домами плохо продуманна... вообще-то тут есть возможность работать не меньше, чем с десятком систем....
Вобщем, в следуюущий раз что-нить придумаем, чтобы обойти это и посветим следующий пост работе с домами.
******
P.S. Кстати, забыл упамянуть еще об одной вещи. Наверное будет не очень удобно каждый раз, когда создаешь документ, вставлять в него код с функциями , да и не нужно
Просто создаем пустой документ, вставяем в него функции, как было описанно в начале, а потом просто сохраняем как, "Надстройка Exel" (файл с расширением .xla), на прмер, swe.xla
Потом все закрываем. Входим в меню "Сервис" - > "Надстройки" -> "Обзор" и подключаем наш файл. После этого все функции швейцарских эфемерид будут доступны в любом документе exel, на вашем компьютере.
Здесь положил работу Алексея Богдановского, выложенную на ныне покойном suastroclub.narod.ru, там хороший пример.
Сегодня уже не так актуальна тема, поскольку MSO и Excel в том числе, как мы недавно узнали, стоит денег, причём больших, за которые вполне можно купить полноценный астропроцессор.
Лично у меня ни на рабочей, ни на домашней машине офиса нет.
Вот если бы были примеры реализации работы swedll32.dll совместно с Openoffice.org, в частности Calc, то были бы и мои "респект и уважуха".
Так же при помощи этой функции можно вычислить координаты начала домов в системе Плацидуса.
Для этого нужно к номеру дома прибавить 99990 и подствавить это число в функцию plc вместо планеты.
На пример:
Асцендент = 99990 +1 = 99991
У меня почему-то смещение на +1. Т.е. для МС нужно поставить не +10, а +11.
Да, еще вопрос. Каким образом функция Plc может расчитывать куспиды домов, если не задаются географические координаты? А если расчитывает, то на какое место?
Здесь положил работу Алексея Богдановского, выложенную на ныне покойном suastroclub.narod.ru, там хороший пример.
Спосибо! Не встречал этот пример. Эти функции можно использовать вместе с другими и расширить возможности!
Цитата:
Сообщение от DoReMi
Сегодня уже не так актуальна тема, поскольку MSO и Excel в том числе, как мы недавно узнали, стоит денег, причём больших, за которые вполне можно купить полноценный астропроцессор.
Лично у меня ни на рабочей, ни на домашней машине офиса нет.
Вот если бы были примеры реализации работы swedll32.dll совместно с Openoffice.org, в частности Calc, то были бы и мои "респект и уважуха"
Не согласен, во первых астрологические процессоры, - это астрологиеские процессоры.
Не смотря на то, что сейчас в них очень много возможностей, - ориентированны они на стандартные задачи... и очень трудно приспособить их под что-то свое...
На пример, со статистикой в них особо не разгуляешься..
А матаматические/статистические программы, - это совсем другое, но к сожалению, астрологическими функциями они пока особо не наделены :))))
Я уверен, что сейчас есть много астрологов, которые хотели БЫ и могли БЫ заняься исследованиями, но не могут реализовать свои идеи только из-за того, что отсутствуют гибкие средства для работы с астрологической статистикой, а программировать что-то свое они не умеют...
По крайней мере, пока не созданно ни чего лучшего, думаю, самый лучший путь это интегрировать эфемериды в стандартные математические программы.
Думаю exel сейчас есть не меньше, чем на 90% компютеров (а может и больше), и эта программа обладает всеми возможностями для статистической обработки данных, а швейцарсикие эфемериды бесплатны (если не закрывать исходный код и не использовать их в коммерческих целях) и в том или ином виде присутствуют на компьютерах большинства астрологов.
К тому же, в таком виде (ШЭ + Exel), - это очень гибкое решение, можно до бесконечности наращивать возможности, добавлая новые функции/макросы...
Поверьте мне, в этой связке можно реализовать любую идею, просто немного нужно "набить руку".
К сожалению, у меня нет Openoffice.org, но на сколько я помню, там в качесте языка макросов используется один из вариантов Basic'a, который кажется даже совместим с VB, так что думаю достаточно в функции внести небольшие коррективы и они прекрасно заработают и на вашей платформе.
У меня был еще опыт интеграции швейцарских эфемерид в MathCad, но там на много сложней, нужно писать библиотеки-переходники на С++, так что пока реализованны только расщеты самих координат планет, но зато остальные функции (типа аспектов) можно определить на самом рабочем листе в виде формул и функций.
Вот закончу с exel'ю займусь выкладыванием MathCad'овских функций :)))
Цитата:
Сообщение от Алексей
У меня почему-то смещение на +1. Т.е. для МС нужно поставить не +10, а +11.
Использую эту функцию для своих расчетов. :)
Цитата:
Сообщение от Алексей
Да, еще вопрос. Каким образом функция Plc может расчитывать куспиды домов, если не задаются географические координаты? А если расчитывает, то на какое место?
Это моя вина, возможно ошибка из-за того, что я забыл сказать, как указывать широту и долготу в этой функции.
Вместо типа зодиака в CType нужно прописать географическую широту.
А вместо XPos нужно указать долготу
(результат выдается в тропическом зодиаке).
Plc(Юлианская дата; 99990 + номер дома; Широта; Долгота)
Впрочем, работа с домами в этой функции действительно получилась корявая :)))
Сегодня я напишу ддругую, более подходящую для этих целей и более понятную функцию )))
P.S. Забыл про минуты.
Широту и долготу в этой функции нужно вводить одним десятичным числом.
т.е. если широта 47 градусов 12 минут
мы делаем так:
1/60*минуты+градусы
в данном случае широта в десятичном формате: 1/60*12+47=47,2
Впрочем, это будет не нужно, когда будет готова отдельная функция для домов ))
Не согласен, во первых астрологические процессоры, - это астрологиеские процессоры.
Не смотря на то, что сейчас в них очень много возможностей, - ориентированны они на стандартные задачи... и очень трудно приспособить их под что-то свое...
На пример, со статистикой в них особо не разгуляешься..
Да, это недостаток существующих астропроцессоров, но он исправим, теоретически...
Цитата:
Сообщение от LordWilex
К сожалению, у меня нет Openoffice.org, но на сколько я помню, там в качесте языка макросов используется один из вариантов Basic'a, который кажется даже совместим с VB, так что думаю достаточно в функции внести небольшие коррективы и они прекрасно заработают и на вашей платформе.
К сожалению совместимость далеко не 100%-ная, у меня с ходу не получилось, и далее разбираться пока не стал. Да и в успех электронных таблиц как инструмента астролога-исследователя я верю слабо - слишком много ограничений, но вполне можно их использовать для отображения результатов (таблицы, диаграммы). Другое дело - базы данных и запросы к ним. Тут есть и простор и потенциал.
Не согласен, во первых астрологические процессоры, - это астрологиеские процессоры.
Не смотря на то, что сейчас в них очень много возможностей, - ориентированны они на стандартные задачи... и очень трудно приспособить их под что-то свое...
На пример, со статистикой в них особо не разгуляешься..
Боюсь показаться назойливым, но именно из-за этого я и пишу AstroZaur. И после всего что тут написано, я уже никогда не поверю что AstroZaur сложная программа ;)
Да и в успех электронных таблиц как инструмента астролога-исследователя я верю слабо - слишком много ограничений, но вполне можно их использовать для отображения результатов (таблицы, диаграммы).
А какие на пример вы видите ограничения, и как вы представляете статистический анализ без таблиц?
Я на пример вижу для себя только 2 способа работы со статистикой, причем 2-й для меня неприемлим.
1. Расщитывать координаты планет в таблице, а потом обрабатывать данные при помощи статистических функций, которые кстати встроенны туда же )))
2. Писать под каждую конкретную задачу отдельную программу (скрипт/макрос и т.д.).
Если в первом случае достаточно один раз написать маленькую астроролическую/номическую функцию (или воспользоваться готовой, написанной кем-то другим), и потом она будет служить тебе много лет верой и правдой, просто из готовых кирпичиков строишь то, что тебе в данный момент нужно.
То во втором, нужно либо с нуля писать то, что тебе нужно, либо перекраивать чужой готовый код, а это еще хуже, чем писать с нуля :)))
Цитата:
Сообщение от DoReMi
Другое дело - базы данных и запросы к ним. Тут есть и простор и потенциал.
Общение с БД тоже можно организовать через эти функции, только я не вижу в этом смысл, если базу данных можно организовать прямо на рабочем листе...
Цитата:
Сообщение от Strijar
Боюсь показаться назойливым, но именно из-за этого я и пишу AstroZaur. И после всего что тут написано, я уже никогда не поверю что AstroZaur сложная программа ;)
А кто вам сказал, что она сложная? я за 5 минут в AstroZaur'е разобрался... :)))
...может быть через какое-то время, когда накопится набор готовых скриптов будет гораздо эффективней считать статистику именно в зауре... но мне на прмиер пока в экселе гораздо привычней :))
И так, функции для работы с домами и еще кое-какие полезности, которые я откопал в своем архиве. :)))
Для начала давайте вставим следующий текст в конец окна сфункциями (Меню: “Сервис” – “Макрос” – “Редактор Visual basic” (см. Пост №2) )
Public Function FixY(ByVal x As Double, ByVal y As Double)
While x >= y
x = x - y
Wend
While x < 0
x = x + y
Wend
FixY = x
End Function
Public Function Harmonica(ByVal pl As Double, ByVal har As Double)
Harmonica = FixY(pl, 360 / har) * har
End Function
Public Function StartPoint(SPoint, pl)
Dim d As Double
d = pl - SPoint
If d < 0 Then d = d + 360
If d > 360 Then d = d - 360
StartPoint = d
'StartPoint = FixY(swe_difdeg2n(pl, SPoint) + 360, 360)
End Function
Public Function GetDMS(ByVal Deg As Double, Optional ByVal par As Variant) As String
fract = Abs(Deg) - Int(Abs(Deg))
min = Int(fract * 60)
sec = fract * 3600 - min * 60
GetDMS = Format(Sgn(Deg) * Int(Abs(Deg)), "000") + "° " + Format(min, "00") + "' " + Format(sec, "00.0000") + "''"
If par = 1 Or par = "grad" Then GetDMS = Format(Sgn(Deg) * Int(Abs(Deg)), "000")
If par = 2 Or par = "min" Then GetDMS = Format(min, "00")
If par = 3 Or par = "sec" Then GetDMS = Format(sec, "00.0000") + "''"
End Function
Public Function DegInSign(x As Double)
DegInSign = x - (Fix(x / (360 / 12)) * 30)
End Function
Public Function DegInSign1(x As Double) As String
DegInSign1 = GetDMS((x - (Fix(x / (360 / 12)) * 30)), 0)
End Function
Public Function ZodSec(ByVal sig As Double, ByVal sectors As Double)
ZodSec = Fix(sig / (360 / sectors) + 1)
End Function
Public Function znname(N As Double)
Dim sig As Double
Dim znn(1 To 12) As String
sig = ZodSec(N, 12)
znn(1) = "Ове"
znn(2) = "Тел"
znn(3) = "Бли"
znn(4) = "Рак"
znn(5) = "Лев"
znn(6) = "Дев"
znn(7) = "Вес"
znn(8) = "Ско"
znn(9) = "Стр"
znn(10) = "Коз"
znn(11) = "Вод"
znn(12) = "Рыб"
znname = znn(sig)
End Function
Public Function hsname(N As Double)
Dim hs As Double
Dim hsn(1 To 12) As String
hs = Fix(N / 30 + 1)
hsn(1) = "I"
hsn(2) = "II"
hsn(3) = "III"
hsn(4) = "IV"
hsn(5) = "V"
hsn(6) = "VI"
hsn(7) = "VII"
hsn(8) = "VIII"
hsn(9) = "IX"
hsn(10) = "X"
hsn(11) = "XI"
hsn(12) = "XII"
hsname = hsn(hs)
End Function
Public Function NAKSATRA(LPlan As Double) As Double
N = 360 / 27
n2 = Fix(LPlan / N) + 1
NAKSATRA = n2
End Function
Public Function calcayan(ByVal JD As Double) As Double
d2r = 3.14159265358979 / 180
t = (JD - 2415020) / 36525
om1 = 259.183275 - 1934.14200833321 * t + 0.0020777778 * t * t + 0.0000022222222 * t * t * t
ls1 = 279.696678 + 36000.76892 * t + 0.0003025 * t * t
aya = 17.23 * Sin(d2r * om1) + 1.27 * Sin(d2r * ls1 * 2) - (5025.64 + 1.11 * t) * t
aya = (aya - 80861.27) / 3600
calcayan = aya
End Function
Public Function CHouse(ByVal JD As Double, ByVal HSys As Variant, ByVal CType As Variant, ByVal csp As Integer, ByVal LonH As Double, ByVal LonM As Double, ByVal LatH As Double, ByVal LatM As Double)
Dim x(6) As Double
Dim cusp(13) As Double
Dim ascmc(10) As Double
iflag = SEFLG_SPEED + SEFLG_MOSEPH
If CType = "SSid" Or CType = "MSid" Then iflag = SEFLG_SPEED + SEFLG_MOSEPH + SEFLG_SIDEREAL
If CType = "SHel" Or CType = "MHel" Then iflag = SEFLG_HELCTR + SEFLG_MOSEPH
Lon = LonH + 1 / 60 * LonM
Lat = LatH + 1 / 60 * LatM
asss = swe_houses_ex(JD, iflag, Lon, Lat, asc(HSys), cusp(0), ascmc(0))
If csp < 13 Then CHouse = cusp(csp) Else CHouse = ascmc(csp - 13)
End Function
Public Function PlAsc(ByVal JD As Double, HSys As Variant, CType, csp, LonH, LonM, LatH, LatM, pl)
Pll = Plc(JD, pl, CType, 0)
Hss = CHouse(JD, HSys, CType, csp, LonH, LonM, LatH, LatM)
PlAsc = FixY(swe_difdeg2n(Pll, Hss) + 360, 360)
End Function
Для начала рассмотрим функцию CHouse
Выводит координаты куспидов домов и еще кое-что ))
Где JD – Юлианская дата HSys - Система домов, в пареметре нужно записать одну из букв (к сожалению, не все удалось перевести :))) ):
P Плацидус
K Кох
O Порфирий
R Региомонтанус
C Кампанус
A or E Равнодомная от Asc
V Vehlow equal (Asc. in middle of house 1) (? Равнодомная, Asc в середине 1-го дома)
X Меридианная
H Горизонтальная система
T Polich/Page (“topocentric” system)
B Алькабитус
G Гукленовы сектора
M Моринус
На пример, если мы в параметре csp укажем 1-й дом, а в параметре pl Сонце (0), - получим долготу Солнца в системе, в которой за точку отсчета принят Asc, а если поставим 10 дом, то, соответственно MC.
Функция StartPoint, делает примерно то же самое, что и предыдущая функция, только в произвольном зодиаке. Вычисляет позицию координаты pl в зодиаке, в котором за 0-й градус принята точка SPoint.
StartPoint(SPoint, pl)
На пример, если мы в параметр SPoint поставим долготу Восх. узла, а в параметр pl поставим долготу Солнца, - то получим долготу Солнца в Драконическом зодиаке.
Функция GetDMS переводит абсолютную долготу в долготу, выраженную в градусах, ми нутах и секундах.
GetDMS(Deg, par)
Где параметр:
Deg – долгота планеты
Par – цифры от 0 до 3
0 – Выводит координату в текстовом виде (пример: 269° 51' 37,4093'' )
1 – Выводит только градус в числовом виде
2 – Выводит только минуту в числовом виде
3 – Выводит только секунду в числовом виде
Функция DegInSign берет абсолютную координату, и выводит градус внутри знака зодиака.
На пример: DegInSign (269,8) = 29,8 (29 градус Стрельца)
Функция DegInSign1 делает то же самое, что и предыдущая, только в формате градус, минута, секунда (пример: 029° 51' 37,4093'' )
Функция ZodSec (sig, sectors) выводит номер сектора в N-секторной системе, в которой находится точка sig.
Где: Sig - координата планеты (или еще чего - нить) Sectors – Количество секторов, на который мы делем зодиак.
Поясню на примере.
Если планета имеет долготу 138 градусов, то в 12-ти секторной системе (т.е. обычный зодиак) номер её сектора будет 5 (т.е. знак Льва). ZodSec (138, 12) = 5
В 36 секторной системе (т.е. делим зодиак на декады) ZodSec (138, 36) = 27 (27 декада)
Или, на прмер, мы можем поделить зодиак на 27 накшатр ZodSec (138, 27) = 21 (накшатра Ашлеша по джотишу).
Функция znname берет абсолютную долготу и выдает имя знака (первые 3 буквы), на пример znname(188) = лев
Функция hsname берет абсолютную долготу и выдает номер дома римскими цифрами (можно использовать совместно с функцией PlAsc), на пример: hsname(228) =VII
Функция NAKSATRA – берет долготу и выдает номер накшатры по джотишу. NAKSATRA(138)=21
Функция calcayan – берет юлианский день и выдает аянамсу (лахари). Calcayan(2444462,082) = -23,5842409
Функция Harmonica берет координату планеты и возвращает её в заданном номере гармоники.
Где: Pl – долгота планеты
Огромная признательность, LordWilex, за изложенную информацию!!
Уже переделал свои рабочие таблицы Excel для ректификации. Кто пробовал вводить формулы расчёта долготы и широты планет, тот сталкивался с трудностью для расчёта Лунных Узлов, Плутона и Хирона. Теперь это решено.
Ещё раз большое спасибо!!
Одна просьба: для расчёта паранов планет (восход, верхняя кульминация, заход, нижняя кульминация) надо знать прямое восхождение и склонение планеты. Подскажите, пожалуйста, как вводить эти данные.
Для расчёта паранов планет (восход, верхняя кульминация, заход, нижняя кульминация) надо знать прямое восхождение и склонение планеты. Подскажите, пожалуйста, как вводить эти данные.
Легко!!! :)))
Во первых в швейцарских эфемеридах есть специальная функция swe_rise_trans , которая выводит восходы/заходы и кульминации, однако, из-за того, что она использует ссылочные типы C++, напрямую с ней на экселевском листе работать нельзя, поэтому сделаем "переходник", для этого вставите следующие функции:
Public Function parans(JD As Double, pl, CType, LonH, LonM, LatH, LatM, Alt As Double, rsmi) As Double
Dim x(6) As Double
Dim GPos(3) As Double
Dim tret As Double
iflag = SEFLG_SPEED + SEFLG_MOSEPH
If CType = "Def" Then iflag = SEFLG_SPEED + SEFLG_MOSEPH
If CType = "STrop" Then iflag = SEFLG_TRUEPOS + SEFLG_SWIEPH
If CType = "SSid" Then iflag = SEFLG_SIDEREAL + SEFLG_SWIEPH
If CType = "SHel" Then iflag = SEFLG_HELCTR + SEFLG_SWIEPH
If CType = "SXYZ" Then iflag = SEFLG_XYZ + SEFLG_SWIEPH
If CType = "SRad" Then iflag = SEFLG_RADIANS + SEFLG_SWIEPH
If CType = "MTrop" Then iflag = SEFLG_TRUEPOS + SEFLG_MOSEPH
If CType = "MSid" Then iflag = SEFLG_SIDEREAL + SEFLG_MOSEPH
If CType = "MHel" Then iflag = SEFLG_HELCTR + SEFLG_MOSEPH
If CType = "MXYZ" Then iflag = SEFLG_XYZ + SEFLG_MOSEPH
If CType = "MRad" Then iflag = SEFLG_RADIANS + SEFLG_MOSEPH
Function JDToDay(ByVal JD As Double, ByVal per As Long) As Double
z1 = JD + 0.5
z2 = Fix(z1)
F = z1 - z2
If z2 < 2299161 Then
a = z2
Else
alf = Fix((z2 - 1867216.25) / 36524.25)
a = z2 + 1 + alf - Fix(alf / 4)
End If
b = a + 1524
c = Fix((b - 122.1) / 365.25)
d = Fix(365.25 * c)
e = Fix((b - d) / 30.6001)
days = b - d - Fix(30.6001 * e) + F
kday = Fix(days)
If e < 13.5 Then
kmon = e - 1
Else
kmon = e - 13
End If
If kmon > 2.5 Then
kyear = c - 4716
End If
If kmon < 2.5 Then
kyear = c - 4715
End If
hh1 = (days - kday) * 24
khr = Fix(hh1)
kmin = hh1 - khr
ksek = kmin * 60
kmin = Fix(ksek)
ksek = Fix((ksek - kmin) * 60)
xday = kday
xmon = kmon
xyear = kyear
' s = kday + "." + kmon + "." + kyear + " " + khr + ":" + kmin
If per = 1 Then JDToDay = kday
If per = 2 Then JDToDay = kmon
If per = 3 Then JDToDay = kyear
If per = 4 Then JDToDay = khr
If per = 5 Then JDToDay = kmin
If per = 6 Then JDToDay = ksek
End Function
Public Function parans2(JD As Double, pl, CType, LonH, LonM, LatH, LatM, Alt As Double, rsmi, ByVal t As Integer, popr As Double)
popr = (1 / 24) * popr
parans2 = JDToDay(parans(JD, pl, CType, LonH, LonM, LatH, LatM, Alt, rsmi) + popr, t)
End Function
Итак, функция parans выводит юлианскую дату времени восхода/захода, а так же верхней/нижней кульминаций (Внимание!!! Дата выводится по гринвичу!!! Чтобы учесть поправку нужно прибавить к этой дате (1/24)*поправка ).
Где: JD - Ближайшая Юлианская дата до ожидаемого времени (захода/восхода/кульминации) pl - Номер планеты в системе швейцарских эфемерид (см. функцию plc в начале темы). CType - Тип зодиака (STrop, SSid и.т.д.), не знаю зачем в тут это нужно, но функция swe_rise_trans, почему-то запрашивает эту информацию. LonH и LonM - Географическая широта места наблюдения (градусы и минуты) LatH и LatM - Географическая долгота места наблюдения (градусы и минуты) Alt - Высота над уровнем моря (думаю, можно поставить 0) rmsi - Что выводить? ( Одна из 4-х цифр: 1 - время восхода планеты, 2 - время захода, 3 - время верхней кульминации, 4- время нижней кульминации)
Замечние. Хочется обратить внимание, что функция выдает результат из расщета, что атмосферное давление 800 мм. ртутного столба, а темперетура места наблюдения - 15 градусов цельсия.
Если вы хотите изменить эти параметры заменити их в переменных
atpress = 800
attemp = 15
внутри самой функции на то, что вам нужно.
Однако с юлианской датой работать наверное не удобно, поєтому давайте довавим еще кое что:
Функция parans2 выводит то же самое, что и предыдущая функция, только не в виде юлианской даты, а в виде привычной нам грегорианской, а так же учитывает поправку на местное время :)))
Значения параметров те же самые, что и в предыдущей функции, за исключением 2-х последних поэтому повторяться не буду.
Параметр t - выводит одну из частей григорианской даты (одна из 4- цифр: 1 - день, 2 - месяц, 3- год, 4- час, 5 - минута, 6 - секунда).
Параметр popr - Поправка к GMT (на пимер: +3, 3, -1.. и т.д.).
Еще одна полезная функция JDToDay - переводит юлианскую дату в обычную.
JDToDay(JD, per)
Где: JD - Юлианская дата per - Одна из частей григорианской даты, которую нужно вывести (одна из 4-х цифр): 1 - день, 2 - месяц, 3- год, 4- час, 5 - минута, 6 - секунда
Если вам все-таки нужно знать склонение/прямое восхождение планеты, добавим в функцию plc 4 строки (я могу ошибаться, но, по моему, про это вы спрашивали):
If CType = "MEq" Then iflag = SEFLG_EQUATORIAL + SEFLG_MOSEPH
If CType = "SEqR" Then iflag = SEFLG_RADIANS + SEFLG_EQUATORIAL + SEFLG_SWIEPH
If CType = "MEq" Then iflag = SEFLG_EQUATORIAL + SEFLG_MOSEPH
If CType = "MEqR" Then iflag = SEFLG_RADIANS + SEFLG_EQUATORIAL+ SEFLG_MOSEPH
Т.Е.:
Public Function Plc(ByVal JD As Double, ByVal pl As Variant, Optional ByVal CType, Optional ByVal XPos) As Double
Dim x(6) As Double
Dim cusp(13) As Double
Dim ascmc(10) As Double
swe_set_ephe_path ("D:\SWESEMPHES")
iflag = SEFLG_SPEED + SEFLG_MOSEPH
If pl > 99990 And pl < 100018 Then
asss = swe_houses_ex(JD, iflag, CType, XPos, asc("P"), cusp(0), ascmc(0))
csp = pl - 99990
Plc = cusp(csp)
Call swe_close
Exit Function
End If
If CType = "Def" Then iflag = SEFLG_SPEED + SEFLG_MOSEPH
If CType = "STrop" Then iflag = SEFLG_TRUEPOS + SEFLG_SWIEPH
If CType = "SSid" Then iflag = SEFLG_SIDEREAL + SEFLG_SWIEPH
If CType = "SHel" Then iflag = SEFLG_HELCTR + SEFLG_SWIEPH
If CType = "SXYZ" Then iflag = SEFLG_XYZ + SEFLG_SWIEPH
If CType = "SRad" Then iflag = SEFLG_RADIANS + SEFLG_SWIEPH
If CType = "SEq" Then iflag = SEFLG_EQUATORIAL + SEFLG_SWIEPH
If CType = "SEqR" Then iflag = SEFLG_RADIANS + SEFLG_EQUATORIAL + SEFLG_SWIEPH
If CType = "MTrop" Then iflag = SEFLG_TRUEPOS + SEFLG_MOSEPH
If CType = "MSid" Then iflag = SEFLG_SIDEREAL + SEFLG_MOSEPH
If CType = "MHel" Then iflag = SEFLG_HELCTR + SEFLG_MOSEPH
If CType = "MXYZ" Then iflag = SEFLG_XYZ + SEFLG_MOSEPH
If CType = "MRad" Then iflag = SEFLG_RADIANS + SEFLG_MOSEPH
If CType = "MEq" Then iflag = SEFLG_EQUATORIAL + SEFLG_MOSEPH
If CType = "MEqR" Then iflag = SEFLG_RADIANS + SEFLG_EQUATORIAL + SEFLG_MOSEPH
If XPos = 1 Or XPos = "Lat" Then Plc = x(1)
If XPos = 2 Or XPos = "Lon" Then Plc = x(2)
If XPos = 3 Or XPos = "Dis" Then Plc = x(3)
If XPos = 4 Or XPos = "SpdLat" Then Plc = x(4)
If XPos = 5 Or XPos = "SpdLon" Then Plc = x(5)
If XPos = 6 Or XPos = "SpdDis" Then Plc = x(6)
If XPos = 7 Or XPos = "Er" Then Plc = serr$
DoEvents
End Function
Тогда в параметр CType вводим SEq или SEqR (SEq - выводит результат в градусах, а SEqR - в радианах)
Если в параметр XPos ввести 0- функция выдаст прямое восхождение, а если 1 - склонение (или наоборот, сам еще не понял )
К сожалению мне скачать не удалось. Почему-то время скачивания больше полутора часов и по весу большой. Это действительно так или это у меня что-то не правильно?
К сожалению мне скачать не удалось. Почему-то время скачивания больше полутора часов и по весу большой. Это действительно так или это у меня что-то не правильно?
Достаточно для начала скачать файл ftp://ftp.astro.com/pub/swisseph/sweph.zip 4,5мб
Там библиотеки, которые подключаются к Excel.
А потом выборочно качать файлы эфемерид.
К сожалению мне скачать не удалось. Почему-то время скачивания больше полутора часов и по весу большой. Это действительно так или это у меня что-то не правильно?
А во вторых, как я понял, вы пытались скачть все файлы, что там были, а это для практической работы вряд ли нужно.
Для работы с сами эфемеридыами обычно нужно иметь на компьютере всего 3 файла:
sepl_18.se1
semo_18.se1
seas_18.se1
Эти файлы весят всего около 2 мегобайт, включают в себя эфемериды Луны, планет и еще 4-х основных астероидов на период с 1800 по 2399 годы (что для практической работы более чем достатчно).
При чем, если у вас на компьютере есть ZET скачивать эти файлы не обязательно, поскольку они уже имеются в папке: ZET 8\Swiss\.
Остальные файлы, что там имеются (sepl_*.se1, semo_*.se1, seas_*.se1) включают эфемериды для других исторических эпох (вряд ли вам понадобится знать где была Луна 5 000 лет до нашей эры, или где будет через 5 000 лет в будущем :))) ).
Так же, там есть несколько тысяч файлов эфемерид астероидов вида: s*.se1 где * - это номер астероида. Они вам понадобятся, если будите работать с чем-то специфическим. На пример, можно скачать астероиды Эрида (s136199.se1) или Седна (se90377.se1).
Хочу обратить внимание, что эфемериды Цереры, Палады, Юноны и Весты уже включены в файл seas_18.se1.
Последний раз редактировалось LordWilex, 29.06.2008 в 04:18.