miércoles, 8 de enero de 2014

Python - Matplotlib - Ejemplo de aplicaciones lineales y graficado

Contenido
Introducción(Cuentito)
Definición del problema
→Introducción a la solución mediante álgebra lineal
Definición del algoritmo
Traducción a Python

Introducción a la solución mediante álgebra lineal


El primer paso es el armarnos de una batería de herramientas algebráicas que nos permitan solucionar el problema.

Siguiendo la linea del libro Álgebra y Geometría, de la Universidad Autónoma de Madrid formularemos las siguientes definiciones y propiedades de las aplicaciones lineales.

Definición: Aplicación Lineal

Observación: Esta definición hace uso de conceptos como matriz, vectores y aplicación. Los cuales se asumen conocidos1.


Lo notable de esta definición es que desde el principio vemos una cercana relación entre las aplicaciones lineales y las matrices, incluso un teorema, que no viene al caso para este problema, nos dice que las aplicaciones lineales efectivamente son las matrices y viceversa.


Teorema: Caracterización de las aplicaciones lineales

El siguiente teorema permite entender las características de estas particulares aplicaciones.

 


Todo quien haya realizado algún curso de álgebra y haya tenido que estudiar este tema, seguramente le resulte las expresiones de arriba familiares.

Características inmediatas de interés para el problema:

Primero: El resultado de transformar dos vectores por separado y luego sumar sus imágenes o sumarlos primero y luego aplicar la transformación generan el mismo resultado:
 

Segundo: La transformación de una recta en un mismo espacio vectorial, resulta ser un punto u otra recta.

La ecuación de una recta, sin importar la topología en donde uno esté trabajando tiene siempre un punto inicial X y un vector director Y y se expresa de la siguiente manera s := X + rY, siendo s la recta y r un escalar.

Haciendo uso de las propiedades de las aplicaciones lineales, si tranfsormamos una recta entonces obtendremos otra, esto queda expresado en la siguiente ecuación:

 
El buen comportamiento en la primera conclusión, junto con el resultado de la segunda nos permiten inferir que si transformamos una región de puntos entonces su imágen será (gráficamente) otra región.

En este momento el siguiente paso será hallar una manera de transformar los lados de las regiones pedidas en el ejercicio.

Por ejemplo tomemos el conjunto de la región b2):


Este conjunto forma un cuadrado de lado 2, con centro en el origen del sistema cartesiano, con mucha imaginación pensemos que la región se representa mas o menos como en el siguiente esquema:

Los vértices de este cuadrado son: (-1,-1); (1,-1); (1,1); (-1,1),.
Pero según dijimos lo que queremos transformar son los segmentos, es decir los lados del cuadrado, no sólo sus vértices, para esto necesitamos adjuntar a cada vértice la información de un vector director de norma euclidiana 2. 3


Así para formar los segmentos ahora tenemos las siguientes cuatro ecuaciones de rectas:

r1: (-1,-1) + r(2,0)
r2: (1,-1) + r(0,2)
r3: (1,1) + r(-2,0)


r4: (-1,1) + r(0,-2)

El siguiente paso es aplicar la transformación a dichas rectas, según se define en el ejercicio:




Aplicando las propiedades de linealidad podemos transformar la recta de la manera que se indica en la segunda característica inmediata de interés para el problema, el resultado de dicha aplicación genera las siguientes imágenes:

t1: (-2,-1) + r(2,4)
t2: (0,3) + r(2,-2)
t3: (2,1) + r(-2,-4)
t4: (0,-3) + r(-2,2)


1   La sección 1,2 del libro mencionado hace una introducción a los vectores y las propiedades de la suma de vectores y multiplicación por un escalar.

2 Véase sección Definición del problema

3 Esto no es nada más que la medida del vector en R2, que sale mediante el teorema de Pitágors

Definición del algoritmo

Toda la parafernalia con la que nos proveímos en la sección anterior nos permiten armar una algoritmo algebráico para calcular este tipo de regiones:

1º Graficar la región que se quiere transformar.
2º Identificar los vértices de la región a transformar.
3º Identificar los segmentos del rectángulo mediante la ecuación de la recta.
4º Aplicar la transformación a los cuatro segmentos
5º Graficar la solución.

Obviamente que estos cinco pasos pueden ser refinados aún con más precisión y detalle, pero por simplicidad dejémoslo así. La conclusión más importante es que este problema puede ser resuelto en una serie de pasos.

Si tomamos la definición de Software que expone Pressman, en su libro  Software Engineering A Practictoner's Guide como:

Software es (1) instrucciones que al ser ejecutadas proveen una funcionalidad y performance deseada, (2) estructuras de datos que permiten a los programas adecuadamente manipular información, y (3) documentos que describen la operación y uso de los programas.1


Notamos que las instrucciones para computar pueden ser perfectamente deducibles y refinadas de los pasos del algoritmo más arriba expresado, y el álgebra también nos brinda la estructura de datos que debemos crear para la correcta manipulación de la información, vectores en este caso.

Contenido
Introducción(Cuentito)
Definición del problema
→Introducción a la solución mediante álgebra lineal
Definición del algoritmo
Traducción a Python


1 Software Engineering: A Practictioner's Guide Parte 1 – Capítulo 1 Sección

Python - Traduccion

Nuevamente para tareas del tipo algebraico utilizaremos Python y Matplotlib1:

Haciendo uso de uno de los principios de la ingeniería de requerimientos del software, decidí efectuar un programa lo más simple posible, enfocando esfuerzos en el objetivo principal del modelado: La traducción del algoritmo algebraico plasmado en papel a un algoritmo procedimental.

El programa es más que sencillo, la única consideración es la utilización del objeto Path de matplotlib2, encargado de dibujar objetos simples y compuestos, este objeto es usado por diferentes instancias de clases de matplotlib. En nuestro caso lo utilizamos para crear las regiones, pasándole como coordenadas los vértices de los cuadriláteros que queremos dibujar.


El programa es secuencial y los vértices de la región inicial y de la región final se van guardanndo en las listas verts y vertsT respectivamente.

#!/usr/bin/python
import sys
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches

codes = [Path.MOVETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.CLOSEPOLY,
]

verts = []
vertsT = []
print("Las coordenadas brindadas deben ser escritas \n\t de la siguiente forma: [+|-]x,[+|-]y \n")

input_var = input("Escriba el vertice inferior izquierdo: ")
x=float(input_var[:2])
y=float(input_var[3:])

verts.append((x,y))
vertsT.append((x+y,2*x-y))


input_var = input("Escriba el vertice superior izquierdo: ")
x=float(input_var[:2])
y=float(input_var[3:])
verts.append((x,y))
vertsT.append((x+y,2*x-y))


input_var = input("Escriba el vertice superior derecho: ")
x=float(input_var[:2])
y=float(input_var[3:])
verts.append((x,y))
vertsT.append((x+y,2*x-y))

input_var = input("Escriba el vertice inferior derecho: ")
x=float(input_var[:2])
y=float(input_var[3:])
verts.append((x,y))
vertsT.append((x+y,2*x-y))

verts.append((0.,0.))
vertsT.append((0.,0.))

path = Path(verts, codes)
pathT = Path(vertsT, codes)


fig = plt.figure()

ax = fig.add_subplot(211)
patch = patches.PathPatch(path, facecolor='red', lw=2)
ax.add_patch(patch)
ax.set_xlim(-4,4)
ax.set_ylim(-4,4)

ax2 = fig.add_subplot(212)
patchT = patches.PathPatch(pathT, facecolor='green', lw=2)
ax2.add_patch(patchT)
ax2.set_xlim(-4,4)
ax2.set_ylim(-4,4)

plt.show() 

Al final si se siguen las restricciones impuestas en el prototipo tendremos el resultado de la región de inicio(arriba) y la región final, luego de aplicada la transformación(abajo):




Referencias:

1 Véase tema sobre herramientas de graficado y procesamiento matemático en Python
2 Enlace a un tutorial sobre Path, página oficial de matplotlib.

Definición del problema


El problema extraido del libro Álgebra y Geometría, de la Facultad de Ciencias de la Universidad Autónoma de Madrid, escrito por Eugenio Hernández es el siguiente:


La idea es hacer uso de las propiedades de las aplicaciones lineales para transformar una región a) o b) en otra. Esta nueva región precisamente será la resultante de aplicar la función a todos los puntos comprendidos en la región de partida.

Bosquejo de la idea:



Introducción


Hoy no era una tarde cualquiera de verano, Martes 07 de Enero, y no precisamente por ser el día después de reyes, sino ¡¡por conmemorarse el aniversario número 100 del Club Rampla Juniors de Montevideo!!

Teniendo presente tan congratulante episodio de la historia de la Banda Oriental, me apresté como de costumbre después de una relajante siesta a pasar como de costumbre una entretenida tarde leyendo y practicando temas relacionados al Álgebra y el Cálculo.

El día estaba nublado, el fondo de casa lucía con una frescura lleno de verde, el fresno con toda su robustez y tupida copa oscilando alegremente delante del níspero, éste más modesto y diligente al momento de enfrentar brisas, veranos, heladas y vientos.
Las aurinegras arañas, con su brillante telas que trastocaban en color oro, de repente, cuando los horizontales rayos de sol penetraban los nubarrones y llegaban hasta lo más bajo del terreno, ellas con sus telas protegiendo de insectos y plagas a la palma imperial y la menta.

 
En el marco de esa tranquila comunión allí estaba sentado yo, enfocado totalmente en la lectura y el ejercicio, pero a su vez profundamente consustanciado con el pequeño pedazo de naturaleza, en medio de un barrio de la periferia de la ciudad.

En un momento las previsibles gotas comenzaron a aumentar su caudal y mi compromiso vespertino se estaba complicando; al punto tal que poco fue el tiempo que tuve para intentar salvar los papeles que estaban en el patio antes de que comenzase la máxima expresión de la tormenta de hoy.


El vestigio de la tormenta queda plasmado en la mancha de agua que logra visualizarse en la fotocopia. Vestigio como pequeña muestra.

Una vez dentro, con el cambio de aire, surgió la idea de plasmar uno de los tantos ejercicios altamente algoritmizables del álgebra en un programa de computador.

Contenido
Introducción(Cuentito)
Definición del problema
→Introducción a la solución mediante álgebra lineal
Definición del algoritmo
Traducción a Python

martes, 13 de agosto de 2013

SciPy - Crear grafico 3D a partir de la ecuacion del plano



Como toda tecnología que contiene un "py" dentro de su nombre, seguramente estemos hablando de alguna herramienta de Python, reflexionará usted... ciertamente no se equivoca SciPy es un ecosistema basado en python para las matemáticas, las ciencias e ingenierías.

Entre sus paquetes centrales están:



Numpy, entre sus fuertes están la utilización de matrices o arreglos n-dimensionales, junto con un puñado de funciones del álgebra lineal[1].


SciPy, aparece proveyendo rutinas matemáticas eficientes y amigables para implementar por parte del usuario[2].

Matplotlib, mientras tanto esta librería aporta el graficado estático o animado en dos y tres dimensiones[3].

¿Y como pongo a punto mi computador para empezar a trabajar con estas herramientas?
La respuesta se encuentra en el enlace de instalación enlace, cabe aclarar que las susodichas son herramientas independientes por lo que no es necesario hacerse de todas ellas.

Bien, dejado de lado esta breve introducción, pasamos al aún más breve ejemplo de utilización de SciPy.

La idea es: a partir de una ecuación del plano de la forma: x + y + z = -1
poder concretar su representación gráfica.


Antes que nada probaremos mediante linea de comandos la propiedades de numpy para trabajar con matrices:

En la imagen se puede ver como la multiplicación por escalares y suma de matrices son llevadas a cabo como si estuviésemos trabajando con variables de una sola dimensión. Cabe señalar que la división y multiplicación con este tipo de estructuras se hacen entre los valores que se ubican en entradas iguales de sus respectivas matrices (o arreglos)[4].

Otra rutina interesante es linspace[5] con la cual se pueden generar valores equiespaciados. Ejemplo:



meshgrid[6] Es una rutina que toma como parámetro de entrada dos vectores v (de dimensión m) y u (de dimensión n) y retorna dos matrices de tamaño nXm la primera con los elementos del vector v repetidos hasta completar las entradas de cada fila y la segunda con los elementos del vector u repetidos hasta completar las columnas.
Sé que es complicado hacerme entender con las cosas sencillas, con lo cual más complicado podrá ser intentar descubrir que quise decir en esta última elucubración.
Espero que el ejemplo hable mejor que yo:



A continuación se aplican estas rutinas para generar una representación gráfica del plano:

Descargar archivo del programa

Ejecutar programa:
python plano.py





También otra representación que se puede obtener es a través del producto escalar de la norma por un vector del plano, cual sería la posición del plano con respecto a la recta perpendicular (0,0,0) + t(1,1,1).
No he implementado el algoritmo para calcular el vector del plano por una gran razón (se me está por cortar internet en la casa) y luego porque me voy a ir a bañar.

Pero comparto el archivo a manera de ejemplo para que vayan viendo lo fácil que es manipular matrices con estas herramientas: Básicamente se crean dos vectores en un mismo arreglo y luego se los visualiza en el mapa.


 Archivo para descargar

Comando:
python recta.py

Azul vector normal al plano, Verde recta contenida en el plano.
 


Referencias: