Уравнение восхода солнца
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2018 г. ) |

Уравнение восхода или заката можно использовать для определения времени восхода или заката солнца для любого солнечного склонения и широты с точки зрения местного солнечного времени, когда фактически происходят восход и закат.
Формулировка
[ редактировать ]Он формулируется как:
где:
- — угол солнечного часа либо на восходе солнца (когда принимается отрицательное значение), либо на закате (когда принимается положительное значение);
- – широта наблюдателя на Земле ;
- Солнца это склонение .
Принципы
[ редактировать ]Земля . вращается с угловой скоростью 15°/час Следовательно, выражение , где в градусах, дает интервал времени в часах от восхода солнца до местного солнечного полудня или от местного солнечного полудня до заката .
Соглашение о знаках обычно заключается в том, что широта наблюдателя равно 0 на экваторе , положительно для северного полушария и отрицательно для южного полушария , а солнечное склонение равен 0 в дни весеннего и осеннего равноденствия , когда солнце находится точно над экватором, положительный летом в северном полушарии и отрицательный зимой в северном полушарии.
Выражение выше всегда применимо для широт между Полярным кругом и Южным полярным кругом . К северу от Полярного круга или к югу от Полярного круга есть по крайней мере один день в году без восхода и захода солнца. Формально, есть восход или закат, когда летом в Северном полушарии, и когда зимой в Северном полушарии. Для мест за пределами этих широт это либо 24-часовое дневное время , либо 24-часовое ночное время .
Выражения для солнечного часового угла
[ редактировать ]В уравнении, приведенном в начале, функция косинуса в левой части дает результаты в диапазоне [-1, 1], но значение выражения в правой части находится в диапазоне . Применимое выражение для в формате Фортрана 90 выглядит следующим образом:
omegao = acos(max(min(-tan(delta*rpd)*tan(phi*rpd), 1.0), -1.0))*dpr
где омегао градусах дельта в в градусах фи равно в градусах rpd равно , а dpr равен .
Вышеприведенное выражение дает результаты в степени в диапазоне . Когда , это означает, что сейчас полярная ночь или 0-часовой световой день; когда , это означает, что сейчас полярный день или 24-часовой световой день.
Отношение полушарий
[ редактировать ]Предполагать - заданная широта в северном полушарии, а — соответствующий угол восхода солнца, имеющий отрицательное значение, и аналогично находится на той же широте, но в южном полушарии, что означает , и — соответствующий угол часа восхода солнца, то очевидно, что
- ,
что означает
- .
Из приведенного выше соотношения следует, что в один и тот же день продолжительность дня от восхода до захода солнца в и сумма равна 24 часам, если , причем это касается и регионов, где бывают полярные дни и полярные ночи. Это также предполагает, что глобальная средняя продолжительность дневного времени в любой конкретный день составляет 12 часов без учета влияния атмосферной рефракции.
Обобщенное уравнение
[ редактировать ]
В приведенном выше уравнении не учитывается влияние атмосферной рефракции (которая поднимает солнечный диск — т. е. заставляет солнечный диск казаться выше в небе — примерно на 0,6°, когда он находится на горизонте) и ненулевой угол, образуемый солнечным диском — т. е. видимый диаметр Солнца — (около 0,5°). Время восхода и захода верхнего лимба Солнца, указанное в астрономических альманахах, корректирует это с помощью более общего уравнения
с углом высоты (а) центра солнечного диска, равным примерно -0,83 ° (или -50 угловых минут).
Приведенное выше общее уравнение можно также использовать для любой другой высоты Солнца. NOAA предоставляет дополнительные приблизительные выражения для поправок за рефракцию на этих других высотах. [1] Существуют также альтернативные формулировки, такие как некусочное выражение Г.Г. Беннета, используемое в «Программном обеспечении векторной астрономии» Военно-морской обсерватории США. [2]
Полный расчет на Земле
[ редактировать ]Обобщенное уравнение опирается на ряд других переменных, которые необходимо вычислить, прежде чем его можно будет вычислить самостоятельно. В этих уравнениях солнечно-земные константы заменены угловыми константами, выраженными в градусах.
Рассчитать текущий юлианский день
[ редактировать ]где:
- — количество дней с 12:00 1 января 2000 г.
- это юлианская дата ;
- 2451545.0 — это эквивалент юлианского года юлианским дням для 01 января 2000 г., 12:00:00.
- 0,0008 — это дробный юлианский день для високосных секунд и земного времени (TT).
- 1 января 1958 года TT было установлено на 32,184 секунды с отставанием от TAI. К 1972 году, когда была введена дополнительная секунда, были добавлены 10 секунд. К 1 января 2017 года было добавлено еще 27 секунд, что составило 69,184 секунды. 0,0008=69,184/86400 без DUT1 .
- The операция округляет до следующего целого числа дней n.
Среднее солнечное время
[ редактировать ]где:
- является аппроксимацией среднего солнечного времени в целом числе выражается в юлианских днях с дробью дня.
- – долгота (запад – отрицательная, восток – положительная) наблюдателя на Земле;
Средняя солнечная аномалия
[ редактировать ]где:
- M — средняя солнечная аномалия, используемая в следующих трех уравнениях.
Уравнение центра
[ редактировать ]где:
- C — это уравнение центрального значения, необходимое для расчета лямбды (см. следующее уравнение).
- 1,9148 — коэффициент уравнения центра планеты, на которой находится наблюдатель (в данном случае Земли).
Эклиптическая долгота
[ редактировать ]где:
- λ — эклиптическая долгота .
- 102,9372 — это значение аргумента перигелия .
Солнечный транзит
[ редактировать ]где:
- J- транзит — это юлианская дата местного истинного солнечного транзита (или солнечного полудня ).
- 2451545.0 — это полдень соответствующего юлианского года .
- представляет собой упрощенную версию уравнения времени . Коэффициенты представляют собой дробные дни.
Склонение Солнца
[ редактировать ]где:
Часовой угол
[ редактировать ]Это уравнение, приведенное выше, с поправками на атмосферную рефракцию и диаметр солнечного диска.
где:
- ω o — часовой угол наблюдателя от меридиана ;
- — северная широта наблюдателя (север положителен, юг отрицателен) на Земле.
Для наблюдений на морском горизонте, требующих поправки на высоту наблюдателя, добавьте , или до -0,833 ° в синусоидальном члене числителя. Это корректирует как видимое падение, так и земную рефракцию. Например, для наблюдателя на высоте 10 000 футов добавьте (-115°/60) или примерно от -1,92° до -0,833°. [4]
Рассчитать восход и заход солнца
[ редактировать ]где:
- Jrise — фактическая дата восхода солнца по юлианскому календарю;
- J set — это фактическая дата заката по юлианскому календарю.
Пример реализации на Python
[ редактировать ]#!/usr/bin/env python3
import logging
from datetime import datetime, timedelta, timezone, tzinfo
from math import acos, asin, ceil, cos, degrees, fmod, radians, sin, sqrt
from time import time
log = logging.getLogger()
def _ts2human(ts: int | float, debugtz: tzinfo | None) -> str:
return str(datetime.fromtimestamp(ts, debugtz))
def j2ts(j: float | int) -> float:
return (j - 2440587.5) * 86400
def ts2j(ts: float | int) -> float:
return ts / 86400.0 + 2440587.5
def _j2human(j: float | int, debugtz: tzinfo | None) -> str:
ts = j2ts(j)
return f'{ts} = {_ts2human(ts, debugtz)}'
def _deg2human(deg: float | int) -> str:
x = int(deg * 3600.0)
num = f'∠{deg:.3f}°'
rad = f'∠{radians(deg):.3f}rad'
human = f'∠{x // 3600}°{x // 60 % 60}′{x % 60}″'
return f'{rad} = {human} = {num}'
def calc(
current_timestamp: float,
f: float,
l_w: float,
elevation: float = 0.0,
*,
debugtz: tzinfo | None = None,
) -> tuple[float, float, None] | tuple[None, None, bool]:
log.debug(f'Latitude f = {_deg2human(f)}')
log.debug(f'Longitude l_w = {_deg2human(l_w)}')
log.debug(f'Now ts = {_ts2human(current_timestamp, debugtz)}')
J_date = ts2j(current_timestamp)
log.debug(f'Julian date j_date = {J_date:.3f} days')
# Julian day
# TODO: ceil ?
n = ceil(J_date - (2451545.0 + 0.0009) + 69.184 / 86400.0)
log.debug(f'Julian day n = {n:.3f} days')
# Mean solar time
J_ = n + 0.0009 - l_w / 360.0
log.debug(f'Mean solar time J_ = {J_:.9f} days')
# Solar mean anomaly
# M_degrees = 357.5291 + 0.98560028 * J_ # Same, but looks ugly
M_degrees = fmod(357.5291 + 0.98560028 * J_, 360)
M_radians = radians(M_degrees)
log.debug(f'Solar mean anomaly M = {_deg2human(M_degrees)}')
# Equation of the center
C_degrees = 1.9148 * sin(M_radians) + 0.02 * sin(2 * M_radians) + 0.0003 * sin(3 * M_radians)
# The difference for final program result is few milliseconds
# https://www.astrouw.edu.pl/~jskowron/pracownia/praca/sunspot_answerbook_expl/expl-4.html
# e = 0.01671
# C_degrees = \
# degrees(2 * e - (1 / 4) * e ** 3 + (5 / 96) * e ** 5) * sin(M_radians) \
# + degrees(5 / 4 * e ** 2 - (11 / 24) * e ** 4 + (17 / 192) * e ** 6) * sin(2 * M_radians) \
# + degrees(13 / 12 * e ** 3 - (43 / 64) * e ** 5) * sin(3 * M_radians) \
# + degrees((103 / 96) * e ** 4 - (451 / 480) * e ** 6) * sin(4 * M_radians) \
# + degrees((1097 / 960) * e ** 5) * sin(5 * M_radians) \
# + degrees((1223 / 960) * e ** 6) * sin(6 * M_radians)
log.debug(f'Equation of the center C = {_deg2human(C_degrees)}')
# Ecliptic longitude
# L_degrees = M_degrees + C_degrees + 180.0 + 102.9372 # Same, but looks ugly
L_degrees = fmod(M_degrees + C_degrees + 180.0 + 102.9372, 360)
log.debug(f'Ecliptic longitude L = {_deg2human(L_degrees)}')
Lambda_radians = radians(L_degrees)
# Solar transit (julian date)
J_transit = 2451545.0 + J_ + 0.0053 * sin(M_radians) - 0.0069 * sin(2 * Lambda_radians)
log.debug(f'Solar transit time J_trans = {_j2human(J_transit, debugtz)}')
# Declination of the Sun
sin_d = sin(Lambda_radians) * sin(radians(23.4397))
# cos_d = sqrt(1-sin_d**2) # exactly the same precision, but 1.5 times slower
cos_d = cos(asin(sin_d))
# Hour angle
some_cos = (sin(radians(-0.833 - 2.076 * sqrt(elevation) / 60.0)) - sin(radians(f)) * sin_d) / (cos(radians(f)) * cos_d)
try:
w0_radians = acos(some_cos)
except ValueError:
return None, None, some_cos > 0.0
w0_degrees = degrees(w0_radians) # 0...180
log.debug(f'Hour angle w0 = {_deg2human(w0_degrees)}')
j_rise = J_transit - w0_degrees / 360
j_set = J_transit + w0_degrees / 360
log.debug(f'Sunrise j_rise = {_j2human(j_rise, debugtz)}')
log.debug(f'Sunset j_set = {_j2human(j_set, debugtz)}')
log.debug(f'Day length {w0_degrees / (180 / 24):.3f} hours')
return j2ts(j_rise), j2ts(j_set), None
def main():
logging.basicConfig(level=logging.DEBUG)
latitude = 33.00801
longitude = 35.08794
elevation = 0
print(calc(time(), latitude, longitude, elevation, debugtz=timezone(timedelta(hours=3), 'fake-zone')))
if __name__ == '__main__':
main()
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ НОАА (Министерство торговли США). «Детали солнечного расчета» . Лаборатория глобального мониторинга ESRL – Глобальная радиация и аэрозоли .
- ^ «Таблицы поправок на высоту секстанта» . www.siranah.de .
- ^ «Информационный бюллетень о Земле» .
- ^ Точный источник этих цифр трудно отследить, но в «Записках о падении горизонта» содержится описание, дающее еще одну менее значимую цифру, а на другой странице серии указано -2,075.
Внешние ссылки
[ редактировать ]- Восход, закат или положение солнца для любого места — только для США.
- Восход, закат и продолжительность дня в любом месте – по всему миру
- Данные о подъеме/установке/транзите/сумерках – только для США.
- Астрономический информационный центр
- Преобразование между датами по юлианскому календарю и датами по григорианскому календарю
- Приблизительные солнечные координаты
- Алгоритмы расчета астрономических явлений
- Ответы астрономов: положение Солнца
- Простое выражение для уравнения времени
- Уравнение времени
- Уравнение времени
- Долгосрочный альманах Солнца, Луны и Полярной звезды V1.11
- Оценка эффективности современных моделей атмосферной рефракции при прогнозировании времени восхода и захода солнца