Алгоритм Фазы Луны / Луны

кто-нибудь знает алгоритм для расчета фазы Луны или возраста на заданную дату или найти даты для новых/полных лун в данном году?

Googling говорит мне, что ответ в какой-то астрономической книге, но я действительно не хочу покупать целую книгу, когда мне нужна только одна страница.

обновление:

Я должен был квалифицировать свое заявление о Гугле немного лучше. Я нашел решения, которые работали только в течение некоторого подмножества времени (например 1900-е); и тригонометрические решения, которые были бы более вычислительно дорогими, чем мне хотелось бы.

S Лотт в своей книге Python имеет несколько алгоритмов для расчета Пасхи на данный год, большинство из которых меньше десяти строк кода и некоторые работают на все дни в григорианском календаре. Найти полную луну в марте-это ключевой элемент поиска Пасхи, поэтому я решил, что должен быть алгоритм, который не требует тригонометрии и работает для всех дат в григорианском календаре.

8 ответов


некоторое время назад я портировал код на Python. Я собирался просто связать его, но оказалось, что он выпал из сети в то же время, поэтому мне пришлось пойти пыль и загрузить его снова. См.moon.py который является производным от Джон Уокер moontool.

Я не могу найти ссылку для этого, для каких промежутков времени это точно, но кажется, что авторы были довольно строгими. Это означает, что да, он использует trig, но я не могу себе представить какого черта вы бы использовали это для того, чтобы сделать его вычислительно запретительным. Накладные расходы на вызов функции Python, вероятно, больше, чем стоимость операций trig. Компьютеры довольно быстры в вычислениях.

алгоритмы, используемые в коде, взяты из следующих источников:

Meeus, Жан. Астрономические Алгоритмы. Richmond: Willmann-Bell, 1991. ISBN 0-943396-35-2.

должн-иметь; если вы только покупаете одну книгу, то убеждайтесь что она вот этот. Алгоритмы представлены математически, а не как компьютерные программы, но исходный код, реализующий многие из алгоритмов в книге, можно заказать отдельно от издателя в QuickBasic, Turbo Pascal или C. Meeus предоставляет множество проработанных примеров вычислений, которые необходимы для отладки вашего кода, и часто представляет несколько алгоритмов с различными компромиссами между точностью, скоростью, сложностью и долгосрочностью (век и тысячелетия) обоснованность.

Duffett-Смит, Питер. Практическая Астрономия С Калькулятором. 3-е изд. Cambridge: Cambridge University Press, 1981. ISBN 0-521-28411-2.

несмотря на слово калькулятор в названии; это ценная ссылка, Если вы заинтересованы в разработке программного обеспечения, которое вычисляет положения планет, орбиты, затмения и тому подобное. Больше справочной информации дается, чем в Meeus, который помогает тем, кто еще не разбирается в астрономии узнать часто-запутанная терминология. Приведенные алгоритмы проще и менее точны, чем те, которые предоставляет Meeus, но подходят для большинства практических работ.



Если вы похожи на меня, вы пытаетесь быть осторожным программистом. Поэтому вы нервничаете, когда видите случайный код, разбросанный по интернету, который призван решить сложную астрономическую проблему, но не объясняет, почему решение правильное.

Вы считаете, что там должны быть авторитетные источники, такие как - книги, которые содержат осторожны, и полные решения. Например:

Meeus, Жан. Астрономические Алгоритмы. Ричмонд: Willmann-Bell, 1991. ISBN 0-943396-35-2.

Duffett-Смит, Питер. Практическая Астрономия С Калькулятором. 3-е изд. Кембридж: Cambridge University Press, 1981. ISBN 0-521-28411-2.

Вы доверяете широко используемым, хорошо проверенным библиотекам с открытым исходным кодом, которые могут исправлять свои ошибки (в отличие от статических веб-страниц). Вот тогда решение на Python на ваш вопрос на основании PyEphem библиотеки этапы Луна!--16--> интерфейс.

#!/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)

возвращает

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')]

и pyephem-научные астрономические процедуры [PyPI], который является пакетом Python, но имеет вычислительные кишки в C и тут сказать

точность Использует методы поиска таблиц для ограничения вызовов тригонометрических функций.


Pyephem по умолчанию использует координированное универсальное (UTC) время. Мне нужна была программа, которая генерировала бы список полных лун, которые были бы точными в Тихоокеанском часовом поясе. Приведенный ниже код вычислит полные луны за данный год, а затем скорректирует это с помощью эфема.метод localtime () для калибровки в нужный часовой пояс. Он также, как представляется, правильно учитывать летнее время, а также. Спасибо Ричарду, этот код похож на то, что у него было написанный.

#!/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)

код выше будет возвращен:

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']

Я знаю, что вы ищете Python, но если вы можете понять C# ,есть проект с открытым исходным кодом под названием Chronos XP что делает это очень хорошо.


быстрый google показал этой.


Если вам не нужна высокая точность, вы всегда можете (ab)использовать лунный (или лунно-солнечный) класс календаря (например,HijriCalendar или ChineseLunisolarCalendar в Microsoft .NET), чтобы вычислить (приблизительную) фазу Луны любой даты, как свойство календаря "день месяца", являющееся лунным (или лунно-солнечным) календарным днем,всегда соответствует фазе Луны (например, День 1-новолуние,день 15-полнолуние и т. д.)