Подтвердить что ты не робот

Лунный/Лунный фазовый алгоритм

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

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

Update:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Несмотря на слово Calculator в заголовке; это ценная ссылка, если вы заинтересованы в разработке программного обеспечения, которое вычисляет планетарные позиции, орбиты, затмения и т.п. Более подробная информация предоставляется, чем в Meeus, которая помогает тем, кто еще не разбирается в астрономии, изучать часто запутанную терминологию. Указанные алгоритмы более простые и менее точные, чем те, которые предоставляются Meeus, но подходят для большинства практических работ.

Ответ 3

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

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

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

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

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

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

Ответ 5

Pyephem по умолчанию использует скоординированное универсальное (UTC) время. Мне нужна была программа, которая создавала список полных лун, которые были бы точными в тихоокеанском часовом поясе. Приведенный ниже код рассчитает полные луны за данный год, а затем отрегулирует это, используя метод ephem.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']

Ответ 6

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

Ответ 7

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

Ответ 8

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