Tutoriales

Lanzando proyectiles (con ayuda de vpython)

La mayoría de vosotros habréis resuelto el típico problema del lanzamiento de un proyectil que describe una trayectoria parabólica. Las ecuaciones que describen el movimiento son:

  • Vector posición

$latex x = v_{0x} t + x_0$
$latex y = -frac{1}{2} g t^{2} + v_{0y} t + y_0$

  • Vector velocidad

$latex v_x = v_{0x}$ con $latex v_{0x} = v_0 cos alpha$
$latex v_y = -g t + v_{0y}$ con $latex v_{0y} = v_0 sin alpha$
Hoy vamos a intentar resolverlo de forma gráfica con la ayuda de python y vpython. La biblioteca vpython une python con una librería gráfica 3D de forma que, como vamos a ver, hacer animaciones 3D sencillas se convierte en un juego.
[sourcecode language=”python”]
import visual as vs
import numpy as np
## valores iniciales (modifícalos bajo tu responsabilidad)
v0 = 20 ## v en m/s
alfa = 60 ## ángulo en grados
vel_fotogramas = 10  ## la velocidad del video
## Constantes
g = 9.81 ## Aceleración de la gravedad
## ecuaciones
v0x = v0 * np.cos(np.deg2rad(alfa))
v0z = v0 * np.sin(np.deg2rad(alfa))
t_total = 2 * v0z / g
x_final = v0x * t_total
## Empezamos con visual python (vpython)
## Creamos el ‘suelo’
suelo = vs.box(pos = (x_final/2., -1, 0),
size = (x_final, 1, 10), color = vs.color.green)
## Creamos el ‘cañón’
canyon = vs.cylinder(pos = (0, 0, 0),
axis = (2 * np.cos(np.deg2rad(alfa)), 2 * np.sin(np.deg2rad(alfa)), 0))
## Creamos el proyectil y una línea que dejará la estela del proyectil
bola = vs.sphere(pos = (0, 0, 0))
bola.trail = vs.curve(color=bola.color)
## Creamos la flecha que indica la dirección del movimiento (vector velocidad)
flecha = vs.arrow(pos = (0, 0, 0),
axis = (v0x, v0z, 0), color = vs.color.yellow)
## texto (ponemos etiquetas para informar de la posición del proyectil)
labelx = vs.label(pos = bola.pos, text= ‘posicion x = 0 m’, xoffset=1,
yoffset=80, space=bola.radius, font=’sans’, box = False,
height = 10)
labely = vs.label(pos = bola.pos, text= ‘posicion y = 0 m’, xoffset=1,
yoffset=40, space=bola.radius, font=’sans’, box = False,
height = 10)
## Animamos todo el cotarro!!!
t = 0
while t <= t_total:
bola.pos = (v0x * t, v0z * t – 0.5 * g * t**2, 0)
flecha.pos = (v0x * t, v0z * t – 0.5 * g * t**2, 0)
flecha.axis = (v0x, v0z – g * t, 0)
bola.trail.append(pos=bola.pos)
labelx.pos = bola.pos
labelx.text = ‘posicion x = %s m’ % str(v0x * t)
labely.pos = bola.pos
labely.text = ‘posicion y = %s m’ % str(v0z * t – 0.5 * g * t**2)
t = t + t_total / 100.
vs.rate(vel_fotogramas)
[/sourcecode]
Voy a explicar brevemente lo que hace el código:
Leer más »Lanzando proyectiles (con ayuda de vpython)

Transformada de Fourier discreta en Python con SciPy

Introducción

En este artículo vamos a ver cómo calcular la transformada de Fourier discreta (o DFT) de una señal en Python utilizando la transformada rápida de Fourier (o FFT) implementada en SciPy. El análisis de Fourier es la herramienta fundamental en procesamiento de señales y resulta útil en otras áreas como en la resolución de ecuaciones diferenciales o en el tratamiento de imágenes.
Nota: Puedes ver el artículo en forma de notebook de IPython mediante la herramienta nbviewer.
La transformada rápida de Fourier o FFT es en realidad una familia de algoritmos muy eficientes ($latex O(n \log n)$) para calcular la DFT de una señal discreta, de los cuales el más utilizado es el algoritmo de Cooley-Tukey. Este es el que está implementado en SciPy a través de las subrutinas FFTPACK, escritas en FORTRAN 77, y es el que vamos a utilizar. También podríamos haber utilizado la biblioteca FFTW, más moderna y escrita en C, o la implementación presente en NumPy, que es una traducción a C de FFTPACK y que funciona igual que la de SciPy, pero no lo vamos a hacer.
Nótese que estos métodos no nos permiten calcular ni la serie de Fourier de una función periódica ni la transformada de Fourier de una función no periódica. Estas operaciones forman parte del cálculo simbólico y deben llevarse a cabo con otro tipo de programas, como SymPy o Sage. En Pybonacci puedes leer una introducción a SymPy y cómo calcular series con SymPy, así como una reseña sobre Sage.
En este artículo nos vamos a centrar en el caso unidimensional, aunque el código es fácilmente extrapolable al caso de dos y más dimensiones.
En esta entrada se ha usado python 2.7.3, numpy 1.6.2, scipy 0.10.1 y matplotlib 1.1.1.

Definiciones

Antes de empezar de lleno con las FFTs vamos a hacer una brevísima introducción matemática. He intentado que esto no se convierta en una larga introducción al procesamiento de señales digitales, pero si te interesa el tema y quieres más rigor puedes acudir a cualquiera de las referencias que doy más abajo además de la documentación de scipy.fftpack.
Leer más »Transformada de Fourier discreta en Python con SciPy

Creación de documentos con Docutils y reST

Introducción

Hoy vamos a ver una introducción a cómo crear documentos utilizando Docutils y el lenguaje de marcado reStructuredText, o simplemente reST. El proyecto Docutils nació en la década de los años 2000 como parte del esfuerzo para mejorar la documentación del lenguaje Python, y en los últimos años tanto el lenguaje reST como las herramientas para procesarlo se han convertido en una manera excelente no sólo de documentar proyectos en Python, sino también en otros lenguajes o para escribir documentos que nada tienen que ver con la programación.
Docutils es compatible con Python 2.4 en adelante y funciona en Windows, Mac OS X y Linux. Para instalarlo en cualquiera de estos sistemas operativos, no tienes más que seguir el procedimiento habitual para instalar paquetes Python:

  1. Descargar el código fuente desde la web de Docutils y extraerlo.
  2. Escribir desde un terminal python setup.py install. Este paso puede requerir privilegios de administrador.

El lenguaje reST

El lenguaje reStructuredText o reST es un lenguaje de marcado de texto plano flexible y potente. reST tiene las ventajas de otros lenguajes de marcado de texto plano similares como Markdown, como puede ser la portabilidad: en cualquier sistema operativo y con cualquier editor de texto básico puedes abrir y modificar archivos de texto plano. Pero además, reST tiene otra serie de características que otros no tienen:

  • Es extensible: en reST puedes definir tus propios roles y directivas, de tal forma que puedes automatizar estructuras que utilices con frecuencia.
  • Está integrado con $latex LaTeX$: utilizando la directiva y el rol math, puedes incluir fácilmente ecuaciones matemáticas en tus documentos. Esto nos viene muy bien a los científicos e ingenieros 😉
  • Se puede exportar a múltiples formatos: HTML, $latex LaTeX$, man, ODT, XML, S5… y si lo necesitas se puede adaptar para exportarlo al formato que desees (como por ejemplo HTML5).

Uno de los objetivos de reST es que sea legible. La manera de marcar los encabezados y las secciones del documento hace que alguien que no conozca el lenguaje pueda leer perfectamente el contenido. Vamos a ver algunos ejemplos.
Leer más »Creación de documentos con Docutils y reST

Manual de introducción a matplotlib.pyplot (IX): Miscelánea

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1 y matplotlib 1.1.0 ]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
plt.ion()
[/sourcecode]
Después de dar un repaso por toda la librería, obviando algunas funciones estadísticas y eventos, vamos a acabar este tutorial viendo algunas funciones que sirven para leer y guardar imágenes.
Imaginad que queréis usar una imagen de fondo, por ejemplo vuestro nombre, o las siglas de creative commons o una foto,…, en vuestros gráficos. Para el ejemplo que vamos a ver a continuación vamos a usar la imagen que está en el siguiente enlace como fondo (guardadala en local para poder leerla).
[sourcecode language=”python”]
background = plt.imread(‘Cc.large.png’) # Leemos la imagen que queremos usar de fondo, lo que escribáis entre comillas es la ruta a la imagen
x = np.arange(background.shape[1]) # Definimos valores de x
y = np.random.rand(background.shape[0]) * background.shape[0] # Definimos valores de y
plt.plot(x, y) # Dibujamos la serie
plt.imshow(background, alpha = 0.25) # Creamos el fondo con una transparencia del 0.10 (1 es opaco y 0 es transparente)
[/sourcecode]
El resultado es el siguiente:

Con plt.imread lo que hacemos es leer una imagen y convertirla en un numpy array que más tarde podemos utilizar como queramos (en este caso, como fondo para la imagen). Con plt.imshow lo que hemos hecho es mostrar la imagen en pantalla. Por último, que sepáis que también existe plt.imsave, que permite guardar un numpy array como una imagen.
Leer más »Manual de introducción a matplotlib.pyplot (IX): Miscelánea

Manual de introducción a matplotlib.pyplot (VIII): Texto y anotaciones

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1 y matplotlib 1.1.0 ]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
plt.ion()
[/sourcecode]
Hasta ahora hemos visto como configurar las ventanas, manejo de las mismas, definir áreas de gráfico, algunos tipos de gráficos… En esta ocasión nos interesa ver como podemos meter anotaciones, tablas,…, en nuestros gráficos.
A lo largo de las anteriores entregas del tutorial hemos podido ver algunas formas de tener anotaciones típicas para el título, los ejes, leyenda,… (title, suptitle, xlabel, ylabel, figtext, legend,…). En este caso vamos a revisar las posibilidades de escribir texto personalizado mediante el uso de plt.text, plt.arrow, plt.annotate y plt.table.
Leer más »Manual de introducción a matplotlib.pyplot (VIII): Texto y anotaciones

Cómo leer y escribir datos en archivos con NumPy

Introducción

Hoy vamos a ver rápidamente cómo leer datos desde un archivo con NumPy y también cómo escribirlos. Es algo a lo que tendremos que recurrir con mucha frecuencia, ya sea porque hemos recogido nuestros datos de un experimento y los tenemos almacenados en un fichero de texto, porque los hemos recibido por otras fuentes o porque queremos separar lo que es la lógica del programa de los datos con los que opera.
Ya comentamos hace tiempo cómo crear matrices en Python a partir de listas, utilizando rangos numéricos, etc. Lo bueno que tienen las funciones de NumPy que nos ayudan a desempeñar estas tareas es que no tenemos que preocuparnos por el manejo de ficheros con Python, así que leer o escribir será tan fácil como invocar una función.
En esta entrada se ha usado python 2.7.3 y numpy 1.6.2 y es compatible con python 3.2.3

Lectura

NumPy nos ofrece varias funciones para cargar datos en forma matricial, pero la que usaremos con más frecuencia es la función loadtxt. Su único argumento obligatorio es un nombre de archivo o un objeto file desde el que leer los datos.
Leer más »Cómo leer y escribir datos en archivos con NumPy

Manual de introducción a matplotlib.pyplot (VII): Tipos de gráfico (IV)

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1, matplotlib 1.1.0, netcdf4-python 0.9.9 y Basemap 1.0.2]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
import netCDF4 as nc
from mpl_toolkits.basemap import Basemap as Bm
[/sourcecode]
Hasta ahora hemos visto como configurar las ventanas, manejo de las mismas, definir áreas de gráfico, algunos tipos de gráficos… Ahora vamos a ver un último capítulo sobre tipos de gráficos. En esta última entrada sobre los tipos de gráfico hemos metido gráficos que quizá no estén muy relacionados entre sí por lo que quizá este capítulo puede parecer un poco cajón desastre.
Leer más »Manual de introducción a matplotlib.pyplot (VII): Tipos de gráfico (IV)

Manual de introducción a matplotlib.pyplot (VI): Tipos de gráfico (III)

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text…)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, …)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress…)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1 y matplotlib 1.1.0]
[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].
En todo momento supondremos que se ha iniciado la sesión y se ha hecho
[sourcecode language=”python”]
import matplotlib.pyplot as plt
import numpy as np
[/sourcecode]
Hasta ahora hemos visto como configurar las ventanas, manejo de las mismas, definir áreas de gráfico, algunos tipos de gráficos… Ahora vamos a continuar viendo tipos de gráficos disponibles desde matplotlib.pyplot. En este caso nos vamos a centrar en otros gráficos que, quizá, sean menos usados que los vistos hasta ahora. Algunos ya los hemos visto en otras entradas, como gráficos polares, gráficos de contornos [1] [2],…
Vamos a empezar por ver un gráfico tipo tarta de quesitos o tipo tarta o como lo queráis traducir (en inglés se llama pie chart). Estos sos los típicos gráficos que ponen en los periódicos con los resultados de elecciones o cosas así. En este caso vamos a ver un ejemplo real a partir de los datos de las visitas por países a este humilde blog:
[sourcecode language=”python”]
plt.ion() # Ponemos el modo interactivo
visitas = [43.97, 9.70, 7.42, 6.68, 3.91, 3.85, 3.62, 3.43, 3.16, 3.04] # Definimos un vector con el % de visitas del top ten de países
visitas = np.append(visitas, 100. – np.sum(visitas)) # Introducimos un último elemento que recoge el % de visitas de otros países fuera del top ten
paises = [u’España’, u’México’, ‘Chile’, ‘Argentina’, ‘Colombia’, ‘Ecuador’, u’Perú’, ‘USA’, ‘Islandia’, ‘Venezuela’, ‘Otros’] # Etiquetas para los quesitos
explode = [0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0, 0] # Esto nos ayudará a destacar algunos quesitos
plt.pie(visitas, labels = paises, explode = explode) # Dibuja un gráfico de quesitos
plt.title(u’Porcentaje de visitas por país’)
[/sourcecode]
El resultado se puede ver en el gráfico siguiente. Como habréis adivinado, explode sirve para separar quesitos del centro de la tarta. En este caso hemos separado los quesitos de USA e Islandia para destacar los países no hispanohablantes:

Leer más »Manual de introducción a matplotlib.pyplot (VI): Tipos de gráfico (III)