La ecuación de la salida del sol o la ecuación del atardecer se pueden utilizar para derivar la hora del amanecer o del atardecer para cualquier declinación y latitud solar en términos de hora solar local cuando realmente ocurren el amanecer y el atardecer.
Está formulado como:
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 la salida del sol hasta el mediodía solar local o desde el mediodía solar local hasta la puesta del sol .
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 encima del ecuador, positiva durante el verano del hemisferio norte y negativo durante el invierno del hemisferio norte.
La expresión anterior siempre es aplicable para 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 al año sin salida ni puesta de sol. Formalmente, hay un amanecer o un atardecer durante el verano del hemisferio norte y durante el invierno del hemisferio sur. Para ubicaciones fuera de estas latitudes, el horario es de 24 horas de día o de 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 en el formato de Fortran 90 es la siguiente:
omegao = acos(max(min(-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 día 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 el mismo día, la duración del día desde el amanecer hasta el atardecer a las y suman 24 horas si , y esto también se aplica a las regiones donde ocurren días polares 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 considerar el efecto de la refracción atmosférica.
La ecuación anterior ignora la influencia de la refracción atmosférica (que eleva el disco solar, es decir, hace que el disco solar parezca más alto en el cielo, aproximadamente 0,6° cuando está en el horizonte) y el ángulo distinto de cero subtendido por el disco solar. es decir, el diámetro aparente del sol (aproximadamente 0,5°). Los tiempos de salida y puesta del limbo solar superior, tal como figuran en los almanaques astronómicos, corrigen esto utilizando la ecuación más general.
con el ángulo de altitud (a) del centro del disco solar fijado 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 en estas otras altitudes. [1] También existen formulaciones alternativas, como una expresión no fragmentada de GG Bennett utilizada en el "Software de astronomía vectorial" del Observatorio Naval de EE. UU. [2]
La ecuación generalizada se basa en una serie de otras variables que deben calcularse antes de poder calcularse ella misma. Estas ecuaciones tienen las constantes solar-terrestres sustituidas por constantes angulares expresadas en grados.
dónde:
dónde:
dónde:
dónde:
dónde:
dónde:
dónde:
Esta es la ecuación anterior con correcciones por refracción atmosférica y diámetro del disco solar.
dónde:
Para observaciones en un horizonte marino que necesitan una corrección de la elevación del observador, agregue , o al −0,833° en el término del seno del numerador. Esto corrige tanto la inclinación aparente como la refracción terrestre. Por ejemplo, para un observador a 10.000 pies, sume (−115°/60) o aproximadamente −1,92° a −0,833°. [4]
dónde:
#!/usr/bin/env python3importar registro desde fecha y hora importar fecha y hora , timedelta , zona horaria , tzinfo desde matemáticas importar acos , asin , ceil , cos , grados , fmod , radianes , sin , sqrt desde hora importar horainiciar sesión = iniciar sesión . obtenerLogger ()def _ts2human ( ts : int | float , debugtz : tzinfo | Ninguno ) -> str : return str ( datetime . fromtimestamp ( ts , debugtz ))def j2ts ( j : flotante | int ) -> flotante : retorno ( j - 2440587.5 ) * 86400def ts2j ( ts : flotante | int ) -> flotante : devolver ts / 86400.0 + 2440587.5def _j2human ( j : float | int , debugtz : tzinfo | Ninguno ) -> str : ts = j2ts ( j ) return f ' { ts } = { _ts2human ( ts , debugtz ) } ' def _deg2human ( grados : float | int ) -> str : x = int ( grados * 3600.0 ) num = f '∠ { grados : .3f } °' rad = f '∠ { radianes ( grados ) : .3f } rad' humano = f '∠ { x // 3600 } ° { x // 60 % 60 } ′ { x % 60 } ″' return f ' { rad } = { humano } = { num } ' def calc ( marca_hora_actual : flotante , f : flotante , l_w : flotante , elevación : flotante = 0.0 , * , debugtz : tzinfo | Ninguno = Ninguno , ) -> tupla [ flotante , flotante , Ninguno ] | tupla [ Ninguno , Ninguno , bool ]: iniciar sesión . depuración ( f 'Latitud f = { _deg2human ( f ) } ' ) registro . depuración ( f 'Longitud l_w = { _deg2human ( l_w ) } ' ) registro . depurar ( f 'Ahora ts = { _ts2human ( current_timestamp , debugtz ) } ' ) J_date = ts2j ( actual_timestamp ) registro . depuración ( f 'fecha juliana j_date = { J_date : .3f } días' ) # Día juliano # TODO: ceil ? n = techo ( J_date - ( 2451545,0 + 0,0009 ) + 69,184 / 86400,0 ) registro . depuración ( f 'día juliano n = { n : .3f } días' ) # Tiempo solar medio J_ = n + 0,0009 - l_w / 360,0 log . depuración ( 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 . depuración ( 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) * sin(3 * M_radianes) \ # + grados ((103 / 96) * e ** 4 - (451/480) * e ** 6) * sin(4 * M_radianes) \ # + grados ((1097/960) * e ** 5) * sin (5 * M_radianes) \ # + grados ((1223 / 960) * e ** 6) * sin(6 * M_radianes) registro . debug ( f 'Ecuación del centro C = { _deg2human ( C_grados ) } ' ) # Longitud de la eclíptica # L_grados = M_grados + C_grados + 180.0 + 102.9372 # Lo mismo, pero se ve feo L_grados = fmod ( M_grados + C_grados + 180.0 + 102.9372 , 360 ) log . depurar ( f 'Longitud de la eclíptica L = { _deg2human ( L_grados ) } ' ) Lambda_radians = radianes ( L_grados ) # Tránsito solar (fecha juliana) J_transit = 2451545.0 + J_ + 0.0053 * sin ( M_radianes ) - 0.0069 * sin ( 2 * Lambda_radians ) log . debug ( f 'Tiempo de tránsito solar J_trans = { _j2human ( J_transit , debugtz ) } ' ) # Declinación del Sol sin_d = sin ( Lambda_radians ) * sin ( radians ( 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 ) prueba : w0_radians = acos ( some_cos ) excepto ValueError : devuelve Ninguno , Ninguno , some_cos > 0.0 w0_grados = grados ( w0_radianes ) # 0...180 registro . depurar ( f 'Ángulo horario w0 = { _deg2human ( w0_grados ) } ' ) j_rise = J_transit - w0_grados / 360 j_set = J_transit + w0_grados / 360 registro . depuración ( f 'Sunrise j_rise = { _j2human ( j_rise , debugtz ) } ' ) registro . depuración ( f 'Sunset j_set = { _j2human ( j_set , debugtz ) } ' ) registro . depuración ( f 'Duración del día { w0_grados / ( 180/24 ) : .3f } horas ' ) devolver j2ts ( j_rise ), j2ts ( j_set ), Ningunodef principal (): registro . basicConfig ( nivel = registro . DEBUG ) latitud = 33.00801 longitud = 35.08794 elevación = 0 print ( calc ( hora (), latitud , longitud , elevación , debugtz = zona horaria ( timedelta ( horas = 3 ), 'zona falsa' )))si __nombre__ == '__main__' : principal ()