viernes, 16 de diciembre de 2011

GRÁFICOS EN MATLAB

GRÁFICOS EN MATLAB

Una de las funciones más importantes en Matlab es la función plot . Plot también parece ser una de las más sencillas funciones para aprender a usar. La sintaxis básica de la función es escribir el siguiente comando en la ventana de comandos del Matlab o en un archivo-m.

plot(x,y)
Este comando ploteará los elementos del vector x en el eje horizontal de una figura, y los elementos del vector y en el eje vertical de la figura. Por defecto, cada vez que se use el comando plot , se borrará la figura que estaba, quedando solo la nueva; discutiremos cómo forzar esto más abajo. Si quisiéramos graficar la sencilla fórmula lineal:

     y=3x

Deberíamos crear un archivo-m con las siguientes líneas de código:

     x = 0:0.1:100;

     y = 3*x;

     plot(x,y)

lo que generará la figura siguiente,

 
Una cosa a tener en cuenta cuando se usa el comando plot es que los vectores x e y deben ser la misma longitud. La otra dimensión puede variar. Matlab puede graficar un vector 1 x n versus un vector n x 1, ó un vector 1 x n versus una matriz 2 x n , (obtendrá dos líneas), el largo n es el mismo para ambos vectores.

El comando plot puede también usarse con solamente un vector como entrada o parámetro. En ese caso las columnas del vector se grafican versus sus índices (el vector 1:1:n se usará para el eje horizontal). Si el vector de entrada contiene números complejos, Matlab dibuja la parte real de cada elemento (en el eje x) versus la parte imaginaria (en el eje y).
La Estética de los Gráficos
El color y el marcador de un gráfico se pueden cambiar agregando un tercer parámetro (entre apóstrofo 'esto') al comando plot . por ejemplo, para graficar la función de arriba con una línea punteada roja , debería cambiarse el archivo-m a:

     x = 0:0.1:100;

     y = 3*x;

     plot(x,y,'r:')

Ahora el gráfico se ve:


La tercera entrada consiste de uno a tres caracteres que especifican un color y/o o un tipo de marcador. La lista de colores y marcadores es como sigue:

     y     amarillo      .     punto

     m     violeta       o     circulo

     c     celeste       x     cruz x

     r     rojo          +     suma

     g     verde         -     solido

     b     azul          *     estrella

     w     blanco        :     punteado

     k     negro         -.    punto y raya

                         --    a trazos

Se puede graficar más de una función en la misma figura. Digamos que quisiera graficarlas ondas seno y coseno en el mismo conjunto de ejes, usando diferentes colores y marcadores para cada una. Puede usarse el siguiente archivo-m para lograrlo:

     x = linspace(0,2*pi,50);

     y = sin(x);

     z = cos(x);

     plot(x,y,'r', x,z,'gx')

Obtendrá la figura siguiente de las ondas seno y coseno, con el seno en rojo sólido y el coseno en verde con cruces:


Agregando más juegos de parámetros al comando plot , puede graficar tantas funciones en la misma figura como se quiera . Cuando plotea muchas cosas en el mismo gráfico es útil diferenciar las diferentes funciones mediante color y marcadores. Puede lograrse el mismo efecto usando los comandos hold on y hold off. Una figura como la que se muestra abajo puede generarse mediante el siguiente archivo-m:

     x = linspace(0,2*pi,50);

     y = sin(x);

     plot(x,y,'r')

     z = cos(x);

     hold on

     plot(x,z,'gx')

     hold off

Recuerde que siempre que use el comando hold on, todas las figuras serán generadas en un conjunto de ejes, sin borrarse la figura anterior, hasta que se aplique el comando hold off.

Más de un Gráfico en una ventana (Subplot)
En una misma figura puede ponerse más de una línea empleando el comando subplot. El comando subplot le permite separar la figura en tantas figuras como se quiera, y ponerlas todas en una figura. Para usar este comando, Copie la siguiente línea de código e insértela en la ventana de comandos del Matlab o en un archivo-m:

subplot(m,n,p)
Este comando divide la figura en una matriz de m renglones y n columnas, por lo tanto crea mxn gráficos en una figura. TEl p-ésimo gráfico es seleccionado como el gráfico activo (solo hay uno a la vez por figura). Por ejemplo, suponga quisiera ver una senoide, un coseno, y una onda tangente graficadas en la misma figura, pero no en los mismos ejes. El siguiente archivo-m lo hará:

     x = linspace(0,2*pi,50);

     y = sin(x);

     z = cos(x);

     w = tan(x);

     subplot(2,2,1)

     plot(x,y)

     subplot(2,2,2)

     plot(x,z)

     subplot(2,2,3)

     plot(x,w)


como puede ver, habrá solo tres gráficos , a pesar de haber creado una matriz de 2 x 2 , de 4 subplots. No tiene por qué rellenar todas las subfiguras que ha creado, pero Matlab dejará un lugar para cada figura en la matriz. Pudo haber hecho sencillamente otro gráfico mediante la línea subplot(2,2,4) . Las subplots se ordenan de la misma manera como se lee un libro. La primera subplot está arriba a la izquierda, la siguiente está a su derecha. Cuando todas las columnas de ese renglón están ocupadas, se rellena la columna de la izquierda del próximo renglón de abajo (asumiendo que genera los subplots en el orden 1, 2, 3,..).

Una cosa a notar acerca del comando subplot es que cada comando plot ejecutado después ubicará la figura en la última posición que se especificó en el último comando subplot, borrando la figura que había . Por ejemplo, en el archivo-m previo, si se emitiera un comando plot más tarde en el mismo, éste se graficará en la en la tercera posición en la ventana gráfica, borrando la línea de la tangente.

Cambiando los ejes
Ahora que ha encontrado diversos modos de graficar funciones, puede personalizar sus ploteos para lograr lo que desea. El modo más frecuente de hacerlo es mediante el comando axis. El comando axis cambia los ejes del diagrama actual, de modo que se muestra sólo la parte del eje que se desea. El comando axis se usa ingresando el siguiente comando justo después del comando plot (o cualquier comando que tiene un plot como una de sus salidas):

     axis([xmin, xmax, ymin, ymax])

Por ejemplo, suponga querer ver un gráfico de la función y=exp(5t)-1. Si entra lo siguiente al Matlab

t=0:0.01:5;

y=exp(5*t)-1;

plot(t,y)

debería tener la figura siguiente:




Como puede ver, el gráfico tiende a infinito. Atendiendo al eje y (escala: 8e10), es claro que no puede verse mucho en este gráfico. Para tener una mejor idea de lo que está pasando en el ploteo, miremos el primer segundo de esta función. Escriba el siguiente comando en la ventana de comandos del Matlab.

axis([0, 1, 0, 50])

y debería obtener la figura siguiente:




Ahora esta figura es mucho más valiosa. Puede verse más claro lo que pasa cuando la función va hacia infinito. Puede personalizarse los ejes a sus necesidades. Cuando se usa el comando subplot, pueden cambiarse los ejes de cada subplot emitiendo un comando axis antes del próximo comando subplot. Hay más usos del comando axis que puede ver si tipea help axis en la ventana de comandos del Matlab.

Agregar Texto
Otra cosa que puede ser importante en sus gráficos es el etiquetado. Puede darle un título al gráfico (con el comando title), etiqueta al eje x (con el comando xlabel), o al eje y (con el comando ylabel), así como incluir texto en la figura presente. Todos los comandos mencionados se emiten luego de ejecutarse el comando plot actual.
Más aún, puede incorporarse texto en el mismo gráfico de dos maneras: el comando text y el comando gtext. El primer comando requiere conocer las coordenadas donde quiere ubicar la cadena de texto. El comando es text(xcor,ycor,'textstring'). Para usar el otro comando, no necesita saber las coordenadas exactas. El comando es gtext('textstring'), y entonces sólo mueva la mira en cruz al lugar deseado con el mouse, y haga clic en la posición que quiere que se inserte el texto. El texto "etiqueta innecesaria" se ubicó a la derecha por encima de la posición donde se hace clic. La figura debería verse así:


Otros comandos que pueden usarse con el comando plot son:
  • clf (borra el gráfico actual, lo deja en blanco)
  • figure (abre una nueva ventana figure para graficar, y se preserva la figura previa)
  • close (cierra la ventana de la figura actual)
  • loglog (igual que plot, excepto que ambos ejes se escalan en Log10)
  • semilogx (igual que plot, excepto que el eje x se escala en Log10)
  • semilogy (igual que plot, excepto que el eje y se escala en Log10)
  • grid (agrega una grilla al gráfico)


viernes, 9 de diciembre de 2011

SISTEMAS DE ECUACIONES LINEALES

Sistemas de ecuaciones lineales
Un sistema de ecuaciones lineales es:
a11x1+a12x2+a13x3++a1NxN
=
b1
a21x1+a22x2+a23x3++a2NxN
=
b2
a21x1+a22x2+a23x3++a2NxN
=
b3
=
aM1x1+aM2x2+aM3x3++aMNxN
=
bM

siempre puede expresarse de la forma
ax=b
Pero una formulación tan sencilla suele esconder grandes complicaciones. Todos coincidiremos en que aparentemente la solución del problema anterior es:
x=a-1b
Pero el problema numérico va mucho más allá. La inversa de una matriz sólo existe cuando ésta es regular y no siempre tendremos tanta suerte. Buscamos una solución al problema general de la forma
a(M N)x(N)=b(M)
En el que no siempre existe una inversa para a. Este análisis mucho más general requiere conocimientos que se escapan en parte de los cursos de cálculo numérico y plantea una dificultad adicional: el manejo intuitivo de matrices y vectores. Cuando uno se sumerge en el mundo del cálculo matricial es bueno que encuentre modos de equivocarse lo menos posible. Es muy común que multiplicaciones de matrices incompatibles acaben con un algoritmo brillante. No siempre trabajaremos con vectores columna post multiplicando matrices cuadradas. Un truco bastante utilizado en el cálculo numérico es utilizar una notación parecida a la de Einstein en la que aparecen las filas y columnas como coordenadas co variantes y contra variantes:
ajixi=bj
La regla mnemotécnica es que los índices que aparezcan repetidos como subíndices y superíndices de izquierda a derecha representan un sumatorio y desaparecen en el resultado final. La regla se mantiene en la solución, obviamente con permutación de los índices:
xi=(a-1)ijbj

Esta notación es especialmente útil porque ayuda a no equivocarse en los cálculos, subíndice son filas y superíndice son columnas. Por ejemplo para el producto de dos vectores el producto interno (producto escalar) sería:
xjyj=k
donde k es un escalar. En cambio si los dos vectores aparecen permutados obtenemos el producto externo de dos vectores en el que se amplían los índices:
yjxi=aji
Para entender perfectamente la siguiente operación utilizaremos Matlab:
>> y=ones(3,1);
>> x=2*ones(1,3);
>> x*y
ans = 6
>> y*x
ans =
  2  2  2
  2  2  2
  2  2  2

Todo ello es útil cuando tenemos operaciones un poco más complejas como la siguiente:
ykzkakixibj
¿Cuáles serán las dimensiones de la matriz (o vector o escalar) resultante? Tenemos claro desde un principio que a es una matriz, x un vector columna e y y z son vectores fila. Sin hacer ningún cálculo sabemos que la solución tiene la forma:
ykzkakixibj=cj
donde la repetición de índices en una misma posición significa operación escalar y no matricial. Vamos a exponer un ejemplo de la operación para conseguir una idea más gráfica:
octave:27> y
y =
  4  4  4
octave:28> z
z =
  5  5  5
octave:29> a
a =
  2  2  2
  2  2  2
  2  2  2
octave:30> x
x =
  3
  3
  3
octave:31> b
b =
  1
  1
  1
octave:32> (((y.*z)*a)*x)*b
ans =
  1080
  1080
  1080

Pero centrémonos más en el problema importante:
aijxj=bi
Es el problema más importante del análisis numérico. Casi todos algoritmos se reducen al planteamiento de un sistema de ecuaciones lineales. Los más interesantes son los que vienen de una ecuación en derivadas parciales. Las diferencias finitas, volúmenes finitos, elementos finitos y métodos espectrales terminan en la formulación de un problema de este tipo. El análisis preciso de estos problemas es una parte esencial de cualquier curso de análisis numérico y tiene muchos claros y oscuros dependiendo siempre de la forma de la matriz a. El siguiente árbol clasifica la mayoría de los problemas con su tratamiento:
  • a es cuadrada y regular
    • a no tiene ninguna estructura reconocible
      • La mayoría de los elementos de a son no nulos. Métodos directos o iterativos dependiendo del tamaño de la matriz.
      • La mayoría de los elementos de a son nulos. Matrices sparse. Resolución por métodos iterativos.
    • a tiene una estructura determinada
      • a es tridiagonal. Resolución por un método directo. No disponible en Matlab.
      • a es hermitiana (a=a⊤′). Resolución por un método directo. No disponible en Matlab.
  • a es subcondicionada o cuadrada singular. Descomposición en valores singulares o SVD (pseudoinversa)
  • a es sobrecondicionada, es decir, rectangular con más filas que columnas. Es un problema de mínimos cuadrados o de SVD (pseudoinversa)
No disponible en Matlab significa que no tiene ningún método especial para resolver este tipo de problemas. Debemos utilizar el método de resolución general, el operador resolución de sistemas de ecuaciones lineales .