A A A A Автор Тема: Расчет гражданский сумерек  (Прочитано 12639 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Расчет гражданский сумерек
« : 13 Мая 2009 [10:35:59] »
У меня есть несколько вариантов расчета времени восхода/захода. Эти вычисления применяются в открытом проекте "Астротаймер" http://iopa4.narod.ru. Но эти расчеты, применительно к управлению освещением несколько неподходят. Лучше бы применить время гражданских сумерек, но как дополнить программу я не знаю. Уважаемые знатоки матемматики и астрономии подскажите пожалуйста. ???
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #1 : 13 Мая 2009 [19:01:19] »
Часовой угол t восхода/захода Солнца:
cos(t) = (-sin(po + R) - sin(Lat) * sin(Dec)) / cos(Lat) / cos(Dec)
Lat - широта места
Dec - склонение Солнца
po - рефракция на горизонте = 35'
R - радиус Солнца = 16'

Находим t.

cos(t + dt) = (sin (h) - sin(Lat)*sin(Dec) ) / cos(Lat) / cos(Dec)
h - высота Солнца (для гражданских сумерек h = -6)
dt - продолжительность сумерек

Находим t+dt = A
dt = |A - t|
Переводим dt из углов в часы (/15).

Здесь считается, что утренние и вечерние сумерки симметричны по времени внутри суток. На самом деле это не так, но погрешность меньше минуты.

Формулы работают при условии Dec >= 90 - Lat + h
Если условие не выполняется, то сумерки длятся всю ночь.

Источник: "Астрономический календарь. Постоянная часть."

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #2 : 13 Мая 2009 [23:52:57] »
Я так понимаю, здесь рассчитывается склонение солнца:
void PosOfSun(char ind)
{

  //      Фундаментальные константы
  //  (Van Flandern & Pulkkinen, 1979)
  L = 0.779072 + 0.00273790931 * T;
  G = 0.993126 + 0.0027377785 * T;
  L = L - Trunc(L);
  G = G - Trunc(G);
  L = L * P2;
  G = G * P2;
  V = 0.39785 * sin(L);
  V = V - 0.01000 * sin(L - G);
  V = V + 0.00333 * sin(L + G);
  V = V - 0.00021 * TT * sin(L);   
  U = 1 - 0.03349 * cos(G);
  U = U - 0.00014 * cos(2 * L);
  U = U + 0.00008 * cos(L);     
  S = -0.00010 - 0.04129 * sin(2 * L);
  S = S + 0.03211 * sin(G);
  S = S + 0.00104 * sin(2 * L - G);
  S = S - 0.00035 * sin(2 * L + G);
  S = S - 0.00008 * TT * sin(G);
  S = S / sqrt(U - V * V);
  aA[ind] = L + GetAtan();
  S = V / sqrt(U);
  aD[ind] = GetAtan();
}
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #3 : 14 Мая 2009 [00:01:35] »
Где:
Day - день;
Month - месяц;
Yaer - год;
Latitude - широта;
Longitude - долгота;
Watch - часовой пояс;
Возвращаемые параметры:
RuseTime - время восхода;
SetTime - время захода;
AzimutRuse - азимут восхода;
AzimutSet - азимут захода;
CalcSunPos - строка вида: 'Широта: ... Долгота: ... Зона: ... Дата: ../../..
Восход солнца в ..:.., азимут ...
Заход солнца в ..:.., азимут ...'.

Не могли бы Вы добавить ваши формулы в эту программу или хотя бы пометили, где вычисляется склонение.
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #4 : 14 Мая 2009 [04:29:50] »
Переписала я вашу программу на VB, чтобы хоть по цифирям понять, что и где вычисляется (у меня были сомнения, что это вообще работает,  очень уж замороченный алгоритм). Как ни странно, оно работает, но при условии, что вот здесь

L5:=-Longitude;
минуса нет. Там в принципе не должно быть минуса, если долгота точки наблюдения восточная, иначе звездное время вычисляется неверно, соответственно часовой угол тоже  (H0 := L0 - A0; в процедуре PossibleEvents это как  раз часовой угол в момент Hour, изумительно замороченная там интерполяция солнечной высоты  :o) и  высота Солнца неверная и как результат - момент восхода/захода совсем далеко от истины.
У вас правильно с минусом работает?  ???

Склонение Солнца на полночь даты вычисляется в процедуре PosOfSun:
   D5 := ArcTan(S / Sqrt(1 - S * S));
В цикле по переменной C0 (главный блок программы ) склонение интерполируется с шагом в час внутри суток
    D2 := aD[1] + P * DD;
Вычисление времени сумерек логично вставить в  процедуру PossibleEvents где-нибудь после
вычисления момента захода или восхода T3 := Hour + E + 1 / 120;

Дальше смесь Visual Basic и СИ, потому что СИ я не знаю, а чистый бейсик вы можете и не понять :)

If D0 >= Pi/2 - B5*DR - 6*DR then
  cost = (-sin(51/60*DR) - sin(B5*DR) * sin(D2)) / cos(B5*DR) / cos(D2)
  th = ArcTan(sqrt((1-cost*cost)/cost))
  var1 = (sin(-6*DR) - sin(B5*DR) * sin(D2)) / cos(B5*DR) / Cos(D2)
  A = ArcTan(sqrt((1-var1*var1)/var1))
  dt = abs(A-th)/DR/15  ' dt  в часах
else
  dt=0
end if


И дальше, когда уже определено начало строки st:

if st[1]='В' and dt <> 0 Then RuseTime= T3-dt
If st[1]='З' and dt<>0 Then SetTime= T3+dt

И разложить LightTime на часы&минуты - это и будет время начала гражданских сумерек (для восхода) или окончания (для захода Солнца).
« Последнее редактирование: 14 Мая 2009 [05:57:04] от Tau »

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #5 : 14 Мая 2009 [05:55:08] »
Ой, я прочла, что вы СИ не владеете  :(.
Прикрепляю файл - это ваш файл, я вставила туда дополнения и  знаками ==== ограничила куски которые нужно переписать на СИ и проверить. Я знаю, тут тусуются СИ-шные программисты, и это в пределах их возможностей.
В результате вместо времени восхода и захода будет выдаваться время начала утренних и окончания вечерних гражданских сумерек. Правда, как передать сообщение, что сумерки длятся всю ночь, - я не поняла.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #6 : 14 Мая 2009 [09:28:11] »
Огромное спасибо за быстрый ответ. Сейчас попытаюсь проверить.
P.S. Не беспокойтесь, я владею всеми компьютерными языками понемногу, в том числе и Визуал... Если у Вас будет возможность - не покидайте пока эту тему.
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #7 : 14 Мая 2009 [22:02:38] »
Извиняюсь Tau, но почему-то не выходит нужное время, сравниваюсь с сайтом http://www.astrotime.ru/sunrise.html . Может у Вас есть готовый код на любом языке? Исходные данные - широта, долгота, зона, ну и конечно же все, что касается даты и времени. Необходимо расчитать время сумерек с точностью +/- 5-10 минут. Чем проще и чем короче расчет, тем лучше - программа зашивается в память микроконтроллера - 8 кб. Конечно не сама программа, а откомпилированный машинный код, но кроме этой программы будет дописано куча всяких фишек(работа i2c, с ЖКИ индикатором, с часами реального времени, автоматический перевод на летнее/зимнее время и отслеживание пропадания сети. Проект уже сделан, работает, но немного не так, как хотелось бы. А "мой" файл - это кусок файла, выдранного из сети. Потом многочасовая доводка до рабочего состояния на МК. Изучение кучи астрономической литературы, которая мне не совсем ясна и в дальнейшем не пригодится. Я электронщик. Заранее благодарен.
С уважением Ю.Градов
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #8 : 14 Мая 2009 [22:07:47] »
Забыл приложить файл, который я уже поковырял:
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #9 : 14 Мая 2009 [22:45:46] »
Ааа, до этого, похоже, код был на Дельфях (или Паскале?), а вот теперь на СИ. Беседа начинает приобретать лингвистический характер  :).
ОК, посмотрю файл.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #10 : 14 Мая 2009 [23:34:36] »
Вот на Java, я и его пробовал применить, но они все как близнецы и братья. Все писали с друг друга.
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #11 : 15 Мая 2009 [07:21:16] »
Проще нового родить, чем этого отмыть
Посмотрите прицепленную программку на VB (exe внутри). Вся арифметика в module1.bas.
Может, найдете глюки :).
Примечания:
1) Формулы для сумерек, которую я тут цитировала, там нет, потому что эта формула не отрабатывает ситуацию, когда Солнце не восходит (Полярная ночь), но при этом гражданские сумерки имеют место быть.
2) Ваш часовой пояс 2, а не 3, декретное время я учла отдельно в силу своего занудства. Летнее время определяется само.
3) Сравнение с он-лайн калькулятором, ссылку на который вы дали, иногда очень забавно. Для случаев высоких широт в сезон наступления полярного дня в он-лайн калькуляторе солнце каждый день восходит, но так и не умудряется зайти. Получается логическая дырка - сегодня взошло, но не зашло, и завтра тоже взошло, хотя сегодня не заходило.
4) А вот насчет упрощения  - это может быть проблема. :( Надо думать.
« Последнее редактирование: 15 Мая 2009 [07:29:18] от Tau »

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #12 : 15 Мая 2009 [07:41:22] »
Tau, огромное спасибо!
Испытал Sumerki.exe - все великолепно. Даже не ожидал, что так быстро Вы напишите код. Код с ремарками и разобраться, думаю, будет не сложно. Жалко, что я уезжаю в отпуск и не успею доделать свой проект. Всего Вам самого доброго, спасибо за помощь. Успехов.
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #13 : 15 Мая 2009 [09:05:21] »
Уважаемая Тау созвездия Кита!
Практически переписал листинг на СИ, но вот засомневался. Такое изобилие переменных с плавающей запятой, по-моему, контроллеру будет не по зубам. Микроконтроллер - это маленький компьютер. Его возможности намного скромнее даже "Specrum". Помните такой был.
8 мгц процессор, 1 кб ОЗУ, 8 ПЗУ и 32 16-битных регистра (используются для временного хранения переменных).
Может у Вас есть более простой расчет. Вы владеете астрономией и математикой. На вскидку простое вычисление с точностью +/-10 мин. Для устройства это не принципиально.
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #14 : 15 Мая 2009 [13:04:20] »
В этом вся проблема: я никогда не пишу рабочие версии программ, только модельные  - для проверки алгоритмов, и в двойной точности себе никогда не отказываю :).
1. Заменила практически все double на single. И некоторые Integer на Byte.
2. Определила несколько публичных переменных (var1 и т.д., наверху в модуле). Этими переменными пользуются разные процедуры (если я не напутала, то пересекаться использования не должны), тем самым из процедур исчезло большинство локальных переменных, под которые тоже резервировалась память.
3. Убрала функции перевода в радианы и обратно, заменив их на коэффициент DR. так же убрала функцию mod2pi.
4. В процедурах арктангенса и арккосинуса убрала объявления констант (большие и малые числа).
5. Почистила все неиспользуемые переменные, которые остались после отладки.
6. Я подумаю, как сделать совсем просто. Но не сегодня.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #15 : 15 Мая 2009 [17:20:36] »
Спасибо - уже перевожу на СИ
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #16 : 17 Мая 2009 [00:33:19] »
Спасибо, в МК поместилось, но появились вопросы:
' Вычисление эклиптических и экваториальных к-т Солнца
Private Sub SunPoz(MD As Double, sun() As Double)
 Dim T0 As Double, m As Double, L As Double, UT As Double
 Dim eps As Double, hvect(3) As Double
 T0 = (Int(MD) - 51544.5) / 36525
 UT = (MD - Int(MD)) * 24
 m = mod2pi(357.528 + 35999.05 * T0 + 0.04107 * UT)
 L = 280.46 + 36000.772 * T0 + 0.04107 * UT
 L = mod2pi(L + (1.915 - 0.0048 * T0) * Sin(Deg_Rad(m)) + 0.02 * Sin(2 * Deg_Rad(m)))
 hvect(1) = Cos(Deg_Rad(L))
 hvect(2) = Sin(Deg_Rad(L))
 hvect(3) = 0
 eps = Deg_Rad(23.439281)
 sun(1) = hvect(1)
 sun(2) = hvect(2) * Cos(eps) - hvect(3) * Sin(eps)
 sun(3) = hvect(2) * Sin(eps) + hvect(3) * Cos(eps)
End Sub

hvect(3) = 0, тогда зачем? Или Вы, что-то упустили?
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #17 : 17 Мая 2009 [03:04:00] »
Так как hvect(3) для Солнца  равен 0, то он действительно не нужен. Это частный случай, а процедурку перевода координат я использовала и для других объектов, вот оно и осталось в общем виде. Прошу прощения :).
Неужели оно действительно поместилось и в таком виде? Для остальных ваших функциональных возможностей место осталось?
« Последнее редактирование: 17 Мая 2009 [03:19:36] от Tau »

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #18 : 17 Мая 2009 [12:41:42] »
Да, спасибо, весь код поместился и занял обьем около 50% памяти МК, остальной код обработки еще 25%. Итого 75%, но это не финал.
1. В конструкции используются часы реального времени на микросхеме, которые не учытывают переход на летнее время. Мне нужно связать ее с Вашим кодом.
2. В связи с тем, что у меня лицензия на компилятор не Pro - я не могу использовать переменные double, только float +- 1.17e38...3.402e38
3. Я не виртуал на языке СИ и некоторые переменные я не смог передать в фунцию(процедуру) и сделал их глобальными.
Вот теперь разбираюсь: откуда у меня появилась приличная ошибка. Не знаю, сильны ли Вы в СИ, но можете глянуть на листинг. Может сразу, что-то бросится в глаза. Ведь я только механический переводчик на СИ (типа PROMT), а мы все видели перевод этой программы (с английского на русский).
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #19 : 17 Мая 2009 [16:55:49] »
1. Из процедуры Angles_from_Vector обратно в процедуру main значения ra и dec не передаются. В языке С по умолчанию применяется  передача аргументов в функцию по значению (так утверждает толстенный справочник по С/С++), то есть в процедуре значения не изменяются. Нужно передать аргументы по ссылке. Вставила амперсанды и звездочки.
2. В TimeRise терялась точность при интерполировании. Какая интересная особенность у С: выражение типа integer/integer*float теряет циферки. Не любит С промежуточно делить  целое на целое и не терять при этом точность. Умножим integer на 1.0, пусть честно мучается.
3. В функции MJdata оператор % заменим на простое деление /. % - это деление по модулю, а С и так делит целые числа нацело.
4. SideralTime определен глобально, так что не нужно передавать его в функцию SunRise, но это мелочь. Убираем передачу аргумента.
5. Если функция sgn у вас нигде не используется - уберите ее.

Откомпиллировала под С++ (заставили вы все-таки меня изменить Бейсику на краткий миг  :'() .
У меня работает.
Отредактированный файл прицепляю.