Mond / Mondphasenalgorithmus

Kennt jemand einen Algorithmus, um entweder die Mondphase oder das Alter auf ein bestimmtes Datum zu berechnen oder die Daten für neue / Vollmonde in einem bestimmten Jahr zu finden?

Googeln sagt mir, dass die Antwort in irgendeinem Astronomiebuch ist, aber ich möchte nicht wirklich ein ganzes Buch kaufen, wenn ich nur eine einzige Seite benötige.

Aktualisieren:

Ich hätte meine Aussage über das Gehen ein wenig besser qualifizieren müssen. Ich habe Lösungen gefunden, die nur über eine Teilzeit der Zeit (wie die 1900's) gearbeitet haben; Und die Trig-basierten Lösungen, die mehr rechnerisch teurer wäre, als ich möchte.

S Lott in seinem Python-Buch hat mehrere Algorithmen für die Berechnung von Ostern auf einem bestimmten Jahr, die meisten sind weniger als zehn Zeilen Code und einige Arbeit für alle Tage im Gregorianischen Kalender. Die Suche nach dem Vollmond im März ist ein wichtiges Stück der Suche nach Ostern, so dass ich dachte, es sollte ein Algorithmus, der nicht braucht und arbeitet für alle Termine in der gregorianischen Kalender.

  • Python check string enthält alle Zeichen
  • Sortieren Sie eine Teilmenge einer Python-Liste, um die gleiche relative Reihenfolge wie in einer anderen Liste zu haben
  • Teilauftragssortierung?
  • Generierung aller 5 Karten Poker Hände
  • Gibt die Teilmengen eines Satzes in Python
  • Python gewichtet zufällig [doppelte]
  • 8 Solutions collect form web for “Mond / Mondphasenalgorithmus”

    Ich habe einige Code zu Python für diese eine Weile zurück portiert. Ich wollte nur damit verknüpfen, aber es stellte sich heraus, dass es in der Zwischenzeit aus dem Internet fiel, also musste ich es ablegen und es wieder hochladen. Siehe moon.py, die von John Walkers Moontool abgeleitet ist .

    Ich kann nicht finden, eine Referenz für diese für welche Zeit spannt es ist genau für entweder, aber scheint, wie die Autoren waren ziemlich rigoros. Was bedeutet ja, es benutzt Trig, aber ich kann mir nicht vorstellen, was zum Teufel du damit benutzt hättest, das würde es rechnerisch unerschwinglich machen. Python-Funktion Aufruf Overhead ist wahrscheinlich mehr als die Kosten der Trig-Operationen. Computer sind ziemlich schnell beim Rechnen.

    Die im Code verwendeten Algorithmen werden aus folgenden Quellen abgeleitet:

    Meeus, Jean. Astronomische Algorithmen. Richmond: Willmann-Bell, 1991. ISBN 0-943396-35-2.

    Ein Must-have; Wenn Sie nur ein Buch kaufen, stellen Sie sicher, dass es dieses ist. Algorithmen werden mathematisch dargestellt, nicht als Computerprogramme, sondern Quellcode, der viele der Algorithmen im Buch implementiert, kann separat vom Verlag entweder in QuickBasic, Turbo Pascal oder C. bestellt werden. Meeus bietet viele bearbeitete Beispiele für Berechnungen, die für das Debugging unerlässlich sind Ihr Code, und stellt häufig mehrere Algorithmen mit verschiedenen Kompromissen zwischen Genauigkeit, Geschwindigkeit, Komplexität und langfristige (Jahrhundert und Jahrtausende) Gültigkeit.

    Duffett-Smith, Peter. Praktische Astronomie mit Ihrem Rechner. 3. Aufl. Cambridge: Cambridge University Press, 1981. ISBN 0-521-28411-2.

    Trotz des Wortes Rechner im Titel; Dies ist eine wertvolle Referenz, wenn Sie daran interessiert sind, Software zu entwickeln, die Planetenpositionen, Umlaufbahnen, Finsternisse und dergleichen berechnet. Mehr Hintergrundinformationen sind gegeben als in Meeus, der denjenigen hilft, die noch nicht in der Astronomie vertraut sind, lernen die oft verwirrende Terminologie. Die Algorithmen sind einfacher und weniger genau als die von Meeus vorgesehen, sind aber für die meisten praktischen Arbeiten geeignet.

    Wenn du wie ich bist, versuchst du, ein vorsichtiger Programmierer zu sein. So macht es Sie nervös, wenn Sie zufälligen Code über das Internet verstreut sehen, dass ein komplexes astronomisches Problem zu lösen, aber nicht erklären, warum die Lösung richtig ist.

    Sie glauben, dass es maßgebliche Quellen wie Bücher geben muss, die sorgfältige und vollständige Lösungen enthalten. Zum Beispiel:

    Meeus, Jean. Astronomische Algorithmen. Richmond: Willmann-Bell, 1991. ISBN 0-943396-35-2.

    Duffett-Smith, Peter. Praktische Astronomie mit Ihrem Rechner. 3. Aufl. Cambridge: Cambridge University Press, 1981. ISBN 0-521-28411-2.

    Sie vertrauen auf weit verbreitete, gut getestete Open-Source-Bibliotheken, die ihre Fehler korrigiert haben können (im Gegensatz zu statischen Webseiten). Hier ist dann eine Python-Lösung für Ihre Frage, die auf der PyEphem- Bibliothek basiert und die Phasen der Mondschnittstelle verwendet.

    #!/usr/bin/python import datetime import ephem def get_phase_on_day(year,month,day): """Returns a floating-point number from 0-1. where 0=new, 0.5=full, 1=new""" #Ephem stores its date numbers as floating points, which the following uses #to conveniently extract the percent time between one new moon and the next #This corresponds (somewhat roughly) to the phase of the moon. #Use Year, Month, Day as arguments date=ephem.Date(datetime.date(year,month,day)) nnm = ephem.next_new_moon (date) pnm = ephem.previous_new_moon(date) lunation=(date-pnm)/(nnm-pnm) #Note that there is a ephem.Moon().phase() command, but this returns the #percentage of the moon which is illuminated. This is not really what we want. return lunation def get_moons_in_year(year): """Returns a list of the full and new moons in a year. The list contains tuples of either the form (DATE,'full') or the form (DATE,'new')""" moons=[] date=ephem.Date(datetime.date(year,01,01)) while date.datetime().year==year: date=ephem.next_full_moon(date) moons.append( (date,'full') ) date=ephem.Date(datetime.date(year,01,01)) while date.datetime().year==year: date=ephem.next_new_moon(date) moons.append( (date,'new') ) #Note that previous_first_quarter_moon() and previous_last_quarter_moon() #are also methods moons.sort(key=lambda x: x[0]) return moons print get_phase_on_day(2013,1,1) print get_moons_in_year(2013) 

    Das kommt zurück

     0.632652265318 [(2013/1/11 19:43:37, 'new'), (2013/1/27 04:38:22, 'full'), (2013/2/10 07:20:06, 'new'), (2013/2/25 20:26:03, 'full'), (2013/3/11 19:51:00, 'new'), (2013/3/27 09:27:18, 'full'), (2013/4/10 09:35:17, 'new'), (2013/4/25 19:57:06, 'full'), (2013/5/10 00:28:22, 'new'), (2013/5/25 04:24:55, 'full'), (2013/6/8 15:56:19, 'new'), (2013/6/23 11:32:15, 'full'), (2013/7/8 07:14:16, 'new'), (2013/7/22 18:15:31, 'full'), (2013/8/6 21:50:40, 'new'), (2013/8/21 01:44:35, 'full'), (2013/9/5 11:36:07, 'new'), (2013/9/19 11:12:49, 'full'), (2013/10/5 00:34:31, 'new'), (2013/10/18 23:37:39, 'full'), (2013/11/3 12:49:57, 'new'), (2013/11/17 15:15:44, 'full'), (2013/12/3 00:22:22, 'new'), (2013/12/17 09:28:05, 'full'), (2014/1/1 11:14:10, 'new'), (2014/1/16 04:52:10, 'full')] 

    Auch pyephem – wissenschaftlich-grade astronomy routines [ PyPI ], die ein Python-Paket ist aber hat die computational Eingeweide in C , und das sagt

    Präzision <0,05 "von -1369 bis +2950.
    Verwendet Tabellen-Lookup-Techniken, um Anrufe auf trigonometrische Funktionen zu begrenzen.

    Pyephem standardmäßig verwendet koordinierte universelle (UTC) Zeit. Ich wollte ein Programm, das eine Liste von Vollmonden erzeugen würde, die in der pazifischen Zeitzone genau sein würden. Der untenstehende Code berechnet die Vollmonde für ein bestimmtes Jahr und passt dann mit der Methode ephem.localtime () an, um die gewünschte Zeitzone zu kalibrieren. Es scheint auch richtig zu berücksichtigen, Sommerzeit zu sparen. Danke an Richard, dieser Code ist ähnlich dem, was er geschrieben hatte.

     #!/usr/bin/python import datetime import ephem import os import time # Set time zone to pacific os.environ['TZ'] = 'US/Pacific' time.tzset() print("Time zone calibrated to", os.environ['TZ']) def get_full_moons_in_year(year): """ Generate a list of full moons for a given year calibrated to the local time zone :param year: year to determine the list of full moons :return: list of dates as strings in the format YYYY-mm-dd """ moons = [] date = ephem.Date(datetime.date(year - 1, 12, 31)) end_date = ephem.Date(datetime.date(year + 1, 1, 1)) while date <= end_date: date = ephem.next_full_moon(date) # Convert the moon dates to the local time zone, add to list if moon date still falls in desired year local_date = ephem.localtime(date) if local_date.year == year: # Append the date as a string to the list for easier comparison later moons.append(local_date.strftime("%Y-%m-%d")) return moons moons = get_full_moons_in_year(2015) print(moons) 

    Der obige Code wird zurückgegeben:

     Time zone calibrated to US/Pacific ['2015-01-04', '2015-02-03', '2015-03-05', '2015-04-04', '2015-05-03', '2015-06-02', '2015-07-01', '2015-07-31', '2015-08-29', '2015-09-27', '2015-10-27', '2015-11-25', '2015-12-25'] 

    Ich weiß, dass du nach Python suchst, aber wenn du C # verstehen kannst, gibt es ein Open-Source-Projekt draußen namens Chronos XP, was das sehr gut macht.

    Ein schneller google enthüllte das .

    Wenn du keine hohe Genauigkeit brauchst, kannst du immer eine Mond- (oder lunisolare) Kalenderklasse (zB HijriCalendar oder ChineseLunisolarCalendar in Microsoft .NET) verwenden, um die (ungefähre) Mondphase eines jeden Datums zu berechnen, wie der Kalender "Tag des Monats", ein Mond (oder lunisolarer) Kalendertag, entspricht immer der Mondphase (zB Tag 1 ist der Neumond, Tag 15 ist der Vollmond usw.)

    Python ist die beste Programmiersprache der Welt.