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.
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.
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.
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.
Copiaré un poco del texto de esta respuesta :
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.
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 .
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()
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 :)
Aquí hay algunas capturas de pantalla para Londres, Reino Unido ( Gaisma de aquí ):
Answer 3: SPICE Kernels
sección, ¡hágalo!skyfield
etiqueta.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.
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.
james chillido
Andy
xanxerus
céfiro
UH oh
Latitude: 96.141, Longitude: 49.887
(latitud superior a 90°)UH oh
usuario21