lunes, 23 de junio de 2008

Analema con PyEphem

Una de las mejores características de Python es la gran cantidad de módulos existentes. Una instalación básica ya incorpora multitud de ellos, por eso se suele decir que Python viene "con pilas incluídas". Pero fuera de la librería estándar hay una infinidad creciente de utilidades que permiten utilizar Python para casi cualquier aplicación concebible. Hoy voy a presentar uno de ellos: PyEphem.

PyEphem es un módulo de Python creado alrededor de la librería libastro (algo que en programación se llama wrapper), que contiene multitud de funciones de cálculo astronómico y es la parte central del magnífico software XEphem. PyEphem permite calcular efemérides y posiciones de astros con gran precisión, teniendo en cuenta efectos como la precesión y nutación de la Tierra, o la refracción atmosférica. No voy a entrar a describir las clases y funciones de la librería, porque para eso está la página oficial. Pero sí voy a mostrar un ejemplo de lo que se puede hacer con PyEphem y unas pocas líneas de Python.

Si observamos la posición del Sol en el cielo cada día a la misma hora y la representamos en un gráfico, al cabo de un año obtendremos una figura con forma de ocho conocida como analema. La razón de que se forme esta figura está en la inclinación del eje de la tierra frente al plano de la eclíptica, y en que la Tierra avanza con velocidad variable en su órbita ligeramente elíptica. El Sol se encuentra en los extremos superior o inferior de la analema en el solsticio de Verano y de Invierno, respectivamente.

El siguiente código en Python calcula el analema que sería visible en 2008 desde mi casa, observando el Sol cada día a las 12 horas de tiempo solar medio. El analema es dibujado en una gráfica utilizando el módulo matplotlib/pylab.


#!/usr/bin/python

import ephem
from pylab import *

obs = ephem.Observer()
obs.long = '-5:44:16'
obs.lat = '43:29:4'
hour = 12 - ephem.degrees(obs.long)/pi*12
obs.date = (2008, 1, 1, hour)

sun = ephem.Sun()
sun_alt = []
sun_az = []

for i in range(365):
sun.compute(obs)
sun_az.append(sun.az*180/pi)
sun_alt.append(sun.alt*180/pi)
obs.date = obs.date + 1

plot(sun_az, sun_alt, '.')
axis('equal')
grid()
show()

En primer lugar se crea el objeto obs, que representa al observador, y se fijan parámetros: latitud, longitud y fecha inicial. A continuación se crea el objeto Sol y un par de listas vacías donde después se guardarán las coordenadas (azimut y altura) del Sol para cada día. Después un bucle ejecuta el cálculo de la posición para cada día del año y va rellenando las listas. Por último se crea la gráfica y se representa. El código es sencillo de entender incluso sin haber programado nunca en Python. Lo más complicado quizá sea el cálculo de la hora de observación a partir de la longitud del lugar. Hay que tener en cuenta que PyEphem trabaja únicamente con tiempo universal.

Aquí el resultado:


Este es sólo un educativo ejemplo de lo que puede hacerse con este potente módulo. A cualquier aficionado a la astronomía y a la programación se le pueden ocurrir otras aplicaciones más útiles.

No hay comentarios: