Просмотр полной версии : Продолжительность полярной ночи?
Возвращаясь к теме о высоте солнца над горизонтом images/smiles/icon_wink.gif А есть простая формула продолжительности полярной ночи (а заодно уж и дня) в зависимости от широты и наклона оси планеты? Большая точность не нужна, нужна грубая прикидка.
задали задачку images/smiles/icon_smile.gif
Вот вам простые формулы (проще по-моему некуда) - в результате получите номера дней в году, когда начинается и заканчивается полярные день и ночь, отнимите одно от другого - будет продолжительность дня и ночи:
fi-широта, e-наклон эклиптики к экватору, koeff=365/360 (365 потому что столько дней в году (я надеюсь, мы Землю рассматриваем images/smiles/icon_wink.gif, а 360 потому что столько градусов на эклиптике)), хотя этот коэффициент можно и убрать, он мал; все арксинусы в градусах.
Полярный день: N_polarday_begin=koeff*ARCSIN(COS(fi)/SIN(e))+82
(82 потому что это номер дня равноденствия в году)
N_polarday_end=koeff*(180-ARCSIN(COS(fi)/SIN(e))+82
Полярная ночь:
N_polarnight_begin=koeff*(180+ARCSIN(COS(fi)/SIN(e))+82
N_polarnight_end=-koeff*ARCSIN(COS(fi)/SIN(e))+82
Для fi=90 (Северный полюс) день длится с 82 по 264 день, ночь соотвественно с 264 по 82, ну а чем поюжнее, тем это счастье короче.
Ах да, наклон оси нужен... если к эклиптике, то замените e на 90-i.
а если еще проще, то продолжительность полярного дня (как и ночи, они равны):
Long_of_day=2*koef*ARCCOS(COS(fi)/SIN(e))
Спасибо. Рассматриваем, естес-но, не Землю, кому она нужна images/smiles/icon_wink.gif Если быть совсем точным - Землю, но не нашу images/smiles/icon_wink.gif Ну да 391 вместо 365 подставить не проблема.
Для полюса (в случае Земли) ошибка по сравнению со справочником получается значительная - реально день длиннее ночи на 12 дней (оно и понятно, ночь наступает, когда диск уходит на горизонт полностью, а не до середины - или тут еще и рефракции потоптались?) Но, очевидно, с уменьшением широты и ростом крутизны солнечной трактории эта ошибка будет уменьшаться, так что для моих целей сойдет.
Земля и 391 день.. так и хочется чего-нибудь забацать, типа:
На 156-ой день наконец-то наступило сизое полярное утро... Два нереяшливых птеродактиля, сидя на замшелом карнизе Ледяной Башни, пристально наблюдали за двумя озабоченными гоблинами, которые...
Не угадали, это не фэнтези, это вполне классическая НФ images/smiles/icon_wink.gif Птеродактилей там нет, зато есть крупные морские ящеры, правда, в тропических широтах. Кстати, ежели кому надо - вот программка:
#include <stdio.h>
#include <math.h>
float year,e;
#define koeff year/360
#define pi 3.14159265358
int fi,night;
double gr2rad(double g)
{return pi*g/180;}
double rad2gr(double r)
{return 180*r/pi;}
int round(double x)
{return x>0?(int)x+0.5 images/smiles/icon_sad.gifint)x-0.5;}
int daynight()
{double c=cos(gr2rad(fi))/cos(gr2rad(e));
if (c>1) return 0;
night=koeff*2*rad2gr(acos(c));
return printf("\nНа широте %d - %d",fi,round(night));
}
void main()
{printf("Число дней в году и наклон оси?");
scanf("%g %g",&year,&e);
for (fi=90;daynight();fi--);}
Тьфу, зараза. Смайлики ей в программном коде поискать захотелось... Вот:
#include <stdio.h>
#include <math.h>
float year,e;
#define koeff year/360
#define pi 3.14159265358
int fi,night;
double gr2rad(double g)
{return pi*g/180;}
double rad2gr(double r)
{return 180*r/pi;}
int round(double x)
{return x>0?(int)x+0.5:(int)x-0.5;}
int daynight()
{double c=cos(gr2rad(fi))/cos(gr2rad(e));
if (c>1) return 0;
night=koeff*2*rad2gr(acos(c));
return printf("\nНа широте %d - %d",fi,round(night));
}
void main()
{printf("Число дней в году и наклон оси?");
scanf("%g %g",&year,&e);
for (fi=90;daynight();fi--);}
vBulletin® v3.8.4, Copyright ©2000-2016, Jelsoft Enterprises Ltd. Перевод: zCarot