Jak si vypočítat fázi a pozici Měsíce na obloze

Technologie Jan Janča

Čas od času mi zavolá nějaký kamarád, který ví, že jsem část mládí strávil na brněnské hvězdárně, s dotazem, zdali bude večer vidět Měsíc, Venuše nebo jiná planeta, případně zdali byla pozorovatelná, když se narodil, což bych přece měl vědět, když jsem ten “astrolog”. Au. Nemám v hlavě astronomickou ročenku, takže dost často nevím, a tak ho odkážu na web nebo mobilní aplikaci. Po jednom z posledních dotazů, ten byl pro změnu na polohu Slunce, jsem si ale řekl, že by stálo za to ukázat vám základ toho, jak se tyhle věci počítají, a že programování je dobré také k něčemu jinému, než jen k přesouvání dat mezi tabulkami v databázi.

Na této stránce si můžete vypočítat fázi a polohu Měsíce na obloze pro určitý den, hodinu a polohu (třeba v Brně nebo Praze). Pro výpočty jsou použité zjednodušené algoritmy, které mohou vykazovat odchylky v řádech jednotek procent, takže bych podle nich nedoporučoval plánovat přistání na Měsíci. Nicméně pro orientaci bohatě stačí. Výpočet jsem popsal krok po kroku, a připojil jsem i zdrojové kódy některých algoritmů v Javascriptu.

Zadejte datum a čas, pro který chcete spočítat fáze Měsíce a jeho polohu.

Čas je potřeba zadat v greenwichském čase (GMT) což je čas v Londýně na nultém poledníku. Náš středoevropský čas je v zimě +1 hodina a v létě +2 hodiny. Víc o zimním a letním času se můžete dočíst na webu, který jsme připravili pro brněnskou hvězdárnu: https://www.stredoevropskycas.cz/.

Zadejte polohu, pro kterou chcete provést výpočet

Polohu zadávejte v desetinném formátu (defaultní hodnoty jsou nastavené pro Brno-Tuřany: N 49,153, E 16,689). Pro severní zeměpisnou šířku a východní délku zadávejte kladné hodnoty, pro jižní šířku (N +, S -) a západní délku záporné (E +, W -).

Výsledky výpočtu se zobrazí níže včetně popisu toho, co která hodnota znamená, a proč a jak se počítá.

Postup a výsledky výpočtů fází a polohy Měsíce včetně vizualizace

1. Vypočítáme juliánské datum:

Proč počítáme něco jako Juliánské datum? Protože lidstvo má strašný bordel v kalendářích, takže by astronomové museli neustále kontrolovat, jaký kalendář platil v té či oné zemi v době určitého úkazu. Juliánské datum je počet dní složených z 86 400 sekund, které uplynuly od poledne světového času (to je čas na nultém poledníku v Greenwichi, God save the Queen/King a nechť slunce nikdy nezapadá nad Britským impériem) dne 1. ledna roku 4713 př. n. l. podle Juliánského kalendáře. Nemusíme tedy řešit problém s juliánským, gregoriánským ani čínským datem, počítáme s juliánským datem, na které si naše datum převedeme pomocí docela jednoduchého algoritmu.

2. Upravíme julianské datum dle zeměpisné délky:

Julianské datum se mění spojitě se zeměpisnou délkou, takže pokud chceme vědět jaké u nás v Brně, musíme si ho přepočítat tak, že připočteme podíl zeměpisné délky a obvodu kruhu ve stupních, tedy 360.

3. Vypočítáme synodický měsíc:

Synodický měsíc je doba, za kterou Měsíc projde všemi fázemi, tedy od novu k úplňku a zase zpět k novu. Průměrně to trvá 29.53058868 dnů a s touhle hodnotou také počítám v použitém algoritmu. Ten si bere jako základ známé juliánské datum novu 6. 1. 2000. Hodnotě synodického měsíce se někdy říká stáří měsíce.

4. Určíme fázi Měsíce:

Aktuální fázi měsíce dělám schválně trošičku nepřesně, dobu trvání novu a úplňku jsem protáhl cca na 4 hodiny, i když v reálu jsou to diskrétní časové úseky.

5. Vypočítáme procento osvětlené plochy:

Jaká část plochy Měsíce je zrovna skutečně osvětlená je netriviální fyzikální i matematický úkol, ale pro zjednodušení jsem použil algoritmus s goniometrickou funkcí, který dává správné výsledky pro nov, úplněk i čtvrtky. Mezi tím úplně přesný není.

6. Vypočítáme východ a západ Měsíce pro daný den:

7. Vypočítáme polohu měsíce (výšku nad/pod obzorem a azimut):

Spočítat přesnou polohu Měsíce není sranda. Snažil jsem se implementovat zjednodušený algoritmus Jeana Meeuse, ale přesnost nebyla uspokojivá, takže jsem sáhl po prověřené knihovně SunCalc, kterou si můžete prostudovat na GITu. Její použití je veskrze triviální.

8. Nakreslíme fázi Měsíce:

Pozor. Vizualizace ukazuje fázi tak, jak je skutečně vidět ze severní a jižní polokouli. Z jižní polokoule je náš dorůstající měsíc pozorovatelný jako couvající, tedy zrcadlově. Je to proto, že osvětlení Měsíce Sluncem zůstává stejné, ale pozorovatel na jižní polokouli vidí Měsíc z obrácené perspektivy než pozorovatel na severní polokouli.

 
 
 

Zdrojové kódy použitých algoritmů v Javascriptu

Některé výpočty by bylo možné zjednodušit, ale pro názornost jsem je nechal v "rozloženém" stavu. Pozornému čtenáři tak například neunikne, že časová zóna se na zeměkouli posouvá co 15°.

Algoritmus pro výpočet juliánského data z gregoriánského

function gregorianDateToJulianDate(year, month, day, hour, min, sec) { let isGregorian = true; if (year < 1582 || (year == 1582 && (month < 10 || (month == 10 && day < 5)))) { isGregorian = false; } if (month < 3) { year = year - 1; month = month + 12; } let b = 0; if (isGregorian) { let a = INT(year / 100.0); b = 2 - a + INT(a / 4.0); } let jd = INT(365.25 * (year + 4716)) + INT(30.6001 * (month + 1)) + day + b - 1524.5; jd += hour / 24.0; jd += min / 24.0 / 60.0; jd += sec / 24.0 / 60.0 / 60.0; return jd; }

Algoritmus pro výpočet upraveného juliánského data dle zeměpisné délky

function adjustJDForLongitude(jd, longitude) { return jd + longitude / (15.0 * 24.0); }

Algoritmus pro výpočet synodického měsíce

function getMoonAge\(julianDate\) { // Průměrná délka lunárního měsíce \(od jednoho novu k dalšímu\)const synodicMonth = 29.53058868; const knownNewMoonDate = 2451550.1; let daysSinceKnownNewMoon = julianDate - knownNewMoonDate; return daysSinceKnownNewMoon % synodicMonth; }

Algoritmus pro výpočet fází Měsíce

function getMoonPhase(julianDate, latitude) { // Průměrná délka lunárního měsíce (od jednoho novu k dalšímu)const synodicMonth = 29.53058868; // Známé datum novu (v tomto případě 6. ledna 2000 byl známý nov)const knownNewMoonDate = 2451550.1; // Vypočte počet dnů od známého data novuconst daysSinceKnownNewMoon = julianDate - knownNewMoonDate; // Vypočte věk měsíce (fázi)const moonAge = daysSinceKnownNewMoon % synodicMonth; // Zjistí, zda jsme na jižní polokouliconst southernHemisphere = latitude < 0; if (moonAge < 0.2) { return southernHemisphere ? ["Nov"] : "Nov"; } //... (a podobně pro další řádky kódu) }

Algoritmus pro výpočet podílu osvětlené části Měsíce

function moonIlluminationP(moonAge) { const synodicMonth = 29.53058868; const illumination = (1 + Math.cos((2 * Math.PI * moonAge) / synodicMonth)) * 50; return illumination; }

Další informace o použitých algoritmech

Pro vizualizaci fází Měsíce jsem vykradl kód Pascala Thormeira, protože veškeré mé pokusy o vykreslení srpků byly neuskopojivé. Mersey et chapeau Pascal!.

Pro výpočet pozice Měsíce a jeho východů a západů jsem použil knihovnu SunCalc od Vladimira Agafonkina. I ona používá výše zmíněné astronomické algoritmy Jeana Meeuse.

Co si dále přečíst