Inversa de la ecuación del amanecer: encontrar ubicaciones con una hora dada del amanecer en un día determinado

Estoy trabajando en un proyecto por diversión en el que represento geográficamente algunos datos del sueño. Para un día dado, tengo una fecha, una hora para quedarme dormido esa noche y una hora para despertarme al día siguiente. La idea es algo así como este cómic de xkcd . Mis intentos de tomar la inversa de las ecuaciones de amanecer/atardecer que encontré en línea no han sido fructíferos.

Básicamente, me gustaría encontrar una ecuación o algoritmo para dar una ubicación aproximada en la Tierra con una hora de puesta del sol específica en un día específico y una hora de salida del sol específica al día siguiente. No me preocupa demasiado la precisión, ya que esto es solo por diversión, así que espero que la información de elevación no sea necesaria.

Soy programador, por lo que el objetivo es poder escribir algo como

>>>> locate(date = '2014-08-27', sunset = '10:00 PM', sunrise = '7:30 AM')

y volver

Latitude: 49.887, Longitude: 96.141

Podría programarlo yo mismo si entendiera suficiente astronomía. Cualquier ayuda es muy apreciada.

No habría un solo lugar, por lo general habría una línea en todo el mundo donde el Sol se pone en un momento específico. La longitud y la forma de la línea variarán según la fecha y la hora.
Hmmm... en una fecha y hora dadas, deberíamos ser capaces de encontrar una ecuación que nos diga dónde está el Sol (quizás las coordenadas de Lat/Long de un punto en los Trópicos, donde el Sol está directamente sobre su cabeza. ) Entonces los puntos de salida/puesta del sol forman un gran círculo centrado en ese punto. (Por cierto, esta técnica se ha utilizado para seguir las migraciones de aves).
@JamesScreech Me doy cuenta de que hay una línea en todo el mundo donde el sol se pone a una hora específica, pero en cada punto de esa línea, el sol saldrá a una hora diferente al día siguiente. El objetivo es encontrar un lugar donde el sol se ponga en un momento específico y salga en otro momento específico.
Supongo que has visto la página wiki de la ecuación de Sunrise. Tenga en cuenta que lo que desea determinar es ϕ y λ , dado j s mi t y j r i s mi . Sugeriría juntar todas las ecuaciones en una grande que tenga solo esas cuatro variables, luego, dado que su ecuación es trascendental, resuélvala numéricamente.
OK, muerdo, ¿te refieres a la hora local o UTC ? Si especifica la hora local, a menudo puede haber algo así como 24 puntos equivalentes en la tierra, uno para cada zona horaria. UTC se libraría de la degeneración. El par subir/bajar funcionará bien, pero no en todos los casos. Además, ¿intercambiaste los dos números aquí? Latitude: 96.141, Longitude: 49.887(latitud superior a 90°)
Además, el uso del par atardecer/amanecer para encontrar una ubicación tenderá a mover a las personas mayores (que tienden a necesitar menos horas de sueño) hacia el hemisferio donde es verano, y a las personas más jóvenes en la dirección opuesta.
No he puesto ningún trabajo en este comentario, pero: 1) encuentra la latitud donde la duración del día coincide con el tiempo entre el amanecer y el atardecer (14,5 horas en tu ejemplo). Excepto cerca del equinoccio, siempre habrá tal latitud. Luego solo encuentre la longitud donde coincida el tiempo. Como aceptó una respuesta (+ la pregunta es bastante antigua), no entraré en más detalles, pero puede obtener la duración del día a partir de la declinación del Sol con bastante facilidad, y la declinación del Sol a partir del día del año con bastante facilidad.

Respuestas (3)

Para evitar los dolores de cabeza asociados con la búsqueda de aproximadamente dos docenas de soluciones similares en los límites zigzagueantes de la zona horaria, es posible que desee ceñirse a UTC . Si desea lidiar con la hora local, se volverá un poco loco si también intenta incluir la activación y desactivación del horario de verano.

Los puntos de la tierra donde el centro del sol coincide con el horizonte ( ignorando la topografía, el achatamiento, la refracción atmosférica, la velocidad finita de la luz y otros pequeños efectos ) es solo el círculo de la tierra donde un cono dibujado desde el Sol se cruza con un Tierra esférica.

ingrese la descripción de la imagen aquí

arriba: Una esfera dentro de un cono, de http://mathcentral.uregina.ca .

Pero el siguiente paso es difícil: pasar de ese círculo a las coordenadas lat/lon en la superficie, porque el eje está inclinado y porque el movimiento alrededor del sol se acelera y se ralentiza a medida que la Tierra gira más cerca y más lejos del sol. Estos se pueden aproximar mediante funciones periódicas con algunos coeficientes, y eso es lo que encontrarás en las matemáticas detrás de la primera respuesta. Para la segunda respuesta, enumeraré dos soluciones de Python: PyEphem y Skyfield. Ambos son fáciles de usar, pero está separado de las matemáticas reales (en un caso es una efemérides/tabla. La tercera respuesta es realmente una colección de rutinas de la NASA/JPL que son muy respetadas pero pueden requerir más tiempo para que usted se levante) a la velocidad en comparación con los paquetes de Python.

Respuesta 1: Algoritmos astronómicos

Esto es algo en lo que tendrá que profundizar un poco, pero si le gusta programar, puede ser exactamente lo que está buscando. El sitio web de Gaisma es uno de mis favoritos en Internet: es fácil de usar y presenta mucha información en gráficos fáciles de entender. Haga clic alrededor!

Creo que este sitio utiliza algoritmos de la colección que se encuentra en este sitio de la NOAA . Haga clic alrededor de allí también. Proporcionan hojas de cálculo de Excel que contienen los algoritmos y otros recursos. El recurso "principal" es una colección de algoritmos publicados en el libro Astronomical Algorithms - Jean Meeus . Desde esa página de Amazon puedes ver que hay muchos libros con títulos similares. Recomiendo ir a una biblioteca si es posible, porque (en mi opinión) siempre es bueno ir a bibliotecas. Sin embargo, partes de estos se pueden encontrar en línea. Por ejemplo, algunas páginas que se muestran del libro Fórmulas astronómicas para calculadoras (1988) incluyen una tabla de contenido interesante.

Respuesta 2: Python empaqueta PyEphem y Skyfield

Copiaré un poco del texto de esta respuesta :

  1. El paquete Python PyEphem ha existido y cuenta con un buen soporte, y es la reencarnación pitónica de XEphem . No lo he usado, pero creo que guarda suficiente información sobre los parámetros orbitales en ciertas épocas para generar una efeméride, incluidas algunas perturbaciones gravitacionales. En otras palabras, es mucho más que planetas que se mueven en órbitas elípticas fijas alrededor de un sol fijo. Así que creo que funciona sin conexión a Internet.

  2. Nunca lo usé porque me recomendaron mirar Skyfield y es exactamente lo que necesitaba. Descarga una efemérides JPL estándar que usted elija, y luego la usa desde su disco duro después de eso. Sin embargo, para lidiar con los segundos intercalares y otros efectos relacionados con el tiempo , ocasionalmente necesita buscar en Internet actualizaciones de información sobre segundos intercalares, ya que estas son arbitrarias.

No sé si Skyfield tiene un modo para evitar eso. En realidad, esa es una buena pregunta. Si trabaja con una escala de tiempo que no tiene segundos bisiestos, no estoy seguro de que se ejecute en su versión actual.

Los paquetes Skyfield y PyEphem Python han sido escritos y mantenidos por @BrandonRhodes.

He incluido un script de Python simple solo para ilustrar cómo se puede usar Skyfield. Si se siente cómodo con la codificación sin llaves, le recomiendo encarecidamente que pruebe esto. Es increíblemente poderoso y pitónico.

Esto es solo un comienzo: debe agregar un mejor mantenimiento para detectar amaneceres frente a atardeceres, y tal vez una búsqueda de tipo más global en algunos casos. En realidad, es necesaria una limpieza un poco tediosa para que esto funcione de manera sólida.

nota: puede activar la refracción atmosférica utilizando los argumentos del apparent()método. Consulte la documentación de la API de Skyfield para obtener más información y para ver una discusión sobre la iteración con los métodos de Skyfield, especialmente la resolución de tiempos, consulte esta respuesta útil .

ingrese la descripción de la imagen aquí

def alt_lonlat(lon, lat, t):
    
    topo = earth.topos(lat, lon)
    
    alt, az, dist = topo.at(trise).observe(sun).apparent().altaz() ## apparent() args for atmospheric refraction
    
    return alt.degrees


from skyfield.api import load
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as spo

data  = load('de421.bsp')
ts    = load.timescale()

# your example:  '2014-08-27', sunset = '10:00 PM', sunrise = '7:30 AM'

trise  = ts.utc(2014, 8, 27,  7, 30, 0)
tset   = ts.utc(2014, 8, 27, 22,  0, 0)

earth = data['earth']
sun   = data['sun']

zerozero = earth.topos(0.0, 0.0)   # gotta start looking somewhere!

alt, az, dist = zerozero.at(trise).observe(sun).apparent().altaz() ## apparent() args for atmospheric refraction

print "at trise, JD = ", trise.tt
print "at (0N, 0E) Sun's altitude: ", alt.degrees, "azimuth: ", az.degrees
print "at (0N, 0E) Sun's distance (km): ", dist.km

# Find points on equator where sun is on horizon (rise or set) at t=trise

limits   = ((0, 180.), (180, 360.))
lonzeros = []

for a, b in limits:

    answer, info = spo.brentq(alt_lonlat, a, b,
                              args=(0.0, trise),
                              full_output = True )

    if info.converged:
        lonzeros.append(answer)
        print "limits ", a, b, " converged! Found longitude (deg): ", answer
    else:
        print "limits ", a, b, "whaaaa?"
        lonzeros.append(None)

# make some curves

lats = np.linspace(-60, 60, 13)

longis = []
for lon0 in lonzeros:
    lons = []
    for lat in lats:
        
        answer, info = spo.brentq(alt_lonlat, lon0-90, lon0+90,
                                  args=(lat, trise),
                                  full_output = True )
        if info.converged:
            lons.append(answer)
        else:
            lons.append(None)

        lons = [(lon+180)%360.-180 for lon in lons]  # wraparound at +/- 180

    longis.append(lons)

plt.figure()

for lons in longis:
    plt.plot(lons, lats)

for lons in longis:
    plt.plot(lons, lats, 'ok')

plt.xlim(-180, 180)
plt.ylim(-90, 90)

plt.title("at trise, JD = " + str(trise.tt))

plt.show()

Respuesta 3: Kernels SPICE

Como señaló @barrycarter en este comentario debajo de esta respuesta , los kernels JPL SPICE están disponibles. No estoy familiarizado con ellos, pero es lo que usa la NASA, así que debe ser bastante bueno :)



Apéndice:

Aquí hay algunas capturas de pantalla para Londres, Reino Unido ( Gaisma de aquí ):

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

@barrycarter, la pregunta proviene de un programador: si puede mejorar la redacción de la Answer 3: SPICE Kernelssección, ¡hágalo!
¡Esta respuesta es genial! No había considerado las complejidades de las zonas horarias, por lo que UTC es el camino a seguir. La respuesta 2 parece muy prometedora y resulta que conozco Python bastante bien, así que lo intentaré tan pronto como pueda.
¡OK eso es genial! Si tiene preguntas sobre Python, puede hacerlas en Stackoverflow; no olvide agregar la skyfieldetiqueta.
Pero puede considerar votar y/o aceptar esta respuesta si la encuentra útil, luego puede hacer una nueva pregunta si desea profundizar.

Debido a la complejidad del problema (vea mi comentario anterior) y al hecho de que solo desea una respuesta aproximada, ¿por qué no intenta calcular los tiempos de salida / puesta del sol en, digamos, intervalos de un grado para toda la Tierra y luego compararlos con los tiempos? tú tienes. Si un grado no está lo suficientemente cerca, puede usar un intervalo más pequeño y también usar un rango en la comparación (digamos +/- 5 minutos).

Exactamente qué tan fino es el espacio de ubicación y el rango de tiempo dependerá de qué tan precisas desee sus respuestas y ambos podrían modificarse fácilmente hasta que esté satisfecho con los resultados.

Este enfoque puede no ser el más eficiente, pero con la velocidad de la computadora moderna no debería tomar mucho tiempo.

Este tipo de enfoque de fuerza bruta es lo que esperaba evitar. Estoy más interesado en encontrar una solución matemática o un enfoque eficiente que en lo que realmente son las ubicaciones.
Realmente no consideraría esto como un enfoque de fuerza bruta. En el sentido más estricto, sí, pero usar una tabla de búsqueda para una cantidad tan pequeña de valores (incluso cada décima de grado solo te da 3600 valores) está dentro de las capacidades de las computadoras modernas y se usa con bastante frecuencia para muchas tareas (ver voltear bit algoritmos, por ejemplo).
@zephyr Una tabla de búsqueda sería una gran idea para encontrar muchos valores en la misma fecha, pero calcular un valor para cada fecha en la que los datos cambian de un día a otro no parece algo que use las tablas de búsqueda de manera eficiente. ¿Estoy malinterpretando algo?

Como dice @Andy, en cualquier momento hay un gran círculo alrededor de la Tierra donde el Sol se encuentra actualmente en el horizonte, ya sea saliendo o poniéndose (o ambos en dos puntos en el (ant) ártico). Este gran círculo se puede describir mediante las coordenadas del punto donde el Sol está directamente sobre su cabeza (que es el vector que apunta desde el centro de la Tierra hacia esa ubicación en la superficie, o hacia el Sol).

Ese gran círculo existe para vuestro momento de la puesta del sol, y otro existe para vuestro momento de la salida del sol. Estás interesado en uno de los dos puntos de intersección de estos dos grandes círculos.

Los dos grandes círculos se encuentran en dos planos a través del centro de la Tierra, descritos por dos de los vectores mencionados anteriormente. La intersección de los dos planos es una línea que pasa por el centro, cuya dirección es otro vector (el producto cruzado normalizado de los dos vectores normales), que se puede volver a convertir en dos posiciones antípodas en la superficie de la Tierra. Esta solución sería bastante exacta si la Tierra fuera una esfera.