La ecuación del amanecer o del atardecer se puede utilizar para derivar la hora del amanecer o del atardecer para cualquier declinación y latitud solar en términos de la hora solar local cuando realmente ocurren el amanecer y el atardecer.
Se formula así:
dónde:
La Tierra gira a una velocidad angular de 15°/hora. Por lo tanto, la expresión , donde está en grados, da el intervalo de tiempo en horas desde el amanecer hasta el mediodía solar local o desde el mediodía solar local hasta el atardecer .
La convención de signos suele ser que la latitud del observador es 0 en el ecuador , positiva para el hemisferio norte y negativa para el hemisferio sur , y la declinación solar es 0 en los equinoccios de primavera y otoño cuando el sol está exactamente sobre el ecuador, positiva durante el verano del hemisferio norte y negativa durante el invierno del hemisferio norte.
La expresión anterior siempre se aplica a latitudes entre el Círculo Polar Ártico y el Círculo Antártico . Al norte del Círculo Polar Ártico o al sur del Círculo Antártico, hay al menos un día del año sin salida ni puesta del sol. Formalmente, hay salida o puesta del sol cuando es verano en el hemisferio norte y cuando es invierno en el hemisferio norte. Para lugares fuera de estas latitudes, es 24 horas de día o 24 horas de noche .
En la ecuación dada al principio, la función coseno del lado izquierdo da resultados en el rango [-1, 1], pero el valor de la expresión del lado derecho está en el rango . Una expresión aplicable para en el formato de Fortran 90 es la siguiente:
omegao = acos(máx(mín(-tan(delta*rpd)*tan(phi*rpd), 1.0), -1.0))*dpr
donde omegao está en grados, delta está en grados, phi está en grados, rpd es igual a y dpr es igual a .
La expresión anterior da resultados en grados en el rango . Cuando , significa que es noche polar o luz diurna de 0 horas; cuando , significa que es día polar o luz diurna de 24 horas.
Supongamos que es una latitud dada en el hemisferio norte, y es el ángulo horario de salida del sol correspondiente que tiene un valor negativo, y de manera similar, es la misma latitud pero en el hemisferio sur, lo que significa , y es el ángulo horario de salida del sol correspondiente, entonces es evidente que
lo que significa
La relación anterior implica que, en un mismo día, la duración del día desde el amanecer hasta el atardecer en y suman 24 horas si , y esto también se aplica a las regiones donde se producen días y noches polares. Esto sugiere además que el promedio global de la duración del día en un día determinado es de 12 horas sin tener en cuenta el efecto de la refracción atmosférica.
La ecuación anterior no tiene en cuenta la influencia de la refracción atmosférica (que eleva el disco solar, es decir, hace que parezca más alto en el cielo, en aproximadamente 0,6° cuando está en el horizonte) ni el ángulo no nulo que forma el disco solar, es decir, el diámetro aparente del sol (aproximadamente 0,5°). Los tiempos de salida y puesta del limbo solar superior que se indican en los almanaques astronómicos corrigen este efecto utilizando la ecuación más general
con el ángulo de altitud (a) del centro del disco solar establecido en aproximadamente -0,83° (o -50 minutos de arco).
La ecuación general anterior también se puede utilizar para cualquier otra altitud solar. La NOAA proporciona expresiones aproximadas adicionales para las correcciones de refracción a estas otras altitudes. [1] También existen formulaciones alternativas, como una expresión no por partes de GG Bennett utilizada en el "Software de astronomía vectorial" del Observatorio Naval de los EE. UU. [2]
La ecuación generalizada depende de una serie de otras variables que deben calcularse antes de poder calcularse ella misma. En estas ecuaciones, las constantes solar-terrestres se sustituyen por constantes angulares expresadas en grados.
dónde:
dónde:
dónde:
dónde:
dónde:
dónde:
dónde:
Alternativamente, la declinación del Sol podría aproximarse [4] como:
dónde:
Esta es la ecuación de arriba con correcciones por la refracción atmosférica y el diámetro del disco solar.
dónde:
Para las observaciones en un horizonte marino que necesiten una corrección por elevación del observador, agregue , o a −0,833° en el término seno del numerador. Esto corrige tanto la inclinación aparente como la refracción terrestre. Por ejemplo, para un observador a 10 000 pies, agregue (−115°/60) o aproximadamente −1,92° a −0,833°. [5]
dónde:
#!/usr/bin/env python3importar registro desde datetime importar datetime , timedelta , timezone , tzinfo desde math importar acos , asin , ceil , cos , degrees , fmod , radianes , sen , sqrt desde time importar timelog = registro.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 ) * 86400def ts2j ( ts : float | int ) -> float : return ts / 86400.0 + 2440587.5def _j2human ( j : float | int , debugtz : tzinfo | Ninguno ) -> 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 '∠ { radianes ( deg ) : .3f } rad' humano = f '∠ { x // 3600 } ° { x // 60 % 60 } ′ { x % 60 } ″' return f ' { rad } = { humano } = { num } ' def calc ( marca_de_tiempo_actual : float , f : float , l_w : float , elevación : float = 0.0 , * , debugtz : tzinfo | None = None , ) -> tupla [ float , float , None ] | tupla [ None , None , bool ]: log . debug ( f 'Latitud f = { _deg2human ( f ) } ' ) log . debug ( f 'Longitud l_w = { _deg2human ( l_w ) } ' ) log . debug ( f 'Ahora ts = { _ts2human ( marca_de_tiempo_actual , debugtz ) } ' ) J_date = ts2j ( marca_de_tiempo_actual ) log . debug ( f 'Fecha juliana j_date = { J_date : .3f } días' ) # Día juliano # TODO: ceil ? n = ceil ( J_date - ( 2451545.0 + 0.0009 ) + 69.184 / 86400.0 ) log . debug ( f 'Día juliano n = { n : .3f } días' ) # Tiempo solar medio J_ = n + 0,0009 - l_w / 360,0 log . debug ( f 'Tiempo solar medio J_ = { J_ : .9f } días' ) # Anomalía media solar # M_grados = 357,5291 + 0,98560028 * J_ # Lo mismo, pero se ve feo M_grados = fmod ( 357,5291 + 0,98560028 * J_ , 360 ) M_radianes = radianes ( M_grados ) log . debug ( f 'Anomalía media solar M = { _deg2human ( M_grados ) } ' ) # Ecuación del centro C_grados = 1.9148 * sin ( M_radianes ) + 0.02 * sin ( 2 * M_radianes ) + 0.0003 * sin ( 3 * M_radianes ) # La diferencia para el resultado final del programa es de unos pocos milisegundos # https://www.astrouw.edu.pl/~jskowron/pracownia/praca/sunspot_answerbook_expl/expl-4.html # e = 0.01671 # C_grados = \ # grados(2 * e - (1 / 4) * e ** 3 + (5 / 96) * e ** 5) * sin(M_radianes) \ # + grados(5 / 4 * e ** 2 - (11 / 24) * e ** 4 + (17 / 192) * e ** 6) * sin(2 * M_radianes) \ # + grados(13 / 12 * e ** 3 - (43 / 64) * e ** 5) * sen(3 * M_radianes) \ # + grados((103 / 96) * e ** 4 - (451 / 480) * e ** 6) * sen(4 * M_radianes) \ # + grados((1097 / 960) * e ** 5) * sen(5 * M_radianes) \ # + grados((1223 / 960) * e ** 6) * sen(6 * M_radianes) log . debug ( f 'Ecuación del centro C = { _deg2human ( C_degrees ) } ' ) # Longitud eclíptica # L_degrees = M_degrees + C_degrees + 180.0 + 102.9372 # Lo mismo, pero se ve feo L_degrees = fmod ( M_degrees + C_degrees + 180.0 + 102.9372 , 360 ) log . debug ( f 'Longitud eclíptica L = { _deg2human ( L_degrees ) } ' ) Lambda_radianes = radianes ( L_grados ) # Tránsito solar (fecha juliana) J_transit = 2451545.0 + J_ + 0.0053 * sin ( M_radianes ) - 0.0069 * sin ( 2 * Lambda_radianes ) log . debug ( f 'Tiempo de tránsito solar J_trans = { _j2human ( J_transit , debugtz ) } ' ) # Declinación del Sol sin_d = sin ( Lambda_radians ) * sin ( radianes ( 23.4397 )) # cos_d = sqrt(1-sin_d**2) # exactamente la misma precisión, pero 1,5 veces más lento cos_d = cos ( asin ( sin_d )) # Ángulo horario some_cos = ( sin ( radianes ( - 0,833 - 2,076 * sqrt ( elevación ) / 60,0 )) - sin ( radianes ( f )) * sin_d ) / ( cos ( radianes ( f )) * cos_d ) intentar : w0_radianes = acos ( some_cos ) excepto ValueError : devolver None , None , some_cos > 0.0 w0_grados = grados ( w0_radianes ) # 0...180 log . debug ( f 'Ángulo horario w0 = { _deg2human ( w0_degrees ) } ' ) j_subida = J_tránsito - w0_grados / 360 j_establecimiento = J_tránsito + w0_grados / 360 log.debug ( f ' Amanecer j_rise = { _j2human ( j_rise , debugtz ) } ' ) log.debug ( f ' Atardecer j_set = { _j2human ( j_set , debugtz ) } ' ) log.debug ( f ' Duración del día { w0_degrees / ( 180 / 24 ) : .3f } horas ' ) devuelve j2ts ( j_rise ), j2ts ( j_set ), Ningunodef main (): logging.basicConfig ( level = logging.DEBUG ) latitude = 33.00801longitude = 35.08794highitude = 0print ( calc ( time ( ) ) , latitude , longitude , highitude , debugtz = timezone ( timedelta ( hours = 3 ) , ' fake-zone' ) ) ) si __nombre__ == '__main__' : principal ()