Позиция Солнца, уравнение времени: WRONG BY 27 DAYS

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

Но почему-то уравнение времени отключается на 27 дней. Может быть, кто-то здесь может понять, что случилось?

Тестовый забег:

1) Failure:
test_equation_of_time(TestSolarCalculations):
Expected 2011-10-01 10:23:00 UTC, not 2011-10-28 10:59:31 UTC.

2) Failure:
test_suns_declination(TestSolarCalculations):
Expected -3.18, not -3.2087920449753007.

Новый алгоритм:

# Constants for J2000.0/1 Jan 2000 12:00Z:
#
EPOCHS_JULIAN_DATE = 2451545
ANOMALISTIC_YEAR_IN_DAYS = 365.259636
TROPICAL_YEAR_IN_DAYS = 365.2421897
SUNS_MEAN_ANOMALY_AT_EPOCH = degrees_to_radians 357.5291
SUNS_MEAN_LONGITUDE_AT_EPOCH = degrees_to_radians 280.459
SUNS_GEODETIC_PRECESSION = degrees_to_radians 1.915
EARTHS_ORBITAL_ECCENTRICITY = 0.020
EARTHS_ADJUSTED_AVERAGE_RADIUS_IN_AU = 1.00014
EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION = degrees_to_radians 0.01671
EARTHS_ECLIPTIC_MEAN_OBLIQUITY = degrees_to_radians 23.439
EARTHS_ECLIPTIC_OBLIQUITY_CHANGE_RATE = degrees_to_radians 0.00000036

def days_from_epoch
  @todays_julian_date - EPOCHS_JULIAN_DATE
end

def suns_daily_mean_anomaly_change_rate
  degrees_to_radians(360/ANOMALISTIC_YEAR_IN_DAYS)
end

def suns_mean_anomaly
  SUNS_MEAN_ANOMALY_AT_EPOCH + suns_daily_mean_anomaly_change_rate * days_from_epoch
end

def suns_daily_mean_longitude_change_rate
  degrees_to_radians(360/TROPICAL_YEAR_IN_DAYS)
end

def suns_mean_longitude
  SUNS_MEAN_LONGITUDE_AT_EPOCH + suns_daily_mean_longitude_change_rate * days_from_epoch
end

def suns_apparent_ecliptic_longitude
  suns_mean_longitude + SUNS_GEODETIC_PRECESSION * sin(suns_mean_anomaly) + EARTHS_ORBITAL_ECCENTRICITY * sin(2 * suns_mean_anomaly)
end

def suns_distance_from_earth_in_au
  EARTHS_ADJUSTED_AVERAGE_RADIUS_IN_AU - EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION * cos(suns_mean_anomaly) - (EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION ^ 2/2) * cos(2 * suns_mean_anomaly)
end

def earths_ecliptic_mean_obliquity
  EARTHS_ECLIPTIC_MEAN_OBLIQUITY - EARTHS_ECLIPTIC_OBLIQUITY_CHANGE_RATE * days_from_epoch
end

def suns_right_ascension
  atan2(cos(suns_apparent_ecliptic_longitude) * sin(suns_apparent_ecliptic_longitude), cos(suns_apparent_ecliptic_longitude))/15
end

# Time.utc(Time.now.year) => 2011-01-01 00:00:00 UTC
#
def equation_of_time
  Time.utc(Time.now.year) + (radians_to_degrees(suns_mean_longitude)/15 - suns_right_ascension) * 60 * 60 * 24
end

def suns_declination
  radians_to_degrees(asin(sin(earths_ecliptic_mean_obliquity) * sin(suns_apparent_ecliptic_longitude)))
end

Благодаря!

Коврики

1
Не могли бы вы опубликовать старый код, который (я полагаю) работает?
добавлено автор Beta, источник
@ ja72: выглядит как Ruby.
добавлено автор Mechanical snail, источник
Пожалуйста, отметьте используемый язык и рассмотрите возможность перехода на codereview.stackexchange.com .
добавлено автор ja72, источник
@ ja72 codereview для рабочего кода, не так ли?
добавлено автор AakashM, источник
Я думаю, что ваш код каким-то образом смешался: значение эксцентриситета земли составляет 0,01671 (см. Википедию). Вы используете точное значение для атмосферной рефракции и преобразуете его из градусов в радианы. Это чепуха.
добавлено автор Curd, источник
@ ja72: Это не вопрос Ruby.
добавлено автор Molvær, источник

3 ответы

Некоторые из моего кода.

# From angles.rb:
# eccentricity of elliptical Earth orbit around Sun # Horner calculation method def eccentricity_Earth( ta = A2000 ) ta = check_jct_zero( ta ) # 0.016708617 - ta[ 0 ] * ( 0.000042037 + ta[ 0 ] * 0.0000001235 ) [-0.0000001235, -0.000042037, 0.016708617].inject(0.0) {|p, a| p * ta[0] + a} end alias_method :eccentricity_earth_orbit, :eccentricity_Earth

From: Equation of Time ruby gem

Где он используется?

# From angles.rb:
# equation of centre # added to mean anomaly to get true anomaly. def center( ta = A2000) ta = check_jct_zero( ta ) sine_1M = sin( 1.0 * deg_to_rad( @ma ) ) sine_2M = sin( 2.0 * deg_to_rad( @ma ) ) sine_3M = sin( 3.0 * deg_to_rad( @ma ) ) sine_4M = sin( 4.0 * deg_to_rad( @ma ) ) sine_5M = sin( 5.0 * deg_to_rad( @ma ) ) e = eccentricity_Earth( ta ) rad_to_deg( sine_1M * ( 2.0 * e - e**3/4.0 + 5/96.0 * e**5 ) + sine_2M * ( 5/4.0 * e**2 - 11/24.0 * e**4 ) + sine_3M * ( 13/12.0 * e**3 - 43/64.0 * e**5 ) + sine_4M * 103/96.0 * e**4 + sine_5M * 1097/960.0 * e**5 ) # sine_1M *( 1.914602 - ta[ 0 ] * ( 0.004817 + ta[ 0 ] * 0.000014 )) + # sine_2M *( 0.019993 - ta[ 0 ] * 0.000101 ) + # sine_3M * 0.000289 end alias_method :equation_of_center, :center
1
добавлено

Вот:

def suns_apparent_ecliptic_longitude
  suns_mean_longitude 
  + SUNS_GEODETIC_PRECESSION * sin(suns_mean_anomaly) 
  + EARTHS_ORBITAL_ECCENTRICITY * sin(2 * suns_mean_anomaly)
end

вы смешиваете устройства. suns_mean_longitude is radians, as is SUNS_GEODETIC_PRECESSION (и, следовательно, поэтому это второй термин), но EARTHS_ORBITAL_ECCENTRICITY является 0.020 < сильный> градусов .

Дополнительно:

EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION = degrees_to_radians 0.01671

должно быть просто

EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION = 0.01671

Я думаю, так как это используется в формуле, которая определяет расстояние .

Кроме того,

def suns_right_ascension
  atan2(cos(suns_apparent_ecliptic_longitude) * sin(suns_apparent_ecliptic_longitude), cos(suns_apparent_ecliptic_longitude))/15
end

Я не проверял, какие единицы возвращает эта функция atan2 - вы уверены, что это градусы, которые должны были бы быть для того, чтобы делить на 15, чтобы иметь смысл?

Могут быть и другие проблемы; это только те, которые я вижу.

1
добавлено
Верный! ruby-doc.org/core-1.9.3/Math.html#method-c-atan2 Когда диапазон возврата выражается как значения PI, тогда убедитесь, что они находятся в радианах. Рассмотрите возможность использования этого типа формулы: y0 = sine_al_Sun (ta) * cosine_to_Earth (ta) al is suns_apparent_ecliptic_longitude и истинная наклонность не долгота. Это угол наклона Земли по отношению к небесному полюсу. 180.0 + rad_to_deg (atan2 (-y0, -cosine_al_Sun (ta))) Это поможет сохранить возвращаемое значение в правильном диапазоне. Как сказал мужчина, не смешивайте яблоки с апельсинами. град рад
добавлено автор Douglas G. Allen, источник

May be it is an issue with the precision of ruby floating point numbers, not an issue with your program's logic? I haven't used ruby, but it seems there are some issues in ruby floating point operations exists according to thisposts. Issue with precision of ruby math operations

Согласно сообщению, вам может понадобиться использовать класс BigDecimal для операций с плавающей запятой. Я на самом деле не прошел вашу программу, это просто предположение.

0
добавлено
Infernal Math
Infernal Math
389 участник(ов)

http://www.zepta.ru/index.php?title=Заглавная_страница Приглашение в чат: https://t.me/matheden

comput.math
comput.math
289 участник(ов)

Прикладная математика и численные методы. Без оффтопа, рекламы, флуда. Вышмат: @higher_math Физика: @physpub Новичкам: @starter_math @JuliaLanguage @rlang_ru Книги брать здесь: libgen.io И по хештегу #book

higher.math
higher.math
234 участник(ов)

Higher mathematics / высшая математика Подборка книжек: https://ru.stackoverflow.com/a/683632/1084 Вычмат: @comput_math Физика: @physpub LaTeX: @pro_latex

Physics Pub
Physics Pub
229 участник(ов)

Физика, школьная физика Книги: @physpublib Оффтоп: @phystalks Вышмат: @higher_math Infernal Math: @matheden Вычмат: @comput_math Латех: @pro_latex Описание стикеров: http://telegra.ph/Perevod-paka-stikerov-Keyne-Physic-07-01

Starter Math
Starter Math
79 участник(ов)

Для тех, кто боится спросить в @higher_math Вычмат: @comput_math Физика: @physpub

Physics Talks
Physics Talks
37 участник(ов)

Всё дозволено, но школьникам сюда нельзя! (Разве что школьницам и Pythoner-у)