Skocz do zawartości

Algorytmy astronomiczne czyli Python w rachunkach astro. - Cz. I - Julian Day


Wiesiek1952

Rekomendowane odpowiedzi

Próbujemy. Jak się spodoba to będzie kontynuacja :D

 

Uzbierało mi się trochę różnych procedur i funkcji wyliczających różne rzeczy astro, od efemeryd ciał niebieskich po ich pozycje na niebie, wysokość, azymut itp.  90% tych procedur powstało w zamierzchłych czasach, jeszcze w latach 90 ubiegłego wieku na podstawie książki Jean Meeus'a "Astronomical Algorithms" (mam wydanie I), która do dzisiaj stanowi rodzaj biblii w rachunkach astronomicznych. Procedury powstały pierwotnie w Pascalu, potem zostały przerobione na C/C++ a ostatnio przerabiam je na Pythona bo to język działający tak samo pod Linuxem, Windows czy Mac OS. Większość tych rachunków całkiem sprawnie wykonują programy "planetaryjne" czyli np. Stellarium, CdC czy KStars. 

 

Python jest bardzo fajnym i dość łatwym językiem programowania. Używam IDE o nazwie PyCharm (w wersji darmowej czyli community). 

 

Zaczynamy od wyliczania numeru dnia juliańskiego. Problem może wydawać się trywialny ale wszystkie rachunki w astro zaczynają się od wyliczenie tego dnia. Obecnie w życiu codziennym używamy kalendarza gregoriańskiego ale w obliczeniach astro dalej króluje kalendarz juliański.

 

Numer Julian Day oznacza ciągłą numerację dni od roku -4712  - innymi słowy Świat liczy sobie 6734 lata :D. Tradycyjnie dzień zaczyna się o 12:00 (w południe) Greenwich mean noon czyli o 12:00:00 UTC (Universal Time - UT)

EDIT: To tradycja rodem z nawigacji - we wszystkich morskich raportach, dziennikach itp. dzień zaczyna się w południe i tak jest od zamierzchłych czasów kiedy brytyjska flota zdobywała świat.

 

 

1977 April 26.4 UT = JD 2 443 259.9 

 

W obliczeniach musi być uwzględniona reforma kalendarza dokonana w 1582 r. Dniem następującym po 4 October 1582 jest 15 October 1582 czyli dni "z pomiędzy" nie istnieją - nie ma np. dnia 10 October 1582.  kalendarz gregoriański nie został oficjalnie zaadoptowany natychmiast i tak np. w Wielkiej Brytanii zrobiono to dopiero 1752 r a w Turcji aż w 1927.

 

Do tej pory nie ma porozumienia jak liczyć dni i kalendarz BC (Before Christ). Zarówno Meeus w swojej książce jak i tutaj przyjmujemy, że liczymy daty w sposób arytmetyczny czyli rok przed rokiem +1 ma numer "0" a lata wcześniejsze mają znaczek "-" czyli są ujemne. Historycy liczą to inaczej - wg. nich nie było roku zerowego - np rok 585 BC (w historii) jest w rzeczywistości w astronomii rokiem -584.

 

Teraz o samym programie poniżej - nie jestem w stanie zrobić tu pełnego kursu Pythona stąd wyjaśnienia mogą wydawać się niepełne ale po poznaniu absolutnych podstaw Pythona powinny być wystarczające.

 

- stworzyłem sobie klasę o nazwie day_in_calendar dla własnej wygody. Klasa jest najprostszą z możliwych, posiada prosty konstruktor i przechowuje trzy wartości - Rok, Miesiąc i Dzień. Takich klas później będzie więcej.

- funkcja def julian_day() pobiera dzień jako argument i zwraca wartość typu float czyli numer dnia juliańskiego dla godziny 00:00:00 UT - stąd zawsze jest xxxxx.5 na końcu. 

 

 W linii #68 deklaruję zmienną typu: day_in_calendar i ustalam wartości na 2022 May 02 uruchomiony program zwraca numer dnia juliańskiego 2,459,701.5 

 

EDIT: Wiem, że funkcje tu zamieszczone są napisane w sposób wręcz prymitywny i bez wodotrysków w stylu C++ jak np. return  x > 0.0  ?  1 : ( x == 0.0  ?  0.0 : -1 )  co jest niczym innym jak zapisem funkcji SIGNUM czyli znak. Trudno się to czyta, trudno to zrozumieć choć wygląda ładnie. Wszystko tutaj jest dość wiernym odwzorowaniem formuł Meeus'a - łatwiejsze do prześledzenia i do analizy.

 

EDIT: Skopiowanie poniższego do PyCharm czy IDLE czy Spidera powinno dać w/w rezultaty

 

# This is a sample Python script.

# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.

import math

class day_in_calendar:
    def __init__(self, year: int = 0, month: int = 0, day: float = 0):
        self.year = year
        self.month = month
        self.day = day


# ******************************************************************************************

#   Routine to calculate a Julian day number for a Year, Month and Day
#   given on the Julian calendar.Dates B.C.should be expressed
#   in ASTRONOMICAL format, i.e.dateBC = -(date -1).Thus 747 B.C.= -746
#   and 1 B.C = 0 (zero)
#
#   Inputs to routine are the year, month and day expressed as INTEGERS
#   Output is the Julian day number as float
#
#   BELOW Meeuws ALGORITHM / working well - corrected Dec 2015
#   YEAR in ASTRONOMICAL way - ie. Year 0 DOES EXIST

# ******************************************************************************************

def julian_day(current_day: day_in_calendar) -> float:
    yyyy = current_day.year
    mi = current_day.month
    dddd = current_day.day
    bbb = 0
    # ******************************************************************************************
    #   Protection for days which are not existing in GEORGIAN calendar
    # ******************************************************************************************
    if yyyy == 1582:
        if mi == 10:
            if 4 < dddd < 15:
                return 0
    if mi > 2:
        y = yyyy
        m = mi
    else:
        y = yyyy - 1
        m = mi + 12
    yyyy = yyyy + mi / 100.0 + dddd / 10000.0
    if yyyy >= 1582.1014999999999:
        aaa = math.trunc(y / 100.0)
        bbb = 2 - aaa + math.trunc(aaa / 4)
    if yyyy >= 0:
        jd1 = math.trunc(365.25 * y) + math.trunc(30.6001 * (m + 1)) + dddd + 1720994.5
    else:
        jd1 = math.trunc(365.25 * y - 0.75) + math.trunc(30.6001 * (m + 1)) + dddd + 1720994.5
    jd1 = jd1 + bbb
    if 1721057.5 < jd1 < 1721118.5:
        jd1 = jd1 - 1
    if 0.0300 < yyyy < 0.0302:
        jd1 = jd1 + 1
    return jd1  # Julian Day number;



# Press the green button in the gutter to run the script.
if __name__ == '__main__':

    dzien_dzisiaj = day_in_calendar( 2022, 5, 2)

    jd = julian_day(dzien_dzisiaj)

    print('Numer dnia juliańskiego = ', jd)

# See PyCharm help at https://www.jetbrains.com/help/pycharm/
Edytowane przez Wiesiek1952
  • Lubię 7
Odnośnik do komentarza
Udostępnij na innych stronach

  • Wiesiek1952 zmienił(a) tytuł na Algorytmy astronomiczne czyli Python w rachunkach astro. - Cz. I - Julian Day

Tak znam. :D  Jest jeszcze drugie pymeeus.py by Dagberto Salazar (Copyright 2018) - też jest w bibliotece Pythona.  Obadwa są w bibliotece pythona i obydwa są strasznie zakomplikowane i niekoniecznie przydatne do celów obserwacji astro (nawigacyjnych tez ale to akurat prawie tożsame potrzeby są).

 

  • Lubię 1
Odnośnik do komentarza
Udostępnij na innych stronach

2 godziny temu, Wiesiek1952 napisał:

Uzbierało mi się trochę różnych procedur i funkcji wyliczających różne rzeczy astro, od efemeryd ciał niebieskich po ich pozycje na niebie, wysokość, azymut itp.  90% tych procedur powstało w zamierzchłych czasach, jeszcze w latach 90 ubiegłego wieku na podstawie książki Jean Meeus'a "Astronomical Algorithms" (mam wydanie I), która do dzisiaj stanowi rodzaj biblii w rachunkach astronomicznych. Procedury powstały pierwotnie w Pascalu, potem zostały przerobione na C/C++ a ostatnio przerabiam je na Pythona bo to język działający tak samo pod Linuxem, Windows czy Mac OS.

 

Zachęcam do opublikowania tego również na GitHubie (w tym wspomnianych starych wersji) — ludziom będzie wygodniej przeglądać/klonować, a i więcej zainteresowanych można złapać.

  • Lubię 2
Odnośnik do komentarza
Udostępnij na innych stronach

3 godziny temu, Wiesiek1952 napisał:

Obecnie w życiu codziennym używamy kalendarza gregoriańskiego ale w obliczeniach astro dalej króluje kalendarz juliański.

Kalendarz juliański nie ma nic wspólnego z dniem juliańskim poza zbieżnością nazw. Nazwa pierwszego pochodzi Juliusza Cezara, drugiego od Juliusa Scaligera. JD to po prostu liniowa miara czasu liczona w dniach, gdzie każdy dzień jest zdefiniowany jako dokładnie 86400 sekund.

Sam Meeus pisze o tym w książce (przypis na stronie 59 w wydaniu z roku 1991): "The JD has nothing to do with the Julian calendar"

Edytowane przez bartoszw
Odnośnik do komentarza
Udostępnij na innych stronach

56 minut temu, bartoszw napisał:

Kalendarz juliański nie ma nic wspólnego z dniem juliańskim poza zbieżnością nazw. Nazwa pierwszego pochodzi Juliusza Cezara, drugiego od Juliusa Scaligera. JD to po prostu liniowa miara czasu liczona w dniach, gdzie każdy dzień jest zdefiniowany jako dokładnie 86400 sekund.

Sam Meeus pisze o tym w książce (przypis na stronie 59 w wydaniu z roku 1991): "The JD has nothing to do with the Julian calendar"

 

Tak masz rację. Moje przeoczenie. Julian Day jest osobnym bytem bez odniesienia do kalendarza juliańskiego choć musi sobie radzić z reformą Papieża Grzegorza :yes:

 

EDIT: Widzę, że mamy to samo wydanie - te książki mają Serial Number - mój egzemplarz 040329 :-)

 

Edytowane przez Wiesiek1952
Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.