Sei sulla pagina 1di 124

UNIVERSIDAD AUTNOMA AGRARIA

ANTONIO NARRO
DEPARTAMENTO DE ESTADSTICA Y CLCULO
Aplicacin de Matrices Usando MATLAB
M. C. Flix de Jess Snchez Prez
M. C. Sergio Snchez Martnez
Aplicacin de Matrices Usando Matlab
Este material fue realizado con el apoyo de las autoridades del Consejo Estatal de
Ciencia y Tecnologa
Blvd. Venustiano Carranza No. 1850.
Col. Republica
Tel. 01 800 375 93 66Paseo
Saltillo, Coahuila
ii
Mayo 2010
Prlogo
El adelanto que ha alcanzado el uso de programas computacionales en diferentes
reas del conocimiento, en particular en la educacin, nos plantean la necesidad de
investigar y profundizar en el rea de desarrollo de software de tipo libre, que tenga
la flexibilidad de ajustarse y modificarse segn el avance de las tecnologas.
Dado el avance en el desarrollo de software de tipo comercial con la finalidad de
resolver problemas matemticos sofisticados, urge contar con material educativo que
realice estas mismas funciones de manera gratuita, ya que el uso de software
comercial implica muchos recursos econmicos, que los estudiantes no estn en
condiciones de hacer. Esta situacin se acenta ms en el rea silvoagropecuaria
dado que los estudiantes provienen de diferentes instituciones educativas con muy
diversos programas de estudio y en muchos de los casos no tienen acceso ni
siquiera al uso de una computadora con las mnimas herramientas de trabajo. La
problemtica anterior da origen a que el estudiante a nivel profesional tendr que
empezar a usar dichos programas computacionales, los cuales estn destinados a
personas que poseen una cierta capacitacin previa en el rea de computo.
Entonces, desarrollando programas en Matlab en el rea de algebra lineal, que
cuente con una interfase amigable y fcil de entender se hace necesario para elevar
el nivel educativo en las distintas instituciones dedicadas al rea antes mencionada.
No ser necesario que el estudiante sea un erudito en el rea del algebra lineal, sino
que solamente usar las distintas tcnicas de aplicacin para la resolucin de
problemas reales.
Este documento se ha constituido en cuatro captulos. En el primero se familiariza al
lector con el programa Matlab. En el segundo se aplican las diferentes metodologas
para resolver problemas de lgebra matricial, en el tercero se hace una amplia
explicacin en el manejo de grficos en Matlab y el captulo cuatro se estudian
problemas de programacin lineal.
M.C. Flix de Jess Snchez Prez
M.C. Sergio Snchez Martnez
Departamento de Estadstica y Clculo
iii
Universidad Autnoma Agraria Antonio Narro
Contenido
1.
Conociendo el ...................................................vi
MATLAB...............................................................vi
1.1 Introduccin.....................................................................................................................vii
1.2 Uso del Help....................................................................................................................xii
1.3 El entorno de trabajo de MATLAB...............................................................................xiv
1.3.1 El Escritorio de MATLAB (Matlab Desktop) ......................................................... xv
1.3.2 Command Window .................................................................................................. xv
1.3.3 Command History Browser ................................................................................... xvi
1.3.4 Current Directory Browser ................................................................................... xvii
1.3.5 Path de MATLAB: establece el camino de bsqueda ........................................ xvii
1.3.6 Workspace Browser Array Editor ....................................................................... xviii
1.3.7 El Editor/Debugger ................................................................................................. xix
1.3.8 El Profiler ................................................................................................................ xx
Operaciones con ..............................................xxi
Matrices y Vectores..........................................xxi
2.1 Introduccin....................................................................................................................xxi
2.2 Definicin de matrices desde el teclado.......................................................................xxiii
2.3 Operaciones con Matrices.............................................................................................xxvi
2.3.1 Operadores Aritmticos ........................................................................................ xxvi
2.3.2 Operadores para la resolucin de Sistemas de Ecuaciones Lineales .................. xxviii
2.3.3 Operadores elemento a elemento .......................................................................... xxxi
2.4 Tipos de Datos..............................................................................................................xxxi
2.4.1 Nmeros reales de doble precisin ....................................................................... xxxii
2.4.2 Otros tipos de variables: Integer, Float y Logical .............................................. xxxiii
2.4.3 Nmeros complejos: Funcin complex ............................................................... xxxvi
2.4.4 Cadenas de caracteres ...................................................................................... xxxviii
2.5 Variables y expresiones matriciales........................................................................xxxviii
2.6 Otras formas de definir Matrices...............................................................................xxxix
2.6.1 Tipos de Matrices Predefinidas ................................................................................. xl
2.6.2 Formacin de una Matriz a partir de otras ............................................................... xli
2.6.3 Direccionamiento de Vectores y Matrices a partir de Vectores ............................ xliii
2.6.4 Operador dos Puntos ............................................................................................... xlv
2.6.5 Matriz vaca A[ ]. Borrado de filas o columnas .......................................................... l
2.6.6 Definicin de vectores y Matrices a partir de un archivo .......................................... li
2.7 Operadores relacionales....................................................................................................li
2.8 Operadores Lgicos.........................................................................................................lii
2.9 Funciones de Librera....................................................................................................liii
iv
2.10 Funciones Matemticas elementales que operan a modo de escalar............................liv
2.10.1 Funciones que actan sobre Vectores ..................................................................... lv
2.10.2 Funciones que actan sobre Matrices ................................................................... lvi
2.10.3 Funciones Matriciales Especiales. ........................................................................ lvii
2.10.4 Funciones de Factorizacin y/o Descomposicin Matricial ................................ lvii
2.11 Ms sobre operadores relacionales con vectores y matrices...........................................lx
2.12 Otras funciones mas que actan sobre vectores y matrices.........................................lxiii
Graficos en MATLAB ......................................lxiv
(2D y 3D).........................................................lxiv
3.1 Introduccin.................................................................................................................lxiv
3.2 Funciones grficas 2D elementales...............................................................................lxv
3.2.1 Funcin plot() ...................................................................................................... lxviii
3.2.2 Comando subplot .................................................................................................... lxx
3.2.3 Control de los ejes: Funcin axis() ....................................................................... lxxi
3.2.4 Control de ventanas graficas: funcin figure ........................................................ lxxii
3.2.5 Funcin fill para polgonos. ................................................................................ lxxiii
3.3 Grficos Tridimensionales........................................................................................lxxiv
3.3.1 Tipos de funciones graficas tridimensionales. ...................................................... lxxv
3.3.2 Dibujo de mallas: funciones meshgrid, mesh y surf ............................................ lxxvi
3.3.3 Dibujo de lneas de contorno: funciones contour y contour3 ............................ lxxvii
3.3.4 Utilizacin del color en grficos 3D .................................................................... lxxix
3.3.5 Dibujo de superficies faceteadas. ......................................................................... lxxx
3.3.6. Otras funciones grficas 3D ................................................................................ lxxxi
Preludio a la programacin.........................lxxxiii
lineal y no lineal...........................................lxxxiii
4.1 Introduccin............................................................................................................lxxxiii
4.2. Antecedentes.............................................................................................................lxxxiv
4.3 Conjuntos convexos...............................................................................................lxxxiv
4.4 Funciones convexas................................................................................................lxxxv
4.5 Planteamiento del modelo.....................................................................................lxxxvi
4.6 Determinacin geomtrica de programas ............................................................lxxxviii
matemticos...................................................................................................................lxxxviii
4.7 Mtodo grfico con MATLAB...............................................................................lxxxix
4.8 Mtodo grfico alternativo con MATLAB..................................................................xci
4.8.1 Convex hull ........................................................................................................ xcii
4.8.2 Teorema de la solucin bsica factible. ............................................................. xciv
4.8.3 Teorema de la resolucin ..................................................................................... xcv
4.9 Mtodo Simplex............................................................................................................cii
4.9.1 Ruptura de las desigualdades ................................................................................. ciii
4.9.2 Uso de variables artificiales ................................................................................... civ
4.9.3 Solucin ptima por enteros .................................................................................. civ
4.10 Solucin a la programacin lineal con MATLAB..................................................cviii
4.11 Programacin Dual..................................................................................................cx
4.12 Programacin no lineal ..........................................................................................cxv
v
4.12.1 La funcin fmincon de MATLAB ...................................................................... cxvi
4.12.2 Programacin cuadrtica .................................................................................. cxviii
Conociendo el
MATLAB
vi
1
1.1 Introduccin
MATLAB es el nombre abreviado de MATrix LABoratory. Es un
programa que sirve para realizar clculos numricos con vectores y
matrices. Como caso particular puede tambin trabajar con nmeros
escalares, reales , complejos, imaginarios, cadenas de caracteres y
otras estructuras de informacin ms complejas.
Una de las capacidades ms atractivas es la de realizar una amplia
variedad de grficos de dos y tres dimensiones. MATLAB tiene tambin
un lenguaje propio de programacin, que a comparacin con otros
lenguajes, ste es mucho ms amigable y cuenta con una gama amplia
de aplicaciones.
MATLAB es un gran lenguaje de programacin del tipo calculo tcnico y
cientfico que para ciertas operaciones es mucho ms rpido que otros
lenguajes que existen en el mercado, esto aprovechando la capacidad
de vectorizacin con que cuenta el lenguaje. En otras aplicaciones
resulta un poco mas lento que el cdigo equivalente desarrollado en por
ejemplo C/C++ o Fortran.
En la versin 2009a, que es con la que vamos a trabajar, MATLAB
cuenta con un acelerador JIT (Just In Time), que mejora
significativamente la velocidad de ejecucin de los ficheros *.m,
(ficheros propios de MATLAB) en ciertas circunstancias, por ejemplo
cuando no se hacen llamados a otros ficheros *.m, no se utilizan
estructuras y clases, etc. Aunque limitado en ese momento, cuando es
aplicable la propiedad de vectorizacin de los algoritmos mejora
sensiblemente la velocidad.
En cualquier caso, el lenguaje de programacin de MATLAB siempre es
una magnifica herramienta de alto nivel para desarrollar aplicaciones
tcnicas, de fcil manejo y que, como ya se ha dicho, aumenta de gran
manera la productividad de los programadores respecto a otros
entornos de desarrollo.
MATLAB dispone de un cdigo bsico y de muchas libreras
especializadas llamadas toolboxes que como su nombre lo dice son
herramientas ya creadas con un fin especifico, lo cual es otra de las
grandes bondades y ventajas de usar un entorno de desarrollo como
ste.
El programa se puede arrancar como cualquier otra aplicacin de
Windows, dando clic dos veces en el icono correspondiente en el
escritorio o por medio del men inicio.
vii
Al arrancar MATLAB se abre una ventana similar a la mostrada en la
figura 1.1. Esta es la vista que se obtiene eligiendo la opcin Desktop
Layout/Default, en el men Desktop. Como esta configuracin puede
ser cambiada fcilmente por el usuario, es posible que en muchos
casos concretos lo que aparezca sea muy diferente, en cualquier caso,
una vista similar se puede conseguir con el citado comando antes
mencionado. Esta ventana inicial requiere de algunas explicaciones que
a continuacin se enuncian.
Figura 1.1. Ventana inicial de Matlab 2009a
La parte ms importante de la ventana inicial es la parte central
(ventana ms grande), llamada Command Window, que incluso puede
existir sola sin las dems ventanas que le acompaan.
En esta sub-ventana es donde se ejecutan los comandos de MATLAB,
en seguida del prompt (aviso) caracterstico de este lenguaje de
programacin (fx >>), que indica que el programa est preparado para
recibir instrucciones. En la pantalla mostrada en la figura 1.1 se ha
ejecutado el comando A=magic(6), mostrndose a continuacin el
resultado proporcionado por MATLAB.
El comando magic(6) crea una matriz de tamao 6*6, la cual al ser
sumada por filas, por columnas o en diagonal, siempre dar el mismo
resultado.
En la parte izquierda aparecen dos sub-ventanas que son de mucha
utilidad: en la parte superior aparece la llamada Current Directory, que
viii
muestra los documentos del directorio activo o actual. El directorio
activo se puede cambiar desde el Command Window, o desde la
propia ventana con los mtodos de navegacin de directorios propios
de Windows. Haciendo click dos veces sobre alguno de los archivos
*.m del directorio activo se abre el editor de documentos de MATLAB,
herramienta fundamental para la programacin sobre la que
hablaremos ms delante.
En la parte inferior se muestra un pequeo navegador que me permite
seleccionar alguno de los documentos creados para checar detalles en
caso de ser necesario.
Pasando a la parte derecha en donde tambin aparecen dos sub-
ventanas, las cuales son el Workspace y el Command History que
sirven para lo siguiente.
El Workspace contiene informacin sobre todas las variables que se
hayan definido en esta sesin y permite ver y modificar las matrices o
vectores con los que se est trabajando.
En la parte inferior derecha se encuentra el Command History que
muestra los ltimos comandos ejecutados en el Command Window.
Estos comandos se pueden volver a ejecutar haciendo doble click
sobre ellos. As mismo si la accin la ejecutamos con el botn derecho
del ratn sobre cualquier comando se mostrar un men contextual con
las posibilidades disponibles en ese momento. Para editar uno de estos
comandos hay que copiarlo antes en el Command Window.
En la parte inferior izquierda de la pantalla aparece el botn Start, con
una funcin anloga a la del botn Inicio de Windows. Start da acceso
inmediato a ciertas capacidades del programa. La figura 1.2. muestra
algunas de las posibilidades antes mencionadas.
ix
Figura 1.2. Men Start
Puede hacerse que al arrancar MATLAB se ejecute automticamente
un archivo, de modo que aparezca por ejemplo un saludo inicial
personalizado. Esto se hace mediante un archivo de comandos que se
ejecuta de modo automtico cada vez que se entra en el programa (el
archivo startup.m, que deber estar en un directorio determinado, por
ejemplo C:\matlab2009\Work)
Para apreciar desde el principio la gran potencia de MATLAB, se puede
comenzar por escribir en la Command Window la siguiente lnea, a
continuacin del prompt. Al final se deber pulsar la tecla de enter.
>> A=rand(6), B=inv(A), B*A
La respuesta de MATLAB despus de presionar enter, ser:
A =
0.8147 0.2785 0.9572 0.7922 0.6787 0.7060
0.9058 0.5469 0.4854 0.9595 0.7577 0.0318
0.1270 0.9575 0.8003 0.6557 0.7431 0.2769
0.9134 0.9649 0.1419 0.0357 0.3922 0.0462
0.6324 0.1576 0.4218 0.8491 0.6555 0.0971
0.0975 0.9706 0.9157 0.9340 0.1712 0.8235
B =
0.8891 2.4498 -0.8206 -0.1344 -2.6745 -0.2580
-0.7400 -0.4573 0.2516 0.7079 0.4624 0.4733
3.0570 10.2424 0.6679 -3.7108 -13.1555 -1.4818
-1.0410 -0.2263 -0.6094 -0.1742 1.9017 0.8917
-1.1175 -7.1582 1.1638 2.1185 8.4414 -0.2710
-1.2197 -9.3966 -0.4928 3.0654 10.4896 1.3799
ans =
1.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000
-0.0000 1.0000 -0.0000 -0.0000 -0.0000 -0.0000
-0.0000 0.0000 1.0000 -0.0000 -0.0000 -0.0000
x
-0.0000 -0.0000 -0.0000 1.0000 -0.0000 -0.0000
-0.0000 -0.0000 -0.0000 -0.0000 1.0000 -0.0000
-0.0000 -0.0000 -0.0000 -0.0000 -0.0000 1.0000
En realidad en la lnea de comandos anterior se han escrito tres
instrucciones diferentes, separadas por comas, como consecuencia, la
respuesta del programa tiene tres partes tambin, cada una de ellas
correspondiente a una de las instrucciones. Con la primera instruccin
se define una matriz cuadrada de tamao 6*6 llamada A, cuyos
elementos son nmeros aleatorios entre cero y uno (aunque aparezcan
solo cuatro cifras en realidad han sido calculados con 16 cifras de
precisin). En la segunda instruccin se define una matriz B que es
igual a la matriz inversa de la matriz A. finalmente se ha multiplicado la
matriz B por la matriz A, y se comprueba que el resultado es la matriz
llamada matriz identidad.
Es con grandes matrices o grandes sistemas de ecuaciones como
MATLAB obtiene toda la potencia de la computadora. Por ejemplo, las
siguientes instrucciones permiten calcular la potencia de clculo de la
computadora en Megaflops (millones de operaciones aritmticas por
segundo). En la primera lnea se crean tres matrices de tamao
1000*1000, las dos primeras con valores aleatorios y la tercera con
valores cero. La segunda lnea toma tiempos, realiza el producto de
matrices, vuelve a tomar tiempos y calcula de modo aproximado el
nmero de millones de operaciones realizadas. La tercera lnea calcula
los Megaflops por segundo, para lo cual utiliza la funcin propia de
MATLAB etime() que calcula el tiempo transcurrido entre dos instantes
definidos por dos llamadas a la funcin clock
>> n=1000; A=rand(n); B=rand(n); C=zeros(n);
>> tini=clock; C=B*A; tend=clock; mflops=(2*n^3)/1000000;
>> mflops/etime(tend,tini)
La respuesta es
ans =
6.4103e+003
Lo cual me representa el nmero 6410.3 millones de operaciones por
segundo para esta computadora.
Un pequeo aviso antes de seguir adelante. Adems de que con el con
el Command History, es posible recuperar comandos anteriores de
xi
MATLAB y moverse por dichos comandos con el ratn y con las teclas
y
. Al pulsar la primera de dichas flechas aparecer el comando
que se haba introducido inmediatamente antes. De modo anlogo es
posible moverse sobre la lnea de comandos con las teclas
y
, ir
al principio de la lnea con la tecla de Inicio, al final con la tecla Fin, y
borrar toda la lnea con Esc. Recurdese que solo hay una lnea activa
(la ultima).
Para borrar todas las salidas anteriores de MATLAB y dejar limpia la
Command Window se pueden utilizar las funciones clc y home. La
funcin clc (clear console) elimina todas las salidas anteriores mientras
que la funcin home las mantiene, pero lleva el prompt a la primera
lnea de la ventana.
Si se desea salir de MATLAB basta con teclear uno de los siguientes
comandos quit o exit
1.2 Uso del Help
MATLAB 2009a dispone de un excelente men Help (ayuda) con el que
se puede encontrar la informacin que se desee. La figura1.3. muestra
las distintas opciones que aparecen en el men de ayuda de la ventana
principal de aplicacin:
Figura 1.3. Men Help
En seguida daremos una breve explicacin sobre algunos de los
submens que se desplegan dentro del men Help.
xii
1. Product Help. Se abre una ventana como la mostrada en la
figura 1.4. en la que se puede buscar ayuda general sobre MATLAB,
funcin o concepto que queramos consultar. La portada de esta ayuda
tiene tres captulos principales: functions, que contiene informacin de
referencia sobre las funciones por orden alfabtico o por categoras;
Handle Graphics, que permite acceder a informacin concreta sobre
las distintas propiedades de los objetos grficos; Documentation Set,
que da acceso a versiones completas de los manuales del programa en
formato de pantalla fcilmente navegable (con apartados de Getting
Started, User Guides, Programming Tips y Examples in
Documentation), Product Demos (con una coleccin de ejemplos
programados que se pueden ejecutar y cuyo cdigo se puede examinar
para ver como estn programados), Whats New (con las novedades de
esta versin con respecto a la anterior), Printing the Documentation Set
(que permite abrir documentos PDF(Portable Document Format), que
se corresponden con las versiones en papel de los manuales del
programa, y que precisan del programa Adobe Acrobat Reader 5.0 o
superior). Las restantes pestaas de esta ventana dan acceso a un
ndice por palabras (Index), a un formulario de bsqueda (Search) y a
la coleccin de ejemplos ya programados antes citada (Demos)
Figura 1.4. Submen Product Help
2. Using the Desktop. Se abre una ventana de ayuda con un
formato similar a la ventana ya descrita con informacin detallada sobre
como utilizar y configurar el entorno de desarrollo o Desktop. Las
distintas herramientas disponibles se describen sucesivamente. Cada
pgina dispone de flechas y enlaces que permiten ir a la pgina
siguiente o volver a la anterior. Es posible tambin imprimir aquellas
xiii
pginas que se desee consultar o archivar en papel. Una caracterstica
muy importante es la posibilidad de organizar las ventanas con gran
flexibilidad, agrupndolas o independizndolas segn los propios gustos
o deseos.
3. Using Command Window. Esta opcin del men Help d<a
acceso a la informacin necesaria para aprovechar las capacidades de
la Comman Window, que es el corazn de MATLAB.
4. Web Resourses. La frase Error! No se encuentra el origen de
la referencia. Muestra algunas direcciones de internet con informacin
interesante sobre MATLAB. Todas ellas corresponden a distintas
secciones de la web de The Mathworks (la empresa que desarrolla y
comercializa MATLAB), cuya pgina de inicio se muestra en primer
lugar.
5. Check For Updates. MATLAB se conecta con The Mathworks
y comprueba si hay versiones ms recientes de los productos
instalados, si se es un usuario registrado, es posible descargar las
versiones ms actuales.
6. Demos. Se abre una ventana que da acceso a un buen numero
de ejemplos resueltos con MATLAB, cuyos resultados se presentan
explcitamente y de diversas formas. Es de vital inters recorrer estos
ejemplos para hacerse una idea mas clara de las diversas posibilidades
del programa.
1.3 El entorno de trabajo de MATLAB
El entorno de trabajo de MATLAB es muy grfico e intuitivo, similar al
de otras aplicaciones profesionales de Windows, en la figura numero 1
ya se han citado algunos de los componentes ms importantes de este
entorno de trabajo o desarrollo. Ahora hemos de explicar estas
componentes un poco ms a detalle.
Las componentes mas importantes del entorno de trabajo de MATLAB
2009 a son las siguientes:
1. El escritorio de MATLAB (Matlab Desktop), que es la ventana o
contenedor de mximo nivel en la que se pueden situar las dems
componentes.
xiv
2. Las componentes individuales, orientadas a tareas concretas, entre
las que se pueden citar las siguientes:
a) La ventana de comandos (Command Window)
b) La ventana histrica de comandos (Command History)
c) El espacio de trabajo (Workspace)
d) La plataforma de lanzamiento (Launch Pad)
e) El directorio actual (Current Directory)
f) La ventana de ayuda (Help)
g) El editor de documentos y depurador de errores (Editor and
Debugger)
h) El editor de vectores y matrices (Array Editor)
i) La ventana que permite estudiar como se emplea el tiempo de
ejecucin (Profiler)
A continuacin se describen brevemente estas componentes. Tngase
en cuenta que utilizar MATLAB y desarrollar programas para MATLAB
es mucho mas fcil si se conoce bien este entorno de trabajo. Para
alcanzar la mxima productividad personal en el uso de esta aplicacin
es por ello de vital importancia leer con atencin las secciones
siguientes.
1.3.1 El Escritorio de MATLAB (Matlab Desktop)
El Matlab Desktop es la ventana ms general de la aplicacin.
El resto de las ventanas o componentes citadas pueden alojarse
en sta o ejecutarse como ventanas independientes. A su vez,
los componentes alojados en el escritorio pueden aparecer como
sub-ventanas independientes o como pestaas dentro de una de
las sub-ventanas. MATLAB ofrece una gran flexibilidad al
respecto y es cada usuario quien decide en que forma desea
utilizar la aplicacin.
Cuando se arranca MATLAB por primera vez o cuando se
ejecuta el comando View/Desktop Layout/Default aparece una
ventana como la mostrada en la figura 1.1.
1.3.2 Command Window
Esta es la ventana en la que sed ejecutan interactivamente las
instrucciones de MATLAB y en donde se muestran los resultados
correspondientes, si es el caso. En cierta forma es la ventana ms
importante y la nica que exista en las primeras versiones de la
xv
aplicacin. En esta nueva versin se han aadido algunas mejoras
significativas, como las siguientes:
1. Se permiten lneas de comandos muy largas que
automticamente siguen en la lnea siguiente al llegar al
margen derecho de la ventana. Para ello hay que activar la
opcin Wrap Lines, en el men File/Preferences/Command
Window.
2. Haciendo click con el botn derecho sobre el nombre de una
funcin que aparezca en esta ventana se tiene acceso a la
pagina del Help sobre dicha funcin. Si el cdigo fuente esta
disponible, tambin se puede acceder al archivo
correspondiente por medio del Editor/Debugger.
3. Comenzando a teclear el nombre de una funcin y pulsando la
tecla de Tab, MATLAB completa automticamente el nombre
de la funcin, o bien muestra en la lnea siguiente todas las
funciones disponibles que comienzan con las letras tecleadas
por el usuario.
4. Cuando al ejecutar un archivo .m se produce un error y se
obtiene el correspondiente mensaje en la Command Window,
MATLAB muestra mediante un subrayado un enlace a la lnea
del archivo fuente en el que se ha producido el error. Haciendo
click en ese enlace se puede acceder a la lnea
correspondiente del archivo por medio del Editor/Debugger.
1.3.3 Command History Browser
La vantana Command History ofrece acceso a las sentencias
que se han ejecutado anteriormente en la Command Window .
estas sentencias estn tambin accesibles por medio de las
teclas
y
como en versiones anteriores, pero esta ventana
facilita mucho el tener una visin ms general de lo hecho
anteriormente y seleccionar lo que realmente se desea repetir.
Las sentencias ejecutadas anteriormente se pueden volver a
ejecutar mediante un doble click o por medio del men
contextual que se abre al dar click sobre ellas con botn derecho
del ratn. Tambin se pueden copiar y volcar sobre la lnea de
comandos, pero se ha de copiar toda la lnea, sin que se admita
la copia de un fragmento de la sentencia. Existen opciones para
borrar algunas o todas las lneas de esta ventana. Se puede
xvi
tambin hacer un profile (evaluar la eficiencia relativa) de una
sentencia o de un grupo de ellas.
1.3.4 Current Directory Browser
El concepto de directorio activo o directorio actual es muy
importante en MATLAB. Los programas se encuentran en
archivos con la extensin .m. Estos archivos se ejecutan
tecleando su nombre en la lnea de comandos (sin la extensin),
seguido de los argumentos entre parntesis, si se trata de
funciones. No todos los archivos con esta extensin que se
encuentran en el disco duro o en otra unidad de almacenamiento
son accesibles. Para que un archivo con esta extensin se pueda
ejecutar es necesario que cumpla con una de las condiciones
siguientes.
1. Que est en el directorio actual. MATLAB mantiene en todo
momento un nico directorio con esta condicin. Este
directorio es el primer sitio en el que MATLAB busca cuando
desde la lnea de comandos se le pide que se ejecute un
archivo.
2. Que est en uno de los directorios indicados en el Path de
MATLAB. El Path es una lista ordenada de directorios en los
que el programa busca los archivos o las funciones que ha de
ejecutar. Muchos de los directorios del Path son propios de
MATLAB, pero los usuarios tambin pueden aadir sus
propios directorios, normalmente al principio o al final de la
lista.
1.3.5 Path de MATLAB: establece el camino de bsqueda
MATLAB puede llamar a una gran variedad de funciones, tanto
propias como programadas por los usuarios. Puede incluso
haber funciones distintas con el mismo nombre. Interesa saber
cuales son las reglas que determinan que funcin o que archivo
es el que se va a ejecutar cuando su nombre aparezca en una
lnea de comandos del programa. Esto queda determinado por el
camino de bsqueda (Search Path) que el programa utiliza
cuando se encuentra el nombre de una funcin.
xvii
El Search Path de MATLAB es una lista de directorios que se
pueden ver y modificar a partir de la lnea de comandos. O
utilizando el cuadro de dialogo Set Path, del men File. El
comando Path hace que se escriba el Search Path de MATLAB
(el resultado depende de en que directorio este instalado
MATLAB; se muestran solo unas pocas lneas de la respuesta
real del programa):
>> path
MATLABPATH
C:\MATLAB\R2009a\toolbox\matlab\general
C:\MATLAB\R2009a\toolbox\matlab\ops
C:\MATLAB\R2009a\toolbox\matlab\lang
C:\MATLAB\R2009a\toolbox\matlab\elmat
.
.
.
C:\MATLAB\R2009a\toolbox\rtw\targets\xpc\target\build\xpcblocks
C:\MATLAB\R2009a\toolbox\rtw\targets\common\can\blocks\tlc_c
C:\MATLAB\R2009a\toolbox\rtw\targets\xpc\xpcdemos
C:\MATLAB\R2009a\toolbox\rtw\targets\xpc\xpc\xpcmngr
C:\MATLAB\R2009a\toolbox\rtw\targets\xpc\target\kernel\embedded
Para ver como se utilize el Search Path supngase que se utiliza
la palabra nombre1 en un comando, el proceso que sigue el
programa para tratar de conocer que es nombre1 es el siguiente.
1. Comprueba si nombre1 es una variable previamente definida
por el usuario
2. Comprueba si nombre1 es una funcin interna o intrnseca de
MATLAB
3. Comprueba si nombre1 es una sub-funcion o una funcin
privada del usuario
4. Comprueba si hay un archivo llamado nombre1.mex,
nombre1.dll o nombre1.m en los directorios incluidos en el
search path de MATLAB
1.3.6 Workspace Browser Array Editor
xviii
El espacio de trabajo de MATLAB (Workspace) es el conjunto
de variables y de funciones de usuario que en un determinado
momento estn definidas en la memoria del programa o de la
funcin que se est ejecutando. Para obtener informacin sobre
el Workspace desde la lnea de comando se pueden utilizar los
comandos who y whos. El segundo proporciona una informacin
mas detallada que el primero. Por ejemplo, una salida tpica del
comando whos es la siguiente:
>> whos
Name Size Bytes Class Atributes
A 1x3 24 double
B 2x3 48 double
c 1x1 8 double
d 1x1 8 double
e 5x1 40 double
Estas son las variables del espacio de trabajo base (el de la lnea
de comandos de MATLAB).
1.3.7 El Editor/Debugger
En MATLAB tiene particular importancia los ya citados archivos
con extensin .m ( o M.files). son archivos de texto ASCII, con la
extensin mensionada que contienen conjuntos de comandos o
definicin de funciones. La importancia de estos archivos es que
al teclear su nombre en la lnea de comandos y pulsar enter, se
ejecutan uno tras otro todos los comandos contenidos en dicho
archivo. El poder guardar instrucciones y grandes matrices en un
archivo permite ahorar mucho trabajo de tecleado.
Aunque los archivos se pueden crear con cualquier editor de
textos ASCII tal como Notepad, MATLAB dispone de un editor
propio que permite tanto crear y modificar estos archivos, como
ejecutarlos paso a paso para ver si contienen errores (proceso
de depuracin Debugg). La figura 1.6. muestra la ventana
principal del Editor/Debugger, en la que se ha tecleado un
archivo llamado prueba1.m, que contiene un comentario y seis
sentencias. El editor muestra con diferentes colores los
diferentes tipos o elementos constitutivos de los comandos. El
Editor se preocupa tambin de que las comillas o parntesis que
se abren, no se queden sin el correspondiente elemento de
xix
cierre. Colocando el cursor antes o despus de una apertura o
cierre de corchetes o parntesis y pulsando las teclas flecha
izquierda o flecha derecha, el Editor muestra con que cierre o
apertura de corchetes o parntesis se empareja el elemento
considerado; si no se empareja con ninguna, aparece con una
rayita de tachado.
Figura 1.6. ejecucin interactiva con el editor Debugger
La figura 1.6. corresponde a una ejecucin del archivo de
comandos controlada con el Debugger. Dicha ejecucin se
comienza eligiendo el comando Run en el men Debug,
pulsando la tecal F5, dando click en el botn Continue ( ) de la
barra de herramientas del editor o tecleando el nombre del
archivo en la lnea de comandos de la Command Window. Los
puntos rojos que aparecen en el margen izquierdo son
Breakpoints (puntos en los que se detiene la ejecucin del
programa); la flecha verde en el borde izquierdo indica la
sentencia en que est detenida la ejecucin (antes de ejecutar
dichas sentencia); cuando el cursor se coloca sobre una variable
aparece una pequea ventana con los valores numricos de
dicha variable, tal como se aprecia.
1.3.8 El Profiler
El profiler es un programa de utilidad que permite saber como
se ha empleado el tiempo de l CPU en la ejecucin de un
determinado programa. El profiler es una herramienta muy til
para determinar los cuellos de botella de un programa, es decir
las funciones y las lneas de cdigo que ms veces se llaman y
que se llevan la mayor parte del tiempo de ejecucin. Por
ejemplo, es obvio que si se trata de mejorar la eficiencia de un
xx
programa, sera mas importante mejorar una funcin que se
llevase el 60% del tiempo total que otra solo le llevar el 2%.
Dentro de la funcin ms llamada, el Profiler proporciona
informacin sobre el tiempo que se lleva cada sentencia, y da
tambin algunas orientaciones sobre las posibilidades de
mejorarla.
Operaciones con
Matrices y Vectores
2.1 Introduccin
En matemticas, una matriz es una tabla bidimensional de nmeros
consistente en cantidades abstractas que pueden sumarse,
multiplicarse, restarse, elevarse a una potencia, etc. Las matrices se
utilizan para describir sistemas de ecuaciones lineales, realizar un
seguimiento de los coeficientes de una aplicacin lineal y registrar los
datos que dependen de varios parmetros. Las matrices se describen
en el campo de la teora de matrices, pueden sumarse, restarse,
multiplicarse y descomponer en varias formas, lo que tambin las hace
un concepto clave en el campo del algebra lineal.
Una matriz es una tabla cuadrada o rectangular de datos (llamados
elementos o entradas de la matriz) ordenados en filas y columnas en
cada una de las lneas verticales. A una matriz con m filas y n
columnas se le denomina matriz m por n (escrito m x n), y a m y n
xxi
2
dimensiones de la matriz. Las dimensiones de una matriz siempre se
dan con el nmero de filas primero y el nmero de columnas despus.
Comnmente se dice que una matriz m por n tiene orden de m x n
(orden tiene el significado de tamao). Dos matrices se dice que son
iguales si son del mismo orden y tienen los mismos elementos.
Al elemento de una matriz que se encuentra en la fila i-esima y la
columna j-esima se le llama elemento i,j o elemento (i,j)-esimo de la
matriz. Se vuelve a poner primero las filas y despus las columnas.
Casi siempre, se denotan a las matrices con letras maysculas mientras
que se utilizan las correspondientes letras en minsculas para denotar
los elementos de las mismas. Por ejemplo, al elemento de una matriz A
que se encuentra en la fila i-esima y la columna j-esima se le denota
como aij. Adems de utilizar letras maysculas para representar
matrices, numerosos autores representan a las matrices con fuente
negrita para distinguirlas de otros tipos de variables. Asi A es una
matriz, mientras que A es un escalar (numero)
Normalmente se escribe mxn ij
a A ) (
para definir una matriz A mxn con
cada entrada en la matriz A[ij] llamada ij
a
para todo
n j y m i 1 1
. Sin embargo, la convencin del inicio de los ndices
i y j en 1 no es universal: algunos lenguajes de programacin
comienzan en cero, en cual caso se tiene
1 0 1 0 n j y m i
.
Una matriz con una sola columna o con una sola fila se denomina a
menudo vector, y se interpreta como un elemento del espacio eucldeo.
Una matriz 1xn (una fila y n columnas) se denomina vector fila, y una
matriz mx1 (una columna y m filas) se denomina vector columna.
Ya se ha comentado que MATLAB es fundamentalmente un programa
para clculo matricial. Inicialmente se utilizar MATLAB como programa
interactivo, en el que se irn definiendo las matrices, los vectores y las
expresiones que los combinan y obteniendo los resultados sobre la
marcha. Si estos resultados son asignados a otras variables, entonces
podrn ser utilizados posteriormente en otras expresiones. En este
sentido MATLAB sera como una potente calculadora matricial (en
realidad es esto y mucho mas).
Antes de tratar de hacer clculos complicados, la primera tarea ser
aprender a introducir matrices y vectores desde el teclado. Ms
adelante se vern formas ms potentes de definir matrices y vectores.
xxii
2.2 Definicin de matrices desde el teclado
Como en casi todo los lenguajes de programacin, en MATLAB las
matrices y vectores son variables que tienen nombres. Ya se vern
luego con mas detalle las reglas que deben cumplir estos nombres. Por
el momento se sugiere que se utilicen letras maysculas para las
matrices y letras minsculas para los vectores y escalares (MATLAB no
exige esto pero puede resultar de mucha utilidad)
Para definir una matriz no hace falta declararla o establecer de
antemano su tamao (de hecho, se puede definir un tamao y
cambiarlo posteriormente). MATLAB determina el nmero de filas y de
columnas en funcin del nmero de elementos que se proporcionan.
Las matrices se definen o introducen por filas; los elementos de una
misma fila estn separados por espacios en blanco o comas, mientras
que las filas estn separadas por pulsaciones de enter o por caracteres
punto y coma (;). Por ejemplo, el siguiente comando define una matriz
A de dimensiones (3 x 3):
>> A=[1 2 3;4 5 6;7 8 9]
La respuesta de MATLAB es la siguiente
A=
1 2 3
4 5 6
7 8 9
A partir de este momento la matriz A est disponible para hacer
cualquier tipo de operacin con ella (adems de valores numricos, en
la definicin de una matriz o vector se pueden utilizar expresiones y
funciones matemticas). Por ejemplo, una sencilla operacin con A es
hallar su matriz traspuesta. En MATLAB el apostrofe () es el smbolo de
transposicin matricial. Para calcular A (traspuesta de A) basta teclear
lo siguiente (se aade a continuacin la respuesta del programa)
>>A
ans=
1 4 7
2 5 8
3 6 9
xxiii
Como el resultado de la operacin no ha sido asignado a ninguna
matriz, MATLAB utiliza un nombre de variable por defecto (ans, de
answer), que contiene el resultado de la ultima operacin. La variable
ans puede ser utilizada como operando en la siguiente expresin que
se introduzca. Tambin podr haberse asignado el resultado a otra
matriz llamada B:
>> B=A
B=
1 4 7
2 5 8
3 6 9
Ahora ya estn definidas las matrices A y B, y es posible seguir
operando con ellas. Por ejemplo, se puede hacer el producto de la
matriz A por la matriz B de la siguiente manera B*A (deber resultar
una matriz simtrica)
>>B*A
ans
66 78 90
78 93 108
90 108 126
En MATLAB se accede a los elementos de un vector poniendo el ndice
entre parntesis (por ejemplo x(3) ox(i)). Los elementos de las matrices
se acceden poniendo los dos ndices entre parntesis separados por
una coma (por ejemplo A(1,2) oA(i,j)). Las matrices se almacenan por
columnas (aunque se produzcan por filas, como se ha indicado
anteriormente), y teniendo en cuenta esto puede accederse a cualquier
elemento de una matriz con un solo subndice. Por ejemplo, si A es una
matriz (3 x 3) se obtiene el mismo valor escribiendo A(1,2) que
escribiendo A(4).
Invertir una matriz es casi tan fcil como transponerla. A continuacin
se va a definir una nueva matriz A (no singular) en la forma:
>>A=[1 4 -3;2 1 5;-2 5 3]
A=
xxiv
1 4 -3
2 1 5
-2 5 3
Ahora calculemos la inversa de la matriz A y el resultado lo
asignaremos a B. para ello basta con hacer uso de la funcin propia de
MATLAB inv() que es la funcin que nos ayuda a encontrar la inversa
de una matriz no singular. (la precisin o numero de cifras que se
muestran en el resultado se puede cambiar con el men
File/Preferences/General):
>>B=inv(a)
B=
0.1803 0.2213 -0.1885
0.1311 0.0246 0.0902
-0.0984 0.1066 0.0574
Para comprobar que este resultado es correcto basta con multiplicar A
por B y comprobar que el resultado es la matriz identidad.
>>B*A
ans
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000
De forma anloga a las matrices, es posible definir un vector fila x en la
forma siguiente (si los nmeros estn separados por blancos o comas,
el resultado ser un vector fila)
>>x=[10 20 30] % vector fila
x=
10 20 30
Por el contrario, si los nmeros estn separados por enter o punto y
coma (;) se obtendr un vector columna:
>>y=[11; 12; 13] % vector columna
y=
11
12
xxv
13
MATLAB tiene en cuenta la diferencia entre vectores fila y vectores
columna. Por ejemplo, si se intenta sumar los vectores x e y se
obtendr el siguiente mensaje de error
>>x+y
??? Error using ==> +
Matrix dimensions must agree.
Estas dificultades desaparecen si se suma x con el vector traspuesto de
y:
>>x+y
ans
21 32 43
MATLAB considera vectores fila por defecto, como se ve en el ejemplo
siguiente:
>>x(1)=1, x(2)=2
x=
1
x=
1 2
A continuacin se van a estudiar estos temas con un poco ms de
detalles.
2.3 Operaciones con Matrices
2.3.1 Operadores Aritmticos
MATLAB puede operar con matrices por medio de operadores y
por medio de funciones. Se han visto ya los operadores suma(+),
producto(*) y traspuesta (), asi como la funcin para invertir una
xxvi
matriz (inv()). Los operadores matriciales de MATLAB son los
siguientes:
+ Suma o adicin
- resta o sustraccin
* Multiplicacin
traspuesta
^ Potenciacin
\ Divisin izquierda
/ Divisin derecha
.* Producto elemento a elemento
./ y .\ divisin elemento a elemento
.^ Elevar a una potencia elemento a elemento
Estos operadores se aplican tambin a las variables o valores
escalares, aunque con algunas diferencias mnimas. Todos estos
operadores son coherentes con las correspondientes
operaciones matriciales: no se puede por ejemplo sumar
matrices que no sean del mismo tamao. Si los operadores no se
usan de modo correcto se obtiene un mensaje de error.
Los operadores anteriores se pueden aplicar tambin de modo
mixto, es decir con un operador escalar y otro matricial. En este
caso la operacin con el escalar se aplica a cada uno de los
elementos de la matriz.
Considrese el siguiente ejemplo:
>>A=[1 2; 3 4]
A=
1 2
2 4
>>A*2
ans=
3 4
6 8
>>A-4
ans
-3 -2
-1 0
MATLAB utiliza el operador de divisin / para dividir por un
escalar todos los elementos de una matriz o un vector. Esto no
xxvii
constituye ninguna sorpresa. Sin embargo, el uso que se
describe a continuacin si requiere de ms atencin.
2.3.2 Operadores para la resolucin de Sistemas de
Ecuaciones Lineales
MATLAB utiliza los operadores de divisin para la resolucin de
sistemas de ecuaciones lineales. Por su gran importancia, estos
operadores requieren una explicacin detenida. Considrese el
siguiente sistema de ecuaciones lineales.
Ax=b
Donde x y b son vectores columna, y A una matriz cuadrada no
singular (invertible). La resolucin de este sistema de ecuaciones
se puede escribir en las 2 formas siguientes ( atencin a la
segunda forma que esta basada en la barra invertida \, que por
dems no es tan usada !):
x=inv(A)*b
x=A\b
As pues, el operador divisin izquierda por una matriz (barra
invertida \) equivales a multiplicar por la inversa de esa matriz. En
realidad este operador es mqs general y ms inteligente de lo
que aparece en el ejemplo anterior: el operador divisin izquierda
es aplicable aunque la matriz no tenga inversa e incluso no sea
cuadrada, en cuyo caso la solucin que se obtiene (por lo
general) es la que proporciona el mtodo de los mnimos
cuadrados. Cuando la matriz es triangular o simtrica aprovecha
esta circunstancia para reducir el numero de operaciones
aritmticas. En algunos casos se obtiene una solucin con no
ms de r elementos distintos de cero, siendo r el rango de la
matriz. Esto puede estar basado en que la matriz se reduce a
forma de escaln y se resuelve el sistema dando valor cero a las
variables libres o independientes. Por ejemplo, considrese lo
siguiente.
Tenemos una matriz de tamao (1 x 2) que conduce a un
sistema de infinitas soluciones:
>> A=[1 2], b=[2]
A =
xxviii
1 2
b =
2
>> x=A\b
x =
0
1
Esta es la solucin obtenida dando el valor de cero a la variable
independiente x(1). Por otra parte, en el caso de un sistema de
ecuaciones redundante ( o sobre determinado) el resultado de
MATLAB es el punto mas cercano en el sentido de mnima
norma del error a las ecuaciones dadas (aunque no cumpla
exactamente ninguna de ellas).
Veamos el siguiente ejemplo de tres ecuaciones formadas por
una recta que no pasa por el origen y los dos ejes coordenados:
>> A=[1 2;1 0;0 1], b=[2 0 0]'
A =
1 2
1 0
0 1
b =
2
0
0
>> x=A\b, resto=A*x-b
x =
0.3333
0.6667
xxix
resto =
-0.3333
0.3333
0.6667
Si la matriz es singular o est muy mal escalada, el operador \ da
un aviso (warning), pero proporciona una solucin.
La inteligencia del operador barra invertida \ tiene un costo:
MATLAB debe emplear cierto tiempo en determinar las
caractersticas de la matriz. Triangular, simtrica, etc. Si el
usuario conoce perfectamente y con seguridad las caractersticas
de la matriz del sistema, lo mejor es utilizar la funcin linsolve,
que no realiza ninguna comprobacin y puede obtener la mxima
eficiencia.
Aunque no es una forma demasiado habitual, tambin se puede
escribir un sistema de ecuaciones lineales en la forma
correspondiente a traspuesta de la ecuacin
Ax=b
yB=c
Donde y y c son vectores fila (c conocido). Si la matriz B es
cuadrada e invertible, la solucin de este sistema se puede
escribir en la forma siguiente:
y=c*inv(B)
y=c/B
En este caso, el operador divisin derecha por una matriz
equivale a postmultiplicar por la inversa de la matriz. Si se
traspone la ecuacin yB=c y se halla la solucin aplicando el
operador divisin izquierda se obtiene
y=(B)\c
Comprobando las expresiones y=c*inv(B) y y=c/B se obtiene la
relacin entre los operadores divisin izquierda y divisin
derecha (MATLAB solo tiene implementado el operador divisin
izquierda):
c/B=((B)\c)
xxx
2.3.3 Operadores elemento a elemento
En MATLAB existe tambin la posibilidad de aplicar elemento a
elemento los operadores matriciales. Para ello basta precederlos
por un punto (.). Veamos un ejemplo de ello.
>> [1 2 3 4]^2
??? Error using ==> mpower
Matrix must be square.
Esto mismo hecho de otra manera
>> [1 2 3 4].^2
ans =
1 4 9 16
Observemos que cuando le anteponemos un punto antes de
elevar una potencia, entonces si hace la funcin que nosotros
esperamos (la de elevar todos y cada uno de los elementos de la
matriz a la potencia sealada).
Veamos uno mas:
>> [1 2 3 4]*[1 -1 1 -1]
??? Error using ==> mtimes
Inner matrix dimensions must agree.
hecho de otra manera
>> [1 2 3 4].*[1 -1 1 -1]
ans =
1 -2 3 -4
Ahora si obtenemos el resultado esperado.
2.4 Tipos de Datos
MATLAB es un programa preparado para trabajar con vectores y
matrices. Como caso particular tambin trabaja con variables escalares
(matrices de dimensin 1). MATLAB trabaja siempre con la modalidad
xxxi
de doble precisin, es decir guardando cada dato en 8 bytes, con unas
15 cifras significativas. Ms delante veremos que tambin puede
trabajar con cadenas de caracteres (strings) y, desde la versin 5.0
tambin con otros tipos de datos: matrices de ms de dos dimensiones,
matrices dispersas, vectores y matrices de celdas, estructuras, clases y
objetos.
2.4.1 Nmeros reales de doble precisin
Los elementos constitutivos de vectores y matrices son nmeros
reales almacenados en 8 bytes (53 bits para la mantisa y 11 para
el exponente de 2; entre 15 y 16 cifras decimales equivalentes).
Es importante saber como trabaja MATLAB con estos nmeros y
los casos especiales que presentan
MATLAB mantiene una forma especial para los nmeros muy
grandes (mas grandes que los que es capaz de representar), que
son considerados como infinito. Por ejemplo, observemos como
responde el programa al ejecutar el siguiente comando.
>> 1.0/0.0
ans =
Inf
Asi pues, para MATLAB el infinito se representa como inf.
Tambien tiene una representacin especial para los resultados
que estn definidos como nmeros. Veamos los siguientes
ejemplos:
>> 0/0
ans =
NaN
>> inf/inf
ans =
NaN
xxxii
En ambos casos la respuesta es NaN, que es la abreviatura de
Not a Number. Este tipo de respuesta, as como la de inf, son
enormemente importantes en MATLAB, pues permite controlar la
fiabilidad de los resultados de los clculos matriciales. Los NaN
se propagan al realizar con ellos cualquier operacin aritmtica,
en el sentido de que , por ejemplo, cualquier nmero sumado a
un NaN da como resultado otro NaN. MATLAB tiene esto en
cuenta siempre.
El programa dispone de tres funciones tiles relacionadas con las
operaciones de coma flotante. Estas funciones, que no tienen
argumentos, son las siguientes:
eps devuelve la diferencia entre 1.0 y el nmero de coma
flotante inmediatamente superior. Da una idea de la precisin o
numero de cifras almacenadas, esta tiene un valor aproximado
de 2.2201E0-016 (numero extremadamente pequeo)
realmin devuelve el nmero mas pequeo con que se
puede trabajar (2.2251E-308)
realmax devuelve el nmero ms grande con que se puede
trabajar (1.7977E+308)
2.4.2 Otros tipos de variables: Integer, Float y Logical
Como ya se ha comentado, por defecto MATLAB trabaja con
variables de punto flotante y doble precisin (doubl). Con estas
variables pueden resolverse casi todos los problemas prcticos y
con frecuencia no es necesario complicarse la vida declarando
variables de tipos distintos, como se hace con cualquier otro
lenguaje de programacin. Sin embargo, en algunos casos es
conveniente declarar variables de otros tipos por que puede
ahorrarse mucha memoria y pueden hacerse los clculos mucho
ms rpidos.
MATLAB permite crear variables enteras con 1, 2, 4 y 8 bytes. A
su vez, estas variables pueden tener signo o no tenerlo. Las
variables con signo representan nmeros en intervalos casi
simtricos respecto al cero; las variables sin signo representan
nmeros no negativos, desde el cero hasta el nmero mximo.
Los tipos de los enteros con signo son int8, int16, int32 e int64,
y sin signo uint8, uint116, uint34 y uint64. Para crear una
xxxiii
variable entera de un tipo determinado se pueden utilizar
sentencias como las siguientes:
>> i=int32(100);
% se crea un entero de 4 bytes con valor 100
>> j=zeros(100); i=int32(j);
% se crea un entero i a partir de j
>> i=zeros(1000,1000,'int32');
% se crea una matriz 1000 x 1000 de enteros
Las funciones intmin(int64) e intmax(int64) permiten por
ejemplo saber el valor del entero ms pequeo y mas grande
(en valor algebraico) que puede formarse con variables enteras
de 64 bits:
>> disp([intmin('int64'),intmax('int64')])
-9223372036854775808 9223372036854775807
La funcin isinteger(i) devuelve 1 si la variable i es entera y 0
en otro caso. La funcin class(i) devuelve el tipo de variable
que es i (int8, int16,), mientras que la funcin isa(i,int16)
permite saber exactamente si la variable i corresponde a un
entero de 16 bits.
MATLAB dispone de dos tipos de variables reales o float:
single y doubl, que ocupan respectivamente4 y 8 bytes. Por
defecto se utilizan doubles. Las funciones single(x) y
double(y) permiten realizar conversiones entre ambos tipos de
variables.
Las funciones realmin y realmax permiten saber los nmeros
double ms pequeo y ms grande (en valor absoluto) que
admite la computadora. Para los correspondientes nmeros de
simple precisin habr que utilizar realmin(single) y
realmax(single). La funcin isfloat(x) perimite saber si x es
una variable real, de simple o doble precisin. Para saber
exactamente de que tipo de variable se trata se pueden utilizar
las funciones isa(x,single) oisa(x,double). Observese el
ejemplo siguiente, en el que se ve como con variables single se
reduce el tiempo de CPU y la memoria:
>> n=1000; AA=rand(n);A=single(AA);
>> tic, Bs=inv(A); toc
elapsed time is 0.628994 seconds.
>> tic, Bd=inv(AA); toc
elapsed time is 0.506865 seconds.
xxxiv
Quizs las variables ms interesantes -aparte de las variables
por defecto, las doubl- sean las variables logical, que solo
pueden tomar dos los valores true(1) y false(0). Las variables
lgicas surgen como resultado de los operadores relacionales
(==, <, >, >=, >=, ~=) y de muchas funciones lgicas como any y
all que se aplican a vectores y matrices.
La funcin logical(A) produce una variable lgica con el mismo
nmero de elementos que A, con valores de 1 o 0 segn el
correspondiente elemento de A.
Una de las aplicaciones ms importantes de las variables
lgicas es para separar o extraer los elementos de una matriz o
vector que cumplan cierta condicin, y operar luego
selectivamente sobre dichos elementos. Obsrvese el siguiente
ejemplo.
>> A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> j=A>10
j =
1 0 0 1
0 1 0 0
0 0 0 1
0 1 1 0
>> isa(j,'logical')
ans =
1
>> A(j)=-10
A =
-10 2 3 -10
xxxv
5 -10 10 8
9 7 6 -10
4 -10 -10 1
2.4.3 Nmeros complejos: Funcin complex
En muchos clculos matriciales los datos y/o los resultados no
son reales sino complejos, con parte real y parte imaginaria.
MATLAB trabaja sin ninguna dificultad con nmeros de esta
naturaleza. Para ver como se representan por defecto los
nmeros complejos, ejecutaremos la siguiente sentencia:
>> a=sqrt(-4)
a =
0 + 2.0000i
>> 3+4j
ans =
3.0 + 4.0000i
En la entrada de datos de MATLAB se pueden utilizar
indistintamente la i y la j para representar el nmero imaginario
unidad (en la salida, sin embargo, puede verse que siempre
aparece la i). si la i o la j no estn definidas como variables,
puede intercalarse el signo (*). Esto no es posible en el caso de
que si estn definidas, por que entonces se utiliza el valor de la
variable. En general, cuando se esta trabajando con nmeros
complejos, conviene no utilizar la i como variable ordinaria, pues
puede dar lugar a errores y confusiones. Observemos los
siguientes resultados a manera de ejemplo:
>> i=2
i =
2
>> 2+3i
ans =
xxxvi
2.0000 + 3.0000i
>> 2+3*i
ans =
8
>> 2+3*j
ans =
2.0000 + 3.0000i
Cuando i y j son variables utilizadas para otras finalidades, como
unidad imaginaria puede utilizarse tambin la funcin sqrt(-1), o
una variable a la que se haya asignado el resultado de esta
funcin.
La asignacin de valores complejos a vectores y matrices desde
el teclado puede hacerse de las dos formas, que se muestran en
el ejemplo siguiente (conviene hacer antes la funcin clear i, para
que i no est en definida como variable; este comando limpia la
variable en uso):
>> A=[1+2i 2+3i; -1+i 2-3i]
A =
1.0000 + 2.0000i 2.0000 + 3.0000i
-1.0000 + 1.0000i 2.0000 - 3.0000i
>> A=[1 2;-1 2]+[2 3;1 -3]*A
A =
0 + 7.0000i 12.0000 - 3.0000i
3.0000 - 1.0000i -2.0000 +12.0000i
Puede verse que es posible definir las partes reales e
imaginarias por separado. En este caso si es necesario utilizar el
operador (*), segn se muestra en el ejemplo.
xxxvii
MATLAB dispone asimismo de la funcin complex, que crea un
nmero complejo a partir de dos argumentos que representan la
parte real e imaginaria.
>> complex(1,2)
ans =
1.0 + 2.0000i
Es importante advertir que el operador de matriz traspuesta (),
aplicado a matrices complejas, produce la matriz conjugada y
traspuesta. Existe una funcin que permite hallar la matriz
conjugada (conj()) y el operador punto y apostrofe (.) que
calcula simplemente la matriz traspuesta.
2.4.4 Cadenas de caracteres
MATLAB puede definir variables que contengan cadenas de
caracteres, las cadenas de texto van entre apostrofes o comillas
simplemente
s=esta es una cadena de caracteres
2.5 Variables y expresiones matriciales
Una variable es un nombre que se da a cada entidad numrica que
puede ser una matriz, un vector o un escalar. El valor de esta variable
es incluso el tipo de entidad numrica que representa, puede cambiar a
lo largo de una sesin de MATLAB o a lo largo de la ejecucin de un
programa. La forma mas normal de cambiar el valor de una variable es
colocndola a la izquierda del operador de asignacin (=)
Una expresin de MATLAB puede tener las dos formas siguientes:
primero, asignando su resultado a una variable
Variable = expresin
y segundo evaluando simplemente el resultado del siguiente modo
Expresin
xxxviii
en cuyo caso el resultado se asigna automticamente a una variable
interna de tipo temporal que se usa en MATLAB, llamada ans (answer)
que almacena el ltimo resultado obtenido. Se considera por defecto
que una expresin termina cuando se pulsa enter. Si se desea que una
expresin contine en la lnea siguiente, hay que introducir tres puntos
() antes de pulsar el enter. Tambin se pueden incluir varias
expresiones en una misma lnea separndolas por comas (,) o puntos y
comas (;).
Si una expresin termina en punto y coma (;) su resultado se calcula,
pero no se escribe en la pantalla. Esta posibilidad es muy importante,
tanto para evitar la escritura de resultados intermedios, como para
evitar la impresin de grandes cantidades de nmeros cuando se
trabaja con matrices de gran tamao.
A semejanza de C, MATLAB distingue entre maysculas y minsculas
en los nombres de variables. Los nombres de variables debern
empezar siempre con una letra y pueden constar de hasta 63 letras y
nmeros. La funcin namelengthmax permite preguntar al programa
por este nmero mximo de caracteres. El carcter guion bajo (_) se
considera como una letra. A diferencia del lenguaje C, no hace falta
declarar las variables que se vayan a utilizar. Esto hace que se deba
tener especial cuidado con no utilizar nombres errneos en las
variables, porque no se recibir ningn aviso de parte de MATLAB.
Cuando se quiere tener una relacin de las variables que se han
utilizado en una sesin de trabajo se pueden utilizar los comandos who
o whos que proporcionan una informacin detallada de las variables
que se estn usando en la presente sesin.
Esta informacin se puede obtener grficamente con el Workspace
Browser, que aparece con el comando View/Workspace o activando la
ventana correspondiente si estaba abierto.
El comando clear tiene varias formas posibles de funcionamiento:
clear sin argumentos, clear elimina todas las variables
creadas previamente (excepto las variables
globales)
clear A,b borra las variables indicadas
clear global borra las variables globales
clear functions borra las funciones
clear all borra todas las variables, incluyendo las globales y
las funciones
2.6 Otras formas de definir Matrices.
xxxix
MATLAB dispone de varias formas de definir matrices. El introducirlas
por teclado solo es prctico en casos de pequeo tamao y cuando no
hay que repetir esa operacin muchas veces. Recurdese que en
MATLAB no hace falta definir el tamao de una matriz, las matrices
toman su tamao al ser definidas y ese tamao puede ser modificado
por el usuario mediante edicin y/o borrado de filas y columnas. A
continuacin se vern otras formas ms potentes y generales de definir
y modificar matrices.
2.6.1 Tipos de Matrices Predefinidas
Existen en MATLAB varias funciones orientadas a definir con gran
facilidad matrices de tipos particulares. Algunas de estas funciones son
las siguientes:
eye(n) Forma la matriz identidad de tamao (n x n).
zeros(3,5) Forma una matriz de ceros de tamao (3 x 5).
zeros(n) dem de tamao (n x n).
ones(n) Forma una matriz de unos de tamao (n x n).
ones(2,4) Forma una matriz de unos de tamao (2 x 4).
linspace(x,y,n) Genera un vector con n valores igualmente
espaciados entre x e y.
logspace(a,b,n) Genera un vector con n valores espaciados
logartmicamente entre 10^a y 10^b.
rand(n) Forma una matriz de nmeros aleatorios entre 0 y 1,
con distribucin uniforme de tamao (n x n).
rand(2,5) dem de tamao (2 x 5).
randn(n) Forma una matriz de nmeros aleatorios de tamao (n
x n), con distribucin normal, de valor medio 1 y
varianza 0.
magic(n) Crea una matriz (n x n) con los nmeros 1, 2, ,n*n,
con la propiedad de que todas las filas y columnas
suman lo mismo.
hilb(n) Crea una matriz de Hilbert de tamao (n x n). la matriz
de Hilbert es una matriz cuyos elementos (i,j)
responden a la expresin (1/(i+j-1)). Esta es una
matriz especialmente difcil de manejar por los
grandes errores numricos a los que conduce.
Invhilb(n) Crea directamente la inversa de la matriz de Hilbert
kron(x,y) Produce una matriz con todos los productos de los
elementos del vector x por los elementos del vector y
equivalente a x*y, donde x e y son vectores fila.
compan(pol) Construye una matriz cuyo polinomio caracterstico
tiene como coeficientes los elementos del vector pol
xl
(ordenados de mayor a menor grado).
vander(v) Construye la matriz de Vandermonde a partir del
vector v (las columnas son las potencias de los
elementos de dicho vector).
Existen otras funciones para crear matrices de tipos particulares.
Usando el comando Help/Matlab Help se puede obtener informacin
sobre todas las funciones disponibles en MATLAB, que aparecen
agrupadas por categoras o por orden alfabtico. En la categora
Mathematics aparecen la mayor parte de las funciones estudiadas en
este apartado.
2.6.2 Formacin de una Matriz a partir de otras
MATLAB ofrece tambin la posibilidad de crear una matriz a
partir de matrices previas ya definidas por varios posibles
caminos:
Recibiendo alguna de sus propiedades (como por ejemplo el
tamao)
Por composicin de varias submatrices mas pequeas
Modificndola de alguna forma.
A continuacin se describen algunas de las funciones que crean
una nueva matriz a partir de otra o de otras, comenzando por dos
funciones auxiliares:
[m,n]=size(A) Devuelve el numero de filas y de columnas de la
matriz A. si la matriz es cuadrada basta recoger el
primer valor de retorno.
n=length(x) Calcula el nmero de elementos de un vector x
zeros(size(A)) Forma una matriz de ceros del mismo tamao que una
matriz A previamente creada.
ones(size(A)) dem con unos.
A=diag(A) Forma una matriz diagonal A cuyos elementos
diagonales son los elementos de un vector ya
existente x.
x=diag(A) Forma un vector x a partir de los elementos de la
diagonal de una matriz ya existente A.
diag(diag(A)) Crea una matriz diagonal a partir de la diagonal de la
matriz A.
blkdiag(A,B) Crea una matriz diagonal de submatrices a partir de
xli
las matrices que se le pasan como argumentos.
triu(A) Forma una matriz triangular superior a partir de una
matriz A (no tiene por que ser cuadrada). Con un
segundo argumento puede controlarse que se
mantengan o eliminen las diagonales por encima o
debajo de la diagonal principal.
tril(A) dem con una matriz triangular inferior.
rot90(A,k) Gira k*90 grados la matriz rectangular A en sentido
contrario a las manecillas del reloj. K es un entero que
puede ser negativo. Si se omite se toma por defecto
k=1.
flipud(A) Halla la matriz simtrica de A respecto de un eje
horizontal.
fliplr(A) Halla la matriz simtrica de A respecto de un eje
vertical.
reshape(A.m.n
)
Cambia el tamao de la matriz A devolviendo una
matriz de tamao m x n cuyas columnas se obtienen a
partir de un vector formado por las columnas de A
puestas una a continuacin de la otra. Si la matriz A
tiene menos de m x n elementos se produce un error.
Un caso especialmente interesante es el de crear una nueva
matriz componiendo como submatrices otras matrices definidas
previamente. A modo de ejemplo, ejecutemos las siguientes
lneas de comandos observemos lo que sucede:
A=rand(3)
A =
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
>> B=diag(diag(A))
B =
0.8147 0 0
0 0.6324 0
0 0 0.9575
>> C=[A, eye(3); zeros(3),B]
C =
xlii
0.8147 0.9134 0.2785 1.0000 0 0
0.9058 0.6324 0.5469 0 1.0000 0
0.1270 0.0975 0.9575 0 0 1.0000
0 0 0 0.8147 0 0
0 0 0 0 0.6324 0
0 0 0 0 0 0.9575
En el ejemplo anterior, la matriz C de tamao (6 x 6) se forma
por composicin de cuatro matrices de tamao (3 x 3). Al igual
que con simples escalares, las submatrices que forman una fila
se separan con blancos o comas, mientras que las diferentes
filas se separan entre si con enter o puntos y comas. Los
tamaos de las submatrices deben de ser coherentes.
2.6.3 Direccionamiento de Vectores y Matrices a partir de
Vectores
Los elementos de un vector x se pueden direccionar a partir de
los de otro vector v. en este caso, x(v) equivale al vector x(v(1)),
x(v(2)),
Considrese el siguiente ejemplo:
>> v=[1 3 4]
v =
1 3 4
>> x=rand(1,6)
x =
0.9649 0.1576 0.9706 0.9572 0.4854 0.8003
>> x(v)
ans =
0.9649 0.9706 0.9572
De forma anloga, los elementos de una matriz A pueden
direccionarse a partir de los elementos de dos vectores f y c. (ver
siguiente ejemplo)
xliii
>> f=[2 4]; c=[1 2];
>> A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A(f,c)
ans =
5 11
4 14
El siguiente ejemplo continuacin del anterior- permite
comprobar como los elementos de una matriz se pueden
direccionar con un solo ndice, considerando que las columnas
de la matriz estn una a continuacin de otra formando un vector:
>> f=[1 3 5 7];
>> A(f), A(5), A(6)
ans =
16 9 2 7
ans =
2
ans =
11
Esta forma de extraer elementos de un vector y/o de una matriz
tiene abundantes aplicaciones, por ejemplo la de modificar
selectivamente esos elementos.
xliv
2.6.4 Operador dos Puntos
Este operador es muy importante en MATLAB y puede usarse de
varias formas. Veamos algunas:
Para empezar definiremos un vector x con el siguiente comando:
>> x=1:10
x =
1 2 3 4 5 6 7 8 9 10
En cierta forma se puede decir que el operador (:) representa un
rango, en este caso los nmeros enteros entre el 1 y el 10. Por
defecto el incremento es 1, pero este operador puede tambin
utilizarse con otros valores enteros y reales, positivos o
negativos. En este caso el incremento se coloca entre el valor
inferior y el valor superior, en las formas que se muestra a
continuacin:
>> x=1:2:10
x =
1 3 5 7 9
>> x=1:1.5:10
x =
1.0000 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000
>> x=10:-1:1
x =
10 9 8 7 6 5 4 3 2 1
Puede verse que por defecto este operador produce vectores fila.
Si se desea obtener un vector columna basta con trasponer el
resultado. El siguiente ejemplo genera una tabla de funciones
seno y coseno.
>> x=[0.0:pi/50:2*pi]';
>> y=sin(x); z=cos(x);
xlv
>> [x y z]
ans =
0 0 1.0000
0.0628 0.0628 0.9980
0.1257 0.1253 0.9921
0.1885 0.1874 0.9823
0.2513 0.2487 0.9686
.
.
.
6.1575 -0.1253 0.9921
6.2204 -0.0628 0.9980
6.2832 -0.0000 1.0000
El operador dos puntos (:) es an ms til y potente con
matrices. A continuacin se va a definir una matriz A de tamao
(6 x 6) y despus se realizarn diversas operaciones sobre ella
con el operador (:).
>> A=magic(6)
A =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
Recurdese que MATLAB accede a los elementos de una matriz
por medio de los ndices de fila y de columna encerrados entre
parntesis y separados por una coma, por ejemplo:
>>A(2,3)
ans
7
xlvi
El siguiente comando extrae los 4 primeros elementos de la
sexta fila
>>A(6, 1:4)
Ans
4 36 29 13
Los dos puntos aislados representan todos los elementos. Por
ejemplo, el siguiente comando extrae todos los elementos de la
tercera fila:
>> A(3,:)
ans =
31 9 2 22 27 20
Para acceder a la ultima fila o columna puede utilizar la palabra
end, en lugar del nmero correspondiente:
>> A(end,:)
ans =
4 36 29 13 18 11
El siguiente comando extrae todos los elementos de las filas 3, 4
y 5:
>> A(3:5,:)
ans =
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
Se pueden extraer conjuntos disjuntos de filas utilizando
corchetes [ ]. Por ejemplo, el siguiente comando extrae las filas 1
2 y 5:
xlvii
>> A([1 2 5],:)
ans =
35 1 6 26 19 24
3 32 7 21 23 25
30 5 34 12 14 16
En los ejemplos anteriores se han extrado filas y no columnas
por motivos de espacio ocupado por el resultado, es evidente
que todo lo que se dice para las filas es tambin cierto para las
columnas y viceversa, basta con cambiar el orden de los ndices.
El operador dos puntos puede utilizarse en amos lados del
operador (=). Por ejemplo, a continuacin se va a definir una
matriz identidad B de tamao 6 x 6 y se van a reemplazar filas de
B por filas de A. obsrvese que la siguiente secuencia de
comandos sustituye las filas 2, 4 y 5 de B por las filas 1, 2 y 3 de
A
>> B=eye(size(A));
>> B([2,4,5],:)=A(1:3,:)
B =
1 0 0 0 0 0
35 1 6 26 19 24
0 0 1 0 0 0
3 32 7 21 23 25
31 9 2 22 27 20
0 0 0 0 0 1
Se pueden realizar operaciones an ms complicadas, tales
como la siguiente:
>> B=eye(size(A));
>> B(1:2,:)=[0 1;1 0]*B(1:2,:)
B =
0 1 0 0 0 0
1 0 0 0 0 0
0 0 1 0 0 0
xlviii
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
Otro ejemplo en el que vemos la forma de invertir el orden de los
elementos de un vector:
>> x=rand(1,5)
x =
0.1419 0.4218 0.9157 0.7922 0.9595
>> x=x(5:-1:1)
x =
0.9595 0.7922 0.9157 0.4218 0.1419
Observemos que por haber utilizado parntesis en lugar de
corchetes los valores generados por el operador (:) afectan a los
ndices del vector y no al valor de sus elementos
Para invertir el orden de las columnas de una matriz se puede
hacer lo siguiente:
>> A=magic(6)
A =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
>> A(:,6:-1:1)
ans =
24 19 26 6 1 35
25 23 21 7 32 3
20 27 22 2 9 31
15 10 17 33 28 8
16 14 12 34 5 30
xlix
11 18 13 29 36 4
Aunque hubiera sido mas fcil utilizar la funcin fliplr(A), que es
especifica para ello.
Finalmente hay que mencionar que A(:) representa un vector
columna con las columnas de A una detrs de otra.
2.6.5 Matriz vaca A[ ]. Borrado de filas o columnas
Para MATLAB una matriz definida sin ningn elemento entre los
corchetes es una matriz que existe pero que esta vaca, o lo que
es lo mismo que tiene dimensin cero. Considrese los
siguientes ejemplos de aplicaciones de las matrices vacas:
>> A=magic (3)
A =
8 1 6
3 5 7
4 9 2
>> B=[]
B =
[]
>> exist(B)
ans =
0
>> isempty(B)
ans =
1
>> A(:,3)=[]
l
A =
8 1
3 5
4 9
Las funciones exist() e isempty() permiten checar si una variable
existe y si esta vaca. En el ultimo ejemplo se ha eliminado la
tercera columna de A asignndole la matriz vaca.
2.6.6 Definicin de vectores y Matrices a partir de un archivo
MATLAB acepta como entrada un archivo nombre.m que
contiene instrucciones y/o funciones. Dicho archivo se llama
desde la lnea de comandos tecleando simplemente su nombre,
sin la extensin. A su vez, un archivo puede llamar a otros
archivos .m e incluso puede llamarse as mismo (funciones
recursivas). Las variables definidas dentro de un archivo de
comandos que se ejecuta desde la lnea de comandos son
variables del espacio de trabajo base, esto es, pueden ser
accedidas desde fuera de dicho archivo; no sucede lo mismo si el
archivo .m corresponde a una funcin. Si un archivo de
comandos se llama desde una funcin, las variables que se
crean pertenecen al espacio de trabajo de dicha funcin.
Como ejemplo se puede crear un archivo llamado unidad.m que
construya una matriz identidad de tamao 3 x 3 llamada u33 en
un directorio llamado c:\matlab. Este archivo deber contener la
lnea siguiente:
U33=eye(3)
Desde MATLAB llmese al comando unidad y obsrvese el
resultado. Entre otras razones es muy importante utilizar archivos
de comandos para poder utilizar el Debugger y para evitar
teclear muchas veces los mismos datos, sentencias o
expresiones.
2.7 Operadores relacionales.
El lenguaje de programacin de MATLAB dispone de los siguientes
operadores relacionales:
li
< menor que
> mayor que
<= menor o igual que
>= mayor o igual que
== igual que
~= diferente que
Obsrvese que, salvo el ltimo de ellos, coinciden con los
correspondientes operadores relacionales del lenguaje C. sin embargo,
sta es una coincidencia mas bien formal. En MATLAB los operadores
relacionales pueden aplicarse a vectores y matrices, y eso hace que
tengan un significado especial.
Al igual que en otros lenguajes de programacin, si una comparacin se
cumple el resultado es 1 (true), mientras que si no se cumple es 0
(false), recprocamente, cualquier valor distinto de cero es considerado
como true y el cero equivale a false. La diferencia con C est en que
cuando los operadores relacionales de MATLAB se aplican a dos
matrices o vectores del mismo tamao, la comparacin se realiza
elemento a elemento, y el resultado es otra matriz de unos y ceros del
mismo tamao, que recoge el resultado de cada comparacin entre
elementos. Consideremos el siguiente ejemplo como ilustracin de lo
que se acaba de decir:
>> A=[1 2;0 3]; B=[4 2;1 5];
>> A==B
ans =
0 1
0 0
>> A~=B
ans =
1 0
1 1
2.8 Operadores Lgicos.
Los operadores lgicos de MATLAB son los siguientes:
lii
& And (funcin equivalente: and (A,B)). Se evalan siempre
ambos operadores, y el resultado es true solo si ambos son
true.
&& And breve: si el primer operador es false ya no se evala el
segundo, pues el resultado final ya no puede ser ms que
false.
| Or (funcin equivalente: or(A,B)). Se evalan siempre ambos
operadores, y el resultado es false solo si ambos son false.
|| Or breve: si el primer operando es true ya no se evala el
segundo, pues el resultado final no puede ser mas que true
~ negacin lgica(funcin equivalente: not(A)).
xor(A,B) Realiza or exclusivo, es decir, devuelve 0 en el caso en
que ambos sean 1 o ambos sean 0.
Los operadores lgicos se combinan con los relacionales para poder
comprobar el cumplimiento de condiciones mltiples.
Los operadores lgicos breves se utilizan para simplificar las
operaciones de comparacin evitando operaciones innecesarias, pero
tambin para evitar ciertos errores que se produciran en caso de
evaluar incondicionalmente el segundo argumento. Consideremos por
ejemplo la siguiente sentencia que evita una divisin por cero:
>> r=(b~=0) && (a/b>0)
2.9 Funciones de Librera.
MATLAB tiene un gran nmero de funciones incorporadas. Algunas son
funciones intrnsecas, esto es, funciones incorporadas en el propio
cdigo ejecutable del programa. Estas funciones son generalmente
rpidas y eficientes. Existen adems funciones definidas en
archivos .m y .mex que vienen con el propio programa o que han sido
aportadas por usuarios del mismo. Estas funciones extienden en gran
manera las posibilidades del programa.
MATLAB dispone tambin de archivos .p que son archivos pre
compilados con la funcin pcode.
MATLAB tiene diversos tipos de funciones. A continuacin se enumeran
los tipos de funciones ms importantes, clasificadas segn su finalidad.
1. Funciones matemticas elementales.
2. Funciones especiales.
3. Funciones matriciales elementales.
4. Funciones matriciales especiales.
liii
5. Funciones para la descomposicin de matrices.
6. Funciones para anlisis estadstico de datos.
7. Funciones para anlisis de polinomios.
8. Funciones para integracin de ecuaciones y diferenciaciones
ordinarias.
9. Resolucin de ecuaciones no-lineales y optimizacin.
10. Funciones para procesamiento de seales.
A continuacin se enumeran algunas de las caractersticas generales
de todas las funciones de MATLAB
Los argumentos actuales de estas funciones pueden ser
expresiones y tambin llamadas a otras funciones
Las funciones de MATLAB nunca devuelven modificadas
las variables que pasan como argumentos, a no ser que
se incluyan tambin como valores de retorno.
MATLAB admite valores de retorno matriciales mltiples.
Por ejemplo, en el comando:
>>[V,D]=eig(A)
La funcin eig(A) calcula los valores y vectores propios
de la matriz cuadrada A. los vectores propios se
devuelven como columnas de matriz V, mientras que los
valores propios con los elementos de la matriz diagonal D.
en los ejemplos siguientes:}
>>[xmax, imax]=max(x)
>>xmax=max(x)
Puede verse que la misma function max() puede ser
llamada recogiendo dos valores de retorno (el mximo
elemento de un vector y la posicin que ocupa) o un valor
de retorno (el mximo elemento).
Las operaciones de suma y/o resta de una matriz con un
escalar consiste en sumar y/o restar el escalar a todos los
elementos de la matriz.
Recurdese que tecleando help nombre_funcion se
obtiene de inmediato informacin detallada sobre la
funcin de ese nombre
2.10 Funciones Matemticas elementales que
operan a modo de escalar.
liv
Estas funciones, que comprenden las funciones matemticas
trascendentales y otras funciones bsicas, cuando se aplican a una
matriz actan sobre cada elemento de la matriz como si se tratase de
un escalar. Por tanto, se aplican de la misma forma a escalares y
matrices. Algunas de las funciones de este grupo son las siguientes:
sin(x) Seno.
cos(x) Coseno.
tan(x) Tangente.
asin(x) Arco seno.
acos(x) Arco coseno.
atan(x) Arco tangente (devuelve un ngulo entre /2 y /2).
atan2(x) Arco tangente (devuelve un ngulo entre - y ); se le
pasan dos argumentos proporcionales al seno y al coseno
sinh(x) Seno hiperblico.
cosh(x) Coseno hiperblico.
tanh(x) Tangente hiperblico.
asinh(x) Arco seno hiperblico.
acosh(x) Arco coseno hiperblico.
ata(nh(x) Arco tangente hiperblico.
log(x) Logaritmo natural.
log10(x) Logaritmo decimal.
exp(x) Funcin exponencial.
sqrt(x) Raz cuadrada.
sign(x) Devuelve -1 si <0, 0 si=0 y 1 si >0. Aplicada a un numero
complejo, devuelve un vector unitario en la misma direccin.
rem(x,y) Resto de la divisin (dos argumentos que no tienen que ser
enteros).
mod(x,y) Similar a rem.
round(x) Redondeo hacia el entero ms prximo.
fix(x) Redondea hacia el entero ms prximo a cero.
floor(x) Valor entero ms prximo hacia el infinito negativo.
ceil(x) Valor entero ms prximo hacia el infinito positivo.
gcd(x) Mximo comn divisor.
lcm(x) Mnimo comn mltiplo.
real(x) Partes reales.
imag(x) Partes imaginarias.
abs(x) Valor absoluto.
angle(x) ngulos de fase.
2.10.1 Funciones que actan sobre Vectores
Las siguientes funciones solo actan sobre vectores (no sobre
matrices ni sobre escalares)
lv
[xm, im] Mximo elemento de un vector. Devuelve el valor mximo
xm y la posicin que ocupa im.
min(x) Mnimo elemento de un vector, devuelve el valor mas
pequeo y la posicin que ocupa.
sum(x) Suma de los elementos de un vector.
cumsum(x) Devuelve el vector suma acumulativa de los elementos de
un vector (cada elemento del resultado es una suma de
elementos del original).
mean(x) Valor promedio de los elementos de un vector.
std(x) Desviacin tpica de los elementos de un vector.
prod(x) Producto de los elementos de un vector.
cumprod(x
)
Devuelve el vector producto acumulativo de los elementos
de un vector.
[y,i]=sort(x) Ordenacin de menor a mayor de los elementos de un
vector x. devuelve el vector ordenado y, y un vector i con
las posiciones iniciales en x de los elementos en el vector
ordenado y.
En realidad estas funciones se pueden aplicar tambin a
matrices. Pero en este caso se aplican por separado a cada
columna de la matriz, dando como valor de retorno un vector
resultado de aplicar la funcin a cada columna de la matriz
considerada como vector. Si estas funciones se quieren aplicar a
las filas de la matriz basta aplicar dichas funciones a la matriz
traspuesta.
2.10.2 Funciones que actan sobre Matrices
B=A Calcula la traspuesta conjugada de la matriz A.
B=A. Calcula la traspuesta (sin conjugar) de la matriz A.
v=poly(A) Devuelve un vector v con los coeficientes del polinomio
Caracterstico de la matriz cuadrada A.
t=trace(A) Devuelve la traza t (suma de los elementos de la
Diagonal) de una matriz cuadrada A.
[m,n]=size(A) Devuelve el numero de filas m y de columnas n de una
matriz rectangular A.
n=size(A) Devuelve el tamao de una matriz cuadrada A.
nf=size(A,1) Devuelve el numero de filas de A.
nc=size(A,2) Devuelve el numero de columnas de A.
lvi
2.10.3 Funciones Matriciales Especiales.
Las funciones exp(), sqrt(), y log() se aplican elemento a
elemento a las matrices o vectores que se les pasan como
argumentos. Existen otras funciones similares que tienen
tambin sentido cuando se aplican a una matriz como una nica
entidad. Estas funciones son las siguientes (se distinguen por
que llevan una m adicional en el nombre):
expm(A) Si A=XDX, expm(A)=X*diag(exp(diag(D)))*x
sqrtm(A) devuelve una matriz que multiplicada por si misma da la
matriz A.
logm() Es la funcin reciproca de expm(A).
Aunque no pertenece a esta familia de funciones, se puede
considerar que el operador potencia (^) est emparentado con
ellas. As es posible decir que:
A^n Esta definida si A es cuadrada y n es un numero real. Si n es
entera, el resultado se calcula por multiplicaciones sucesivas.
Si n es real, el resultado se calcula como:
[ ] ) ( , ' * . * A eig D X siendo X D X A
n n
.
2.10.4 Funciones de Factorizacin y/o Descomposicin
Matricial
A su vez este grupo de funciones se puede subdividir en 4
subgrupos:
- Funciones basadas en la factorizacin triangular (eliminacin de
Gauss):
[L,U] Descomposicin de Crout (A=LU) de una matriz L es
una permutacin de una matriz triangular inferior (dicha
permutacin es consecuencia del pivotamiento por
columnas utilizado en la factorizacin).
B=inv(A) Calcula la inversa de A. equivale a B=inv(U)*inv(L).
d=det(A) Devuelve el determinante d de la matriz cuadrada A.
equivale a d=det(L)*det(U).
E=rref(A) Reduccin de forma de escaln (mediante la eliminacin
de Gauss con pivotamiento por columnas, haciendo
ceros tambin encima de los pivotes) de una matriz
rectangular A.
[E,xc]=rref(A) Reduccin a forma de escaln con un vector xc que da
informacin sobre una posible base del espacio de
lvii
columnas de A.
U=chol(A) Descomposicin de Cholesky de matriz simtrica y
positivo-definida. Solo se utiliza la diagonal y la parte
triangular superior de A. el resultado es una matriz
triangular superior tal que A=U*U.
c=rcond(A) Devuelve una estimacin del reciproco de la condicin
numrica de la matriz A basada en la norma-1. Si el
resultado es prximo a 1 la matriz est condicionada; si
es prximo a 0 no lo est.
- Funciones basadas en el calculo de valores y vectores propios
[X,D]=eig(A) Valores propios (diagonal de D) y vectores propios
(columnas de X) de una matriz cuadrada A. con
frecuencia el resultado es complejo (si A no es
simtrica).
[X,D]=eig(A,B) Valores propios (diagonal de D) y vectores propios
(columnas de X) de dos matrices cuadradas A y B
(Ax= Bx). Los vectores propios estn normalizados
de modo que X*B*X=I. cuando A es simtrica y B es
simtrica y definida positiva se puede utilizar
[X,D]=eig(A,B,chol).
- Funciones basadas en la descomposicin QR
[Q,R]=qr(A) Descomposicin QR de una matriz rectangular. Se
utiliza para sistemas con ms ecuaciones que
incgnitas. Q es una matriz ortogonal, es decir, es
cuadrada aunque A no lo sea (m>n). no se garantiza
que los elementos diagonales de R sean positivos, lo
cual crea dificultades en algunos problemas (esa
factorizacin no coincide con la de Gram-Schmidt).
[Q,R]=qr(A,0) Similar a la anterior, pero Q del mismo tamao que A,
es decir, sin completar una base orto normal cuando
m>n.
[Q,R,E]=qr(A) Factorizacin QR con pivotamiento por columnas. La
matriz E se determina de modo que los elementos de
abs(diag( R )) son decrecientes.
B=null(A) Devuelve una base orto normal del subespacio nulo
(kernel, o conjunto de vectores x tales que Ax=0) de
la matriz rectangular A, calculada mediante la
descomposicin de valores singulares. Las columnas
de B son orto normales: B*B=I.
B=null(A,r) Devuelve una base del subespacio nulo de A
calculada a partir de la forma de escaln reducida. Las
columnas de B no son orto normales y se obtienen
lviii
alternativamente dando valor cero a todas las
variables libres excepto a una a la que se da el valor
de la unidad.
Q=orth(A) Las columnas de Q son una base orto normal del
espacio de columnas de A. el numero de columnas
de Q es el rango de A.
- Funciones basadas en la descomposicin de valores singulares
[U,D,V]=svd(A) Descomposicin de valor singular de una matriz
rectangular (A=U*D*V). U y V son matrices orto
normales. D es diagonal m x n y contiene los valores
singulares.
B=pinv(A) Calcula la pseudo-inversa de una matriz rectangular
A.
r=rank(A) Calcula el rango r de una matriz rectangular.
nor=norm(A) Calcula la norma-2 de una matriz (el mayor valor
singular).
nor=norm(A,2) Lo mismo que la anterior.
nor=normest(A) calcula de forma aproximada la norma-2 con menos
operaciones aritmticas que la funcin norm.
c=cond(A) Condicin numrica sub-2 de la matriz A. es el
cociente entre el mximo y el mnimo valor singular.
La condicin numrica da una idea de los errores
que se obtienen al resolver un sistema de
ecuaciones lineales con dicha matriz: su logaritmo
indica el numero de cifras significativas que se
pierden. Si A es grande el calculo es laborioso.
c=condest(A) Estimacin por defecto de la condicin numrica de
A con la norma-1. Esta funcin es mucho mas
econmica que cond.
- Calculo del rango, normas y condicin numrica:
Existen varias formas de realizar estos clculos, con distintos
niveles de esfuerzo de clculo y de precisin en el resultado.
El rango se calcula implcitamente (sin que el usuario lo pida) al
ejecutar las funciones rref(A), orth(A), null(A) y pinv(A). Con
rref(A) el rango se calcula como el nmero de filas diferentes de
cero; con orth(A) y null(A)- basadas ambas en la
descomposicin QR- el rango es el nmero de columnas del
resultado (o n menos el numero de columnas del resultado). Con
pinv(A) se utiliza la descomposicin de valor singular, que es el
lix
mtodo ms fiable y ms caro en tiempo de CPU. La funcin
rank(A) est basada en pinv(A).
Normas de matrices:
norm(A) Norma-2, es decir, el mximo valor singular de A,
max(svd(A)).
normest(A) Calcula una estimacin o aproximacin de la norma-2.
til para matrices grandes en las que norm(A) necesita
demasiado tiempo.
norm(A,2) Lo mismo que norm(A).
norm(A,1) Norma-1 de A, mxima suma de valores absolutos por
columnas, es decir: max(sum(abs(A))).
norm(A,inf) Norma-inf. De A, mxima suma de valores absolutos por
filas, es decir: max(sum(abs(A))).
Norma de vectores:
norm(x,p) Norma-p, es decir sum(abs(x)^p)^(1/p).
norm(x) Norma-2 o norma euclidea; equivale al modulo o
norm(x,2).
norm(x,inf) Norma-inf, es decir max(abs(x)).
norm(x,1) Norma-1, es decir sum(abs(x)).
2.11 Ms sobre operadores relacionales con
vectores y matrices.
Cuando alguno de los operadores relacionales vistos previamente (<,
>, <=, >=, ==, ~=) acta entre dos matrices (vectores) del mismo
tamao, el resultado es otra matriz (vector) de ese mismo tamao
conteniendo unos y ceros, segn los resultados de cada comparacin
entre elementos hayan sido true o false, respectivamente.
Por ejemplo, supngase que se define una matriz magic A de tamao 3
x 3 y a continuacin se forma una matriz binaria M basada en la
condicin de que los elementos de A sean mayores que 4 (MATLAB
convierte este cuatro en una matriz de cuatros de modo automtico).
Obsrvese con atencin.
>> A=magic(3)
A =
8 1 6
lx
3 5 7
4 9 2
>> M=A>4
M =
1 0 1
0 1 1
0 1 0
De ordinario, las matrices binarias que se obtienen de la aplicacin de
los operadores relacionales no se almacenan en memoria ni se asignan
a variables, sino que se procesan sobre la marcha. MATLAB dispone de
varias funciones para ello. Recurdese que cualquier valor distinto de
cero equivale a true, mientras que un valor igual a cero equivale a false.
Algunas de estas funciones son:
any(x) Funcin vectorial; chequea si alguno de los elementos del
vector x cumple una de terminada condicin (en este caso ser
distinto de cero). Devuelve un uno o un cero.
any(A) Se aplica por separado a cada columna de la matriz A. el
resultado es un vector de unos y ceros.
all(x) Funcin vectorial; chequea si todos los elementos del vector x
cumplen una condicin. Devuelve un uno o un cero.
all(A) Se aplica por separado a cada columna de la matriz A. el
resultado es un vector de unos y ceros.
find(x) Busca ndices correspondientes a elementos de vectores que
cumplen una determinada condicin. El resultado es un vector
con los ndices de los elementos que cumplen la condicin.
find(A) Cuando esta funcin se aplica a una matriz la considera como
un vector con una columna detrs de otra, de la 1 a la ultima.
A continuacin se presentan algunos ejemplos de utilizacin de estas
funciones.
A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> m=find(A>4)
lxi
m =
1
5
6
7
8
Ahora se van a sustituir los elementos que cumplen la condicin
anterior por los valores de 10. Obsrvese como se hace y el resultado
que se obtiene:
A(m)=10*ones(size(m))
A =
10 1 10
3 10 10
4 10 2
Donde ha sido necesario convertir el 10 en un vector del mismo tamao
que m. para checar si hay algn elemento de un determinado valor, por
ejemplo 3, puede hacerse lo siguiente:
>> any(A==3)
ans =
1 0 0
any(ans)
ans =
1
Mientras que para comprobar que todos los elementos de A son
mayores que cero:
>>all(all(A))
ans=
1
En este caso no ha hecho falta el operador relacional por que cualquier
elemento distinto de cero equivale a true.
lxii
La funcin isequal (A,B) devuelve uno si las matrices son idnticas y
cero si no lo son.
2.12 Otras funciones mas que actan sobre vectores
y matrices.
Las siguientes funciones pueden actuar sobre vectores y matrices,
sirven para checar ciertas condiciones:
exist(var) Comprueba si el nombre var existe como variable, funcin,
directorio, archivo, etc.
isnan(A) Checa si hay valores NaN en A, devolviendo una matriz de
unos y ceros del mismo tamao que A
iIsinf(A) Checa si hay valores inf en A, devolviendo una matriz de
unos y ceros del mismo tamao que A.
isfinite(A) Checa si los valores de A son finitos.
isempty(A) Checa si un vector o matriz est vaco o tiene tamao
nulo.
ischar() Me dice si una variable es una cadena de caracteres
(string).
isglobal() Dice si una matriz es global.
issparse() Checa si una matriz es dispersa (es decir con un gran
numero de elementos cero).
A continuacin se presentan algunos ejemplos de uso de estas
funciones en combinacin con otras vistas previamente. Se define un
vector X con NaN, que se elimina en la forma:
>> x=[1 2 3 4 0/0 6]
x =
1 2 3 4 NaN 6
>> i=find(isnan(x))
i =
5
>> x=x(find(~isnan(x)))
x =
1 2 3 4 6
lxiii
Otras posibles formas de eliminarlo sera las siguientes:
>> x=x(~isnan(x))
x =
1 2 3 4 6
>> x(isnan(x))=[]
x =
1 2 3 4 6
La siguiente sentencia elimina las filas de una matriz que contienen
algn NaN:
>> A(any(isnan(A)'),:)=[]
Graficos en MATLAB
(2D y 3D)
3.1 Introduccin
A estas alturas, despus de ver como funciona este programa, a nadie
le puede resultar extrao que los grficos 2-D de MATLAB estn
fundamentalmente orientados a la representacin grfica de vectores y
matrices. En el caso ms sencillo los argumentos bsicos de la funcin
plot() van a ser vectores. Cuando una matriz aparezca como
argumento, se considerar como un conjunto de vectores columna (en
algunos casos tambin como vector fila).
MATLAB utiliza un tipo especial de ventanas para realizar la
operaciones grficas. Ciertos comandos abren una ventana nueva y
otros dibujan sobre la ventana activa, bien sustituyendo lo que hubiera
lxiv
3
en ella, o bien aadiendo nuevos elementos grficos a un dibujo
anterior. Todo esto se ver con ms detalle en las siguientes secciones.
3.2 Funciones grficas 2D elementales
MATLAB dispone de cinco funciones bsicas para crear grficos 2-D.
estas funciones se diferencian principalmente por el tipo de escala que
utilizan en los ejes de abscisas y de ordenadas. Estas cinco funciones
son las siguientes:
plot() Crea un grfico a partir de vectores y/o columnas de
matrices, con escalas lineales sobre ambos ejes.
plotyy() Dibuja dos funciones con dos escalas diferentes para las
ordenadas, una a la derecha y otra a la izquierda de la
figura.
loglog() dem con escala logartmica en ambos ejes.
semilogx(
)
dem con escala lineal en el eje de ordenadas y logartmica
en el eje de abscisas.
semilogy(
)
dem con escala lineal en el eje de abscisas y logartmica
en el eje de ordenadas.
En los sucesivo se har referencia casi exclusiva a la primera de estas
funciones (plot). Las dems se pueden utilizar de un modo similar.
Existen adems otras funciones orientadas a aadir ttulos al grfico, a
a cada uno de los ejes, a dibujar una cuadricula auxiliar, a introducir
texto, etc. Estas funciones son las siguientes:
title(titulo) Aade un titulo al dibujo.
xlabel(x) Aade una etiqueta al eje de las abscisas. Con xlabel
off desaparece.
Ylabel(y) Aade una etiqueta al eje de las ordenadas. Con ylabel
off desaparece.
text(x,y,texto
)
Introduce texto en el lugar especificado por las
coordenadas x e y. si x e y son vectores, el texto se
repite por cada par de elementos. Si el texto es
tambin un vector de cadenas de caracteres de la
misma dimensin, cada elemento se escribe en las
coordenadas correspondientes.
gtext(texto) Introduce texto con ayuda del ratn: el cursor cambia
de forma y se espera un click para introducir el texto en
esa posicin.
legend() Define rtulos para las distintas lneas o ejes utilizados
en la figura.
grid Activa la inclusin de una cuadricula en el dibujo. Con
grid off desaparece la cuadricula.
lxv
Borrar texto ( u otros elementos grficos) es un poco mas complicado;
de hecho hay que preverlo de antemano. Para poder hacerlo hay que
recuperar previamente el valor de retorno del comando con el cual se
ha creado. Despus hay que llamar a la funcin delete con ese valor
como argumento.
Considerese el siguiente ejemplo:
>> v=text(1,.0,'seno')
v =
9.7656e-004
Esto crea la figura 3.1.
Figura 3.1.
>> delete (v)
Esta accin anterior borra la figura 3.1.
Los dos grupos de funciones anteriores no actan de la misma manera,
As la funcin plot dibuja una nueva figura en la ventana activa (en todo
momento MATLAB tiene una ventana activa de entre todas las
ventanas grficas abiertas), o abre una nueva si no lo esta,
sustituyendo cualquier cosa que estuviera dibujada sobre ella. Para
verlo, se comenzar creando un par de vectores x e y con los que se va
a trabajar:
>> x=[-10:0.2:10];
lxvi
>> y=sin(x);
Ahora se deben ejecutar los comandos siguientes (se comienza
cerrando la ventana activa, para que al crear la ventana nueva
aparezca en primer plano):
>> close %se cierra la ventana grfica activa
>> grid % se crea una ventana con una cuadricula
>> plot(x,y) % se dibuja la funcin seno borrando la cuadricula
Figura 3.2. grfica de la funcin seno(x).
Se puede observar la diferencia con la secuencia siguiente:
>> close
>> plot(x,y)
>> grid
Figura 3.3. funcin seno con cuadricula.
lxvii
En el primer caso MATLAB ha creado la cuadricula en una ventana
nueva y luego la ha borrado al ejecutar la funcin plot(). En el segundo
caso, primero ha dibujado la funcin y luego ha aadido la cuadricula.
Esto es as por que hay funciones como plot() que por defecto crean
una nueva ventana grafica, y otras funciones como grid que se aplican
a la ventana activa modificndola, y solo crean una ventana nueva
cuando no existe ninguna ya creada.
3.2.1 Funcin plot()
Esta es la funcin clave de todos los grficos 2-D en MATLAB.
Ya que se ha mencionado que el elemento bsico de los grficos
bidimensionales es el vector. Se utilizan tambin cadenas de 1,2
o 3 caracteres para indicar colores y tipos de lnea. La funcin
plot(), en sus diversas variantes, no hace otra coas que dibujar
vectores. Un ejemplo muy sencillo de esta funcin, en el que se
le pasa un nico vector como argumento, es el siguiente:
>> x=[1 3 2 4 5 3]
x =
1 3 2 4 5 3
>> plot(x)
Figura 3.4 grafica de un vector.
El resultado de este comando es que se abre una ventana
mostrando el grafico de la figura anterior. Por defecto, los
lxviii
distintos puntos del grafico se unen con una lnea continua.
Tambin por defecto, el color que se utiliza para la primera lnea
es azul.
Cuando a la funcin plot() se le pasa un nico vector real como
argumento, dicha funcin dibuja en ordenadas el valor de los n
elementos del vector frente a los ndices 1,2,,n del mismo en
abscisas.
En la pantalla se puede aprecias que MATLAB utiliza por defecto
el color blanco para el fondo de la pantalla y otros colores mas
obscuros para los ejes y las graficas.
Una segunda forma de utilizar la funcin plot() es con dos
vectores como argumentos. En este caso los elementos del
segundo vector se presentan en ordenadas frente a los valores
del primero, que se presentan en abscisas; veamos por ejemplo
como se puede dibujar un cuadriltero de esta forma (obsrvese
que para dibujar un polgono cerrado, el ltimo punto debe
coincidir con el primero):
>> x=[1 6 5 2 1];
>> y=[1 0 4 3 1];
>> plot(x,y)
Figura 3.5 dibujo de un cuadriltero.
La funcin plot() permite tambin dibujar mltiples curvas
introduciendo varias parejas de vectores como argumentos. En
este caso, cada uno de los segundos vectores se dibuja en
ordenadas como funcin de los valores del primer vector de la
pareja, que se representan en las abscisas. Si el usuario no
decide otra cosa, para las sucesivas lneas se utilizan colores
que son permutaciones cclicas del azul, verde, rojo, cian,
lxix
magenta, amarillo y negro. Observemos como se dibuja el seno y
el coseno en el siguiente ejemplo:
>> x=0:pi/25:6*pi;
>> y=sin(x);
>> z=cos(x);
>> plot(x,y,x,z)
Figura 3.6 seno y coseno juntas.
3.2.2 Comando subplot
Una ventana grafica se puede dividir en m particiones
horizontales y n particiones verticales, con el objeto de
representar mltiples grficos en ella. Cada una de estas
subventanas tiene sus propios ejes, aunque otras propiedades
son comunes a toda la ventana grafica. La forma general de este
comando es:
>>subplot(m,n,i)
Donde m y n son el nmero de subdivisiones en filas y columnas,
e i es la subdivisin que se convierte en activa. Las subdivisiones
se numeran consecutivamente empezando por las de la primera
fila, siguiendo por las de la segunda, y as sucesivamente. Por
ejemplo la siguiente secuencia de comandos genera cuatro
grficos en la misma ventana:
>> y=sin(x);
>> z=cos(x);
>> w=exp(-x*.1).*y;
>> v=y.*z;
lxx
>> subplot(2,2,1), plot(x,y)
>> subplot(2,2,2), plot(x,z)
>> subplot(2,2,3), plot(x,w)
>> subplot(2,2,4), plot(x,v)
Figura 3.7 varias ventanas grficas.
3.2.3 Control de los ejes: Funcin axis()
Tambin en este punto MATLAB tiene sus opciones por defecto,
que en algunas ocasiones puede interesar cambiar. El comando
bsico es el comando axis. Por defecto, MATLAB ajusta la escala
de cada uno de los ejes de modo que vare entre el mnimo y el
mximo valor de los vectores a representar. Este es el llamado
modo automtico. Para definir de modo explicito los valores
mximo y mnimo segn cada eje, se utiliza el comando:
axis([xmin, xmax, ymin, ymax])
Mientras que:
axis(auto)
Devuelve el escalado de los ejes al valor por defecto o
automtico. Otros posibles usos de este comando son los
siguientes:
v=axis Devuelve un vector v con los valores [xmin, xmax, ymin,
ymax].
axis(ij) Utiliza ejes de pantalla, con el origen en la esquina
superior izquierda y el eje j en direccin vertical
descendente.
axis(xy) Utiliza ejes cartesianos normales, con el origen en la
esquina inferior izquierda y el eje y vertical ascendente.
axis(auto x) Utiliza el escalado automtico solo en direccin x.
lxxi
axis(auto xz Utiliza el escalado automtico solo en direcciones x y z.
axis(axis) Mantiene los ejes en sus actuales valores, de cara a
posibles nuevas graficas aadidas con hold on.
axis(tight) Establece los mismos limites para los ejes que para los
datos.
axis(equal El escalado es igual para ambos ejes.
axis(square
)
La ventana ser cuadrada.
axis(image) La ventana tendr las proporciones de la imagen que se
desea representar en ella (por ejemplo la de una imagen
bitmap que se desea importar) y el escalado de los ejes
ser coherente con dicha imagen.
axis(normal) Elimina las restricciones introducidas por equal y
square.
axis(off) Elimina las etiquetas, los nmeros y los ejes.
axis(on) Restituye las etiquetas, los nmeros y los ejes.
XLim, YLim Permite modificar selectivamente los valores mximo y
mnimo de los ejes en las direcciones x e y.
3.2.4 Control de ventanas graficas: funcin figure
Si se llama a la funcin figure sin argumentos, se crea una
nueva ventana grafica con el nmero consecutivo que
corresponda. El valor de retorno es dicho nmero.
Por otra parte, el comando figure(n) hace que la ventana n pase
a ser la ventana o figura activa. Si dicha ventana no existe, se
crea una nueva ventana con el nmero consecutivo que
corresponda (que se puede obtener como valor de retorno del
comando). La funcin close cierra la figura activa, mientras que
close(n) cierra la ventana o figura numero n.
El comando clf elimina el contenido de la figura activa, es decir,
la deja abierta pero vaca. La funcin gcf devuelve el nmero de
la figura activa en ese momento
A manera de prctica ejecutemos las siguientes instrucciones en
MATLAB, observando con cuidado los efectos de cada una de
ellas en la ventana activa. El comando figure(gcf) permite hacer
visible la ventana de grficos desde la ventana de comandos.
>> x=[-4*pi:pi/20:4*pi];
>> plot(x,sin(x),'r',x,cos(x),'g')
>> title('funcion seno(x)-en rojo-y funcion coseno(x) -en verde-')
>> xlabel('angulo en radianes'),figure(gcf)
>> ylabel('valor de la funcion trignometrica'),figure(gcf)
lxxii
>> axis([-12,12,-1.5,1.5]), figure(gcf)
>> axis('equal'), figure(gcf)
>> axis('normal'),figure(gcf)
>> axis('square'),figure(gcf)
>> axis('off'),figure(gcf)
>> axis('on'),figure(gcf)
>> axis('on'),grid,figure(gcf)
Figura 3.8.
La funcin figure tambin admite que se fijen algunas de sus
propiedades, como por ejemplo la posicin y el tamao con que
aparecer en la pantalla. Por ejemplo el comando:
>>figure(position,[left,botton, width,height])
Abre una ventana cuya esquina inferior izquierda est en el punto
(left, botton) respecto a la esquina inferior izquierda de la pantalla
(en pixels), que tiene una anchura de width pixels y una altura de
height pixels.
3.2.5 Funcin fill para polgonos.
Esta es una funcin especial para dibujar polgonos planos,
rellenndolos de un determinado color. La forma general es la
siguiente:
>>fill(x,y,c)
Que dibuja un polgono definido por los vectores x e y,
rellenndolo con el color especificado por c. si es necesario, el
polgono se cierra uniendo el ultimo vrtice con el primero.
Respecto al color:
lxxiii
- Si c es un carcter de color (r,g,b,c,m,y,w,k),
un vector de valores [r g b, el polgono se rellena de
modo uniforme con el color especificado.
- Si c es un vector de la misma dimensin que x e y, sus
elementos se transforman de acuerdo con un mapa de
colores determinado, y el llenado del polgono no
uniforme en este caso se obtiene interpolando entre
los colores de los vrtices.
Este comando puede utilizarse tambin con matrices:
>>fill(A,B,C)
Donde A y B son matrices del mismo tamao. En este caso se
dibuja un polgono por cada par de columnas de dichas matrices.
C puede ser un vector fila de colores uniformes para cada
polgono, o una matriz del mismo tamao que las anteriores para
obtener colores de relleno por interpolacin. Si una de las dos A
o B, son un vector en vez de una matriz, se supone que ese
vector se repite tantas veces como sea necesario para dibujar
tantos polgonos como columnas tiene la matriz. Consideremos
el siguiente ejemplo de esta funcin.
Figura 3.9 polgono rellenado.
3.3 Grficos Tridimensionales.
Quizs sea sta una de las caractersticas de MATLAB que ms
admiracin despierta entre los usuarios no tcnicos (cualquier alumno
de ingeniera sabe que hay ciertas operaciones algebraicas como la
descomposicin de valores singulares, sin ir mas lejos que tienen
dificultades muy superiores, aunque no lo parezcan).
lxxiv
3.3.1 Tipos de funciones graficas tridimensionales.
MATLAB tiene posibilidades de realizar varios tipos de grficos
3D. para darse una idea de ello lo mejor es verlo en la pantalla
de nuestra computadora, aunque haya que dejar las
explicaciones detalladas para mas delante.
La primera forma de grafico 3D es la llamada funcin plot3, que
es el anlogo tridimensional de la funcin plot(). Esta funcin
dibuja puntos cuyas coordenadas estn contenidas en 3
vectores, bien unindolos mediante una lnea continua (defecto),
o bien mediante markers. Asegrese de que no hay ninguna
ventana grfica abierta y ejecute el siguiente comando que dibuja
una lnea espiral en color rojo:
Figura 3.10 uso de la funcin plot3.
Ahora veremos como se representa una funcin de dos variables
independientes. Para ello se va a definir una funcin de este tipo en
un archivo llamado prueba3d.m. la formula es la siguiente:
( )
( ) ( )
2 2 2 2 2 2
1 5 3 1 2
3
1
5
10 1 3
y x y x y x
e e y x
x
e x z
+ +

,
`

.
|

El archivo prueba3d.m debe contener las lneas siguientes:
functin z=prueba3d(x,y)
Z=3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-
-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)
-1/3*exp(-(x+1).^2-y.^2);
lxxv
Ahora ejecutemos la siguiente lista de comandos:
>> x=[-3:0.4:3]
>>close
>>subplot(2,2,1)
>>figure(gcf), fi=[0:pi/20:6*pi];
>>plot3(cos(fi),sin(fi),fi,r)
>>grid
>>[x,y]=meshgrid(x,y);
>>z=prueba3d(x,y);
>>subplot(2,2,2)
>>figure(gcf), mesh(z)
>>subplot(2,2,3)
>>figure(gcf), surf(z)
>>subplot(2,2,4)
>>figure(gcf), contour3(z,16)
Figura 3.10 varias graficas tridimensionales.
En esta figura resultante aparece una buena muestra de algunas
de las posibilidades grficas tridimensionales de MATLAB.
3.3.2 Dibujo de mallas: funciones meshgrid, mesh y surf
Ahora veremos a detalle como se puede dibujar una funcin de
dos variables (z=f(x,y)) sobre un dominio rectangular. Tambin
veremos como se pueden dibujar los elementos de una matriz
como funcin de los dos ndices.
lxxvi
Sean x e y dos vectores que contienen las coordenadas en una y
otra direccin de la retcula (grid) sobre la que se va a dibujar la
funcin. Despus hay que crear dos matrices X (cuyas filas son
copias de x) e y (cuyas columnas son copias de y). estas
matrices se crean con la funcin meshgrid. Estas matrices
representan respectivamente las coordenadas x e y de todos los
puntos de la retcula. La matriz de valores z se calcula a partir de
las matrices de coordenadas X e Y. finalmente hay que dibujar
esta matriz z con la funcin mesh, cuyos elementos son funcin
elemento a elemento de los elementos de X e Y. veamos como
ejemplo el dibujo de la siguiente funcin:
( )
2 2
2 2
y x
y x sen
z
+
+

>> close all


>> u=-8:0.5:8; v=u;
>> [u,v]=meshgrid(u,v);,
>> r=sqrt(u.^2+v.^2)+eps;
>> z=sin(r)./r;
>> surf(z)
Figura 3.11 uso del surf.
3.3.3 Dibujo de lneas de contorno: funciones contour y
contour3
lxxvii
Una forma distinta de representar funciones tridimensionales es
por medio de isolineas o curvas de nivel. A continuacin se ver
como se puede utilizar esta representacin
>> close all
>> u=-8:0.5:8; v=u;
>> [u,v]=meshgrid(u,v);,
>> r=sqrt(u.^2+v.^2)+eps;
>> z=sin(r)./r;
>> contour(z,20)
Figura 3.12 curvas de nivel.
>>contour3(z,20)
Figura 3.13 curvas de nivel 3D.
lxxviii
Donde 20 representa el nmero de lneas de nivel. Si nos e
pone se utiliza un numero por defecto.
Otras formas posibles de estas funciones son las siguientes:
contour(z,val) Siendo val un vector de valores para las isolineas
a dibujar.
contour(u,v,z,20) Se utilizan u y v para dar valores a los ejes de
coordenadas.
contour(z,20,r--) Se puede especificar el tipo de lnea como en la
funcin plot().
contourf(z,val) Anloga a contour(), pero rellenando el espacio
entre lneas.
3.3.4 Utilizacin del color en grficos 3D
En los dibujos realizados hasta ahora, se ha visto que el
resultado adoptaba determinados colores, pero todava no se ha
explicado de donde han salido. Ahora veremos que sistema
utiliza MATLAB para determinar los colores.
Un mapa de colores se define como una matriz de tres columnas,
cada una de las cuales contiene un valor entre cero y uno, que
representa la intensidad de uno de los colores fundamentales:
r(red o rojo), g(green o verde) y b(blue o azul).
La longitud por defecto de los mapas de colores de MATLAB es
de 64, es decir, cada mapa de color contiene 64 colores. Esta
longitud puede modificarse.
Algunos mapas de colores estn predefinidos en MATLAB.
Buscando colormap en Help se obtiene entre otra informacin la
lista de los siguientes mapas de colores:
autumn
bone
colorcube
cool
copper
flag
gray
hot
hsv
jet
lines
lxxix
pink
prism
spring
summer
white
winter
El colormap por defecto es jet. Para visualizar estos mapas de colores,
cambiando al mismo tiempo su longitud, se pueden utilizar los
siguientes comandos en el command window:
>>colormap(hot(128))
>>pcolor([1:129;1:129])
Donde la funcin pcolor permite visualizar por medio de colores
la magnitud de los elementos de una matriz (en realidad
representa colores de celdas, para lo que necesita que una
matriz tenga una fila y columna ms de las necesarias; esa es la
razn de que en el ejemplo anterior a la funcin pcolor se le
pasen 129 filas y 2 columnas).
3.3.5 Dibujo de superficies faceteadas.
La funcin surf tiene diversas posibilidades referentes a la forma
en que son representadas las facetas o polgonos coloreados.
Las tres posibilidades son las siguientes:
shading flat Determina sombreado con color constante para cada
polgono. Este sombreado se llama plano flat.
shading
interp
Establece que el sombreado se calcular por
interpolacin de colores entre los vrtices de cada faceta,
se llama tambin sombreado de Gouraud.
sading
faceted
Consiste en sombreado constante con lneas negras.
superpuestas. Esta es la opcin por defecto.
>> surf(z), shading flat
lxxx
Figura 3.14 sombreado de grafica.
>> surf(z), shading interp
Figura 3.15 sombreado mas fino.
3.3.6. Otras funciones grficas 3D
Las siguientes funciones se derivan directamente de las
anteriores, pero aaden algn pequeo detalle y/o funcionalidad.
surfc Combinacin de surf y contour en z=0.
trisurf Similar a surf, dibuja una superficie 3D a partir de los valores
de una funcin en una malla de tringulos.
meshz Mesh con plano de referencia en el valor mnimo y una
lxxxi
especia de cortina en los bordes del dominio de la funcin.
trimesh Similar a mesh, dibuja una superficie 3D a partir de los
valores de una funcin en una malla de tringulos.
surfl Para controlar la iluminacin determinando la posicin e
intensidad de un foco de luz.
light Crea un foco de luz en los ejes actuales capaz de actuar
sobre superficies 3D. se le deben pasar como argumentos el
color, el estilo (la luz focal o en el infinito) y la posicin. Son
muy importantes las propiedades de los objetos iluminados
patch y surface.
colorbar Aade el mapa de colores activo en la figura,
redimensionando los ejes para hacerle un lugar. Se puede
colocar horizontal o verticalmente.
sphere Dibuja una esfera 3D de radio la unidad. Por defecto se utiliza
un facetado de 20 (20 meridianos y 20 paralelos). Este
nmero se puede cambiar. Es posible recoger las
coordenadas como valor de retorno y multiplicarlas por un
factor de escala.
cylinder Dibuja una superficie cilndrica de radio 1 y altura 1, con 20
facetas laterales. Este numero se puede cambiar, como
segundo argumento. El primer argumento puede ser un
vector que indica como vara el radio en funcin de la altura
del cilindro, tambin es posible recoger las coordenadas
como valor de retorno y multiplicarlas por un factor de escala.
lxxxii
Preludio a la programacin
lineal y no lineal
Finalidad
En este captulo se hace una revisin de la aplicacin de la
programacin lineal y no lineal como mtodo matemtico que logra
aportar informacin para la toma de decisiones en el rea
silvoagropecuaria.
4.1 Introduccin
La programacin lineal constituye una de las ramas de la optimizacin
ms estudiada y desarrollada en los ltimos aos. Es un instrumento
habitual en las empresas y administraciones pblicas de todo el mundo,
adems de tener numerosas aplicaciones prcticas en otras muchas
ramas de la ciencia y tecnologa.
Por ejemplo, los agricultores deben localizar reas de plantacin
sujetas a varias restricciones como subsidios del gobierno,
disponibilidad de capital y de mano de obra, riego, transporte y uso de
lxxxiii
4
equipamiento. Basado en un conjunto razonable de expectativas de
precios se us la programacin lineal para desarrollar un plan de uso
de la tierra y control de stock buscando la maximizacin de ganancias
anuales. El resultado de los anlisis de sensibilidad le da ciertas
herramientas al agricultor para responder al "qu hacer si" y as
planificar en mejor forma.
Desde un punto de vista puramente matemtico, La programacin
lineal es una tcnica utilizada para maximizar o minimizar una funcin
lineal de varias variables no negativas sujetas a un sistema de
ecuaciones y/o desigualdades lineales.
4.2. Antecedentes
El origen y evolucin de la programacin lineal se ha presentado en la
econometra. Este data de 1874 con los trabajos del economista
Walrras. Se atrevi a introducirse en las complejidades matemticas de
un equilibrio general de multimercados.
Otros en utilizar las tcnicas de la programacin lineal fueron los
economistas de la antigua Unin Sovitica para la planificacin de los
planes quinquenales. As por ejemplo, en 1939 Kantorovich public una
monografa en la que se apuntaba la posibilidad de aplicar modelos
lineales para aumentar la eficiencia en la organizacin y planificacin
de la produccin.
Probablemente el antecedente ms importante de la programacin
lineal lo constituye el anlisis de la Matriz de Insumo Producto, su autor
W. Leontief (1941).
A partir de 1951, se conoci universalmente el algoritmo de uso general
para resolver problemas de programacin lineal, se trata del Cuadro
Simplex, el cual fue desarrollado en 1947 por George B. Dantzing.
En 1984 el matemtico Narenda Karmarkar ha encontrado un
algoritmo, llamado algoritmo de Karmarkar, que es ms rpido que el
mtodo Simplex en ciertos casos. Los problemas de este tipo, en el que
intervienen gran nmero de variables, se implementan en ordenadores.
4.3 Conjuntos convexos
lxxxiv
Este apartado trata del estudio del concepto de convexidad que
desempea un importante papel en la programacin matemtica,
puesto que permite obtener resultados tericos y aplicar mtodos
especficos.
Son conjuntos convexos aquellos que tienen la propiedad de que al unir
con un segmento dos puntos cualesquiera del conjunto, el segmento
queda completamente contenido en el propio conjunto.
Figura 4.1. Ejemplos de conjuntos convexos.
Figura 4.2. Ejemplo de un conjunto no convexo.
4.4 Funciones convexas
Esta seccin trata los conceptos de convexidad y concavidad aplicados
a funciones.
Grficamente, las funciones convexas son aquellas en las cuales los
segmentos que unen cualquier par de puntos de su grfica quedan
siempre por encima de la grfica.
Las propiedades de las funciones convexas son:
lxxxv
Las funciones lineales son a la vez cncavas y convexas pero no
estrictamente.
La suma de funciones convexas sigue siendo una funcin
convexa.
Como generalizacin de la propiedad anterior puede decirse
que cualquier combinacin lineal con coeficientes positivos de
funciones convexas es una funcin convexa.
Si f(x) es una funcin convexa, entonces -f(x) es una funcin
cncava. Ms an, al multiplicar una funcin convexa por una
constante negativa el resultado es una funcin cncava.
4.5 Planteamiento del modelo
La programacin matemtica consiste en el clculo de mximos y
mnimos de funciones de varias variables sometidas a un conjunto de
restricciones. Ambos problemas son en el fondo equivalentes ya que el
punto en el que una funcin alcanza un mximo es el mismo en el que
su opuesta alcanza un mnimo.
Cuando se habla de solucin ptima de un problema, o simplemente
ptimo de dicho problema, es necesario distinguir entre los conceptos
de:
Valor ptimo: valor de la funcin objetivo en el punto ptimo.
Punto ptimo: punto en el cul el problema alcanza el mximo o el
mnimo.
Se puede hablar de dos tipos de mnimos y por supuesto de dos tipos
de mximos:
Mnimos locales: el valor de la funcin en ese punto es ms
pequeo que en cualquier otro punto en un cierto entorno suyo.
Mnimos globales: el valor de la funcin en ese punto es ms
pequeo que en cualquier otro punto de la regin factible.
lxxxvi
Figura 4.3. Ejemplo de mximos y mnimos globales.
Consideremos los siguientes teoremas que son el fundamento de la
programacin lineal.
Teorema 1.1. (Teorema fundamental de la programacin convexa):
Todo ptimo de un programa convexo es global.
Teorema 1.2. (Weierstrass): Si la funcin objetivo f(x) es una funcin
continua y la regin factible D es un conjunto compacto (cerrado y
acotado), entonces el problema admite al menos un mnimo y un
mximo globales.
Teorema 1.3. (Unicidad de solucin para problemas estrictamente
convexos): En un problema estrictamente convexo el ptimo, en caso
de existir, es nico.
Teorema 1.4: En un problema convexo cualquier combinacin lineal
convexa de ptimos sigue siendo un ptimo.
Un programa lineal es aquel en el cual la funcin objetivo es lineal y las
restricciones estn dadas por un conjunto de ecuaciones e
inecuaciones tambin lineales.
El hecho de que la funcin objetivo del problema sea lineal y el espacio
de soluciones factibles sea interseccin de hiperplanos y semiespacios,
implica, entre otras cosas, que todo programa lineal es convexo, por lo
que se cumplen automticamente todos los resultados de la
programacin convexa vistos hasta ahora.
lxxxvii
4.6 Determinacin geomtrica de programas
matemticos
Este primer mtodo de resolucin de programas matemticos tiene un
campo de aplicacin bastante restringido, ya que es aplicable
solamente a problemas con dos variables de decisin. Con bastantes
dificultades podra generalizarse al caso de tres variables de decisin.
Las etapas para la solucin grfica son:
i) Para resolver una desigualdad lineal
1 1 2 2 1 1 2 2
a X a X b o a X a X b + +
se hace positivo el coeficiente de X1, cambiando el sentido de la
desigualdad cuando haya necesidad de multiplicar por 1.
ii) Se grfica la recta: 1 1 2 2
a X a X b +
.
iii) La solucin grfica de la desigualdad es el semiplano superior de
la recta si la desigualdad es en el sentido y es el semiplano
inferior si la desigualdad es el sentido . Si a1 = 0, la recta
2 2
a X b
es vertical y la solucin de
2 2
a X b
es el semiplano de la
izquierda (haciendo a2 positivo).
iv) Agregando las condiciones de no negatividad 1 2
X , X 0
la
solucin grfica de la desigualdad lineal es la interseccin del primer
cuadrante del plano
1 2
X X
. Caso contrario, el problema es
imposible.
v) Una vez que se ha determinado la regin de soluciones factibles, se
asigna a Z un valor arbitrario Z0 para graficar la recta
0 1 1 2 2
Z c X c X +
funcin objetivo.
vi) Para maximizar Z, se traslada paralelamente la recta
correspondiente al nivel Z0 escogido arbitrariamente hasta el punto
ms alto posible de la regin de soluciones factibles. Si el problema
es minimizar Z, la recta se traslada paralelamente hasta el punto
ms bajo posible de la regin soluciones factibles.
lxxxviii
Figura 4.4. Regin de soluciones factibles.
4.7 Mtodo grfico con MATLAB
Resolviendo por el mtodo grfico el siguiente planteamiento:
Maximizar Z = 8X + 5Y
Sujeta a:
2X + Y 1200
3X + 4Y 2400
X + Y 800
X 0, Y 0 (No negatividad)
Graficando las regiones especificadas por las restricciones en el primer
cuadrante del plano XY. Escribiendo en el command window de
MATLAB la expresin
X = 0:600;
Y1 = (1200-2*X);
area(X, Y1);
Obtenemos
lxxxix
Figura 4.5. Primer cuadrante determinado por la primera desigualdad.
Ahora, graficando las otras dos desigualdades de restriccin
Y2=max((2400-3*X)/4,0);
Y3=max(800-X,0);
Ytop=min([Y1;Y2;Y3]);
area(X,Ytop);
Figura 4.6. Regin de soluciones factibles.
Vamos ahora superponer en la figura 2.6, un grfico de contorno de la
funcin objetivo.
hold on
[U V] = meshgrid(0:600, 0:1200);
contour(U, V, 8*U + 5*V); hold off
xc
Figura 4.7. Regin de soluciones factibles y curvas de nivel.
Parece evidente que el valor mximo se producir en la curva de nivel
que pasa por el vrtice del polgono. De hecho, podemos calcular
[x, y] = solve('2*x + y = 1200', '3*x + 4*y = 2400')
x =
480
y =
240
En ese caso, el valor de Z es
Z = 8*x + 5* y
Z =
5040
Este problema ilustra y se rige por el teorema fundamental de la
programacin lineal.
4.8 Mtodo grfico alternativo con MATLAB
xci
En geometra un politopo significa, la generalizacin a cualquier
dimensin de un polgono bidimensional, y un poliedro tridimensional. El
trmino fue creado por Alicia Boole Stott, hija del lgico matemtico G.
Boole.
4.8.1 Convex hull
En matemticas, el convex hull o cerco envolvente para un conjunto de
puntos X es un espacio vectorial real V, con el mnimo conjunto
convexo que contiene a X.
El convex hull de X puede ser descrito como el conjunto de
combinaciones convexas de puntos desde X. el cerco convexo de X es:

'

'




k
i
k
i
i i i i i i convex
k X x x X H
1 1
,... 2 , 1 , 1 , 0 , , | ) (
Con X un subconjunto del espacio vectorial n-dimensional
El convex hull de un conjunto de puntos, es la interseccin de todos los
conjuntos convexos. En particular, un conjunto es convexo, si todas las
combinaciones de pares de puntos son convexas.
El convex hull para un conjunto de puntos X, es el mnima conjunto
convexo, que contiene los puntos de X.
Figura 4.8. El convex hull para un conjunto de puntos X

Debido a sus multiples aplicaciones, la computacin del convex hull
apoyada por la geometra computacional, ha sido estudiada
xcii
intensivamente; y los campos como el reconocimiento de patrones,
cutting stock y allocation, son solo algunas de sus aplicaciones.
Los algoritmos de Graham y Jarvis, son dos algoritmos muy utilizados
para determinar el convex hull.
MATLAB, incluye en su biblioteca de funciones, la funcin convhull,
esto es the Quickhull Algoritm for Convex Hull, que combina el
Quickhull Algoritm y el Beneath-Beyound Algorithm; muy similar al
algoritmo aleatorio y de incrementos para la triangulacin de delaunay.
Una bsqueda aleatoria por rbol, en contraste con las bsquedas de
los arboles balanceados, es que la conducta depende de los valores
producidos por generadores de nmeros aleatorios, antes que por el
orden de entrada.
La funcin convhull, posee las siguientes sintaxis:
K=convhull(x,y)
K=convhull(x,y,options)
[k,a]=convhull()
Donde k=convhull(x,y) retorna los ndices de los vectores x e y de los
puntos en el convex hull. Ejecutando los comandos de MATLAB, que se
necesitan, se consigue invocar y ejecutar la funcin convhull. Esta
funcin necesita de los puntos x e y entregando el cerco convexo como
resultado.
>> x=[21.87 8.33 36.36 0 0];
>> y=[53.12 66.66 0 71.42 0]
>> k=convhull(x,y);
>> fill(x(k),y(k),'r')
Figura 4.9. El convex hull obtenido con MATLAB.
xciii
4.8.2 Teorema de la solucin bsica factible.
Sea k el conjunto de soluciones factibles en la PL (programacin lineal),
si k x es un punto extremo de k, entonces este es una solucin
bsica factible.
El sistema de ecuaciones del problema de PL. consta de m igualdades
y n restricciones. Se asume que el rango de A (matriz de coeficientes)
es m; cada base consiste de m vectores columnas de A. el nmero total
de distintas bases para el problema de PL. en la forma estndar es
menor que o igual que la combinacin binomial de n en m:
( )! !
!
m n m
n
m
n

,
`

.
|
Cada solucin bsica factible est asociada con una o ms bases para
el problema de PL. El nmero total de distintas soluciones bsicas
factibles no puede exceder de esta combinacin, la cual es finita.
A continuacin se enuncian las funciones esquina.m y su funcin
asociada borrarcol.m (funciones hechas en el lenguaje de
programacin de MATLAB)
Funcin esquina.m
function puntos=esquina(A,b)
%puntos extremos para un problema de PL
%FELIX DE J. SANCHEZ Y S. SANCHEZ M.
%
[m,n]=size(A);
puntos=[];
if n>=m
combin=nchoosek(n,m); %coeficientes binomiales
v=nchoosek(1:n,m);
%la matriz v contiene todas las combinaciones
%n filas y m columnas
for k=1:combin
y=zeros(n,1);
x=inv(A(:,v(k,:)))*b;
if all (x>=0 & (x~=inf & x~=-inf))
y(v(k,:))=x;
puntos=[puntos y];
end
end
else
error('NUMERO DE ECUACIONES ES MAYOR QUE
EL NUMERO DE VARIABLES');
end
xciv
puntos;
%borra puntos repetidos
puntos=borracol(puntos);
funcion borracol.m
function puntos=borracol(puntos)
%borra las columnas repetidas
%FELIX DE J. SANCHEZ Y SERGIO SANCHEZ M.
%
[nn,L]=size(puntos);
v=[];
for i=1:L-1
for j=i+1:L
x=puntos(:,i);
y=puntos(:,j);
if all (x==y)
v=[v,j];
end
end
end
puntos(:,v)=[];
4.8.3 Teorema de la resolucin
Cada solucin factible del problema de la programacin lineal, puede
ser expresada como la suma de:
1) Una combinacin convexa de las soluciones bsicas factibles del
problema de la programacin lineal
2) Una solucin homognea correspondiente al problema de la
programacin lineal.
Es decir un sistema de ecuaciones, con variables no negativas del
problema de la programacin lineal, y una solucin homognea
correspondiente al problema, corresponde a un vector y que satisface:
0
0

y
Ay
Un sistema homogneo correspondiente es llamado una solucin
homognea extrema, si este es una solucin bsica factible de:
i y
y
Ay
i
n
i
i

, 0
1
0
1
xcv
Lema:
Cualquier cero es la solucin homognea nica, o cada solucin
homognea correspondiente puede ser expresado como una
combinacin lineal de soluciones homogneas extremas.
La funcin graficapl.m se muestra en seguida:
function graficapl(A,b,c,direccion)
close all
%solucion grafica para programacion Lineal
%FELIX DE J. SANCHEZ Y SERGIO SANCHEZ M.
%Programacion lineal para dos variables
%A=matriz de diseo
%b=vector de resultados
%c= vector de costos
%direccion=cadena de la direccion de las variables
%
[m,n]=size(A);
if n~=2
string='EL METODO ES SOLO PARA DOS VARIABLES';
msgbox(string,'ERROR EN EJECUCION','help');
return
end
%crear la submatriz de olguras e invocar la funcion esquina
A=[A,eye(m)];
for k=1:m
if direccion(k)=='>'
A(k,n+k)=-1;
end
if b(k)<0
A(k,:)=-A(k,:);
b(k)=-b(k);
end
end
n=n+m;
vertices=esquina(A,b);
if length(vertices)==0
%error('NO EXISTE REGION FACTIBLE');
msgbox('NO EXISTE REGION FACTIBLE');
return
end
vertices=vertices(1:2,:);
vertices=deletecol(vertices);
d=esquina([A;ones(1,n)],[zeros(m,1);1]);
if length(d)>0
%error('NO EXISTE REGION FACTIBLE ACOTADA');
string='NO EXISTE REGION FACTIBLE ACOTADA';
msgbox(string,'SIN REGION FACTIBLE','help');
return
end
x1=vertices(1,:);
x2=vertices(2,:);
xcvi
k=convhull(x1,x2);
hold on;
fill(x1(k),x2(k),'b');
xlabel('X_1','fontsize',16);
ylabel('X_2','fontsize',16);
z=c*vertices;
z0=max(z);
j=find(z==z0);
x0=vertices(1,j); y0=vertices(2,j);
if c(1)*c(2)~=0
x=[0.8*x0,1.2*x0]; y=y0+(-c(1)/c(2))*(x-x0);
plot(x,y,'g--','linewidth',3);
legend('Region Factible', 'funcion objetivo');
end
title(['REGION DE SOLUCION FACTIBLE, CON
Z=',num2str(z0)],'FontSize',15)
text(x0,y0,['
(',num2str(x0),',',num2str(y0),')'],'FontSize',15)
plot(x0,y0,'o',...
'MarkerEdgeColor','r',...
'MarkerEdgeColor','r',...
'MarkerSize',20)
grid on
Resolvamos un ejemplo haciendo uso de estas nuevas funciones
creadas para tal fin.
Daremos solucin dos problemas usando este mtodo; el primero es el
problema descrito con anterioridad, al cual ya se le dio solucin por
medio de la tcnica grafica anterior y el segundo ejemplo ser descrito
posteriormente.
Ejemplo 4.1.
Resolviendo por el mtodo grfico el siguiente planteamiento:
Maximizar Z = 8X + 5Y
Sujeta a:
2X + Y 1200
3X + 4Y 2400
X + Y 800
X 0, Y 0 (No negatividad)
a) Se define la matriz A (matriz de coeficientes) de la siguiente manera:
>> A=[2 1;3 4;1 1]
xcvii
A =
2 1
3 4
1 1
b) Se define el vector columna con los resultados:
>> b=[1200;2400;800]
b =
1200
2400
800
c) Se define la funcion objetivo como un vector fila:
>> c=[8 5]
c =
8 5
d) Por ultimo se definen entre apostrofes el sentido de las
desigualdades en fila.
>> d='<<<'
d =
<<<
Se invoca la funcin graficapl.m de la siguiente manera:
>> graficapl(A,b,c,d)
Y se obtiene lo siguiente
xcviii
Figura 4.10 solucion por el mtodo grfico
Comparese este resultado con el resultado hallado anteriormente
pare este mismo ejemplo.
Ejemplo 4.2.
Una compaa tiene dos tipos de i9nspectores, asignados a control
de calidad. Actualmente se tiene una carga de por lo menos 1800
piezas por inspeccionar en una jornada de 8 horas. Los datos
adicionales se muestran en la tabla siguiente. Se desea minimizar
los costos totales, en la asignacin ptima de los inspectores.
Considerar que el costo por error en una ninspeccion es de $2.0.
Tabla 1. Estado de prdidas y ganacias
camion camioneta
Valor de venta 8000 6000
Costo de material 3000 2500
Costo de mano de obra (20% CM) 600 3600 500 3000
Utilidad Bruta 4400 3000
xcix
Gasto administrativo 300 250
depreciacion 100 200
Gasto general (50% depreciacin) 50 100
Gastos variables (2 gastos
administrativos)
600 1050 500 1050
Beneficios antes de impuestos 3350 1950
Tipos de
inspectores
Tasa
(unidades/hr.
)
Precision
(%)
Salario
($/hr.)
disponibilidad
1 25 98 4 8
2 15 95 3 10
El costo por desarrollar la inspeccion por hora, es la suma del
salario ms los costos por error en la inspeccion; esto es:
. / 5 . 4 $ ) 05 . 0 )( 15 ( 2 3 $ : 2
. / 5 $ ) 02 . 0 )( 25 ( 2 4 $ : 1
hr Tipo
hr Tipo
+
+
La funcion objetivo, corresponde al total de una jornada de 8 horas:
. / 5 $ ) 5 . 4 5 ( 8
2 1
hr x x Z +
La condicion de unidades a inspeccionar en una jornada de 8 horas
es:
45 3 5 18000 ) 15 ( 8 ) 25 ( 8
2 1 2 1
+ + x x o x x
El problema de programacion lineal es como sigue:
2 1
36 40 min x x Z +
Definamos las siguientes variables:
>> A=[1 0;0 1;5 3]
A =
1 0
0 1
5 3
>> b=[8;10;45]
c
b =
8
10
45
>> c=[-40 -36]
c =
-40 -36
>> d='<<>'
d =
<<>
>> graficapl(A,b,c,d)
La respuesta de matlab es:
Figura 4.11 solucion por el mtodo grafico
ci
Las funciones anteriores se crearon exclusivamente para dar
solucion por medio del metodo grafico y cuando le funcion objetivo
es Maximizar.
En casos como el anterior en donde la funcion objetivo me dice
minimizar, entonces los coeficientes de la funcion objetivo se
multiplican por menos uno para poderr encontrar la verdadera
solucion.
4.9 Mtodo Simplex
Ya se ha comentado la propiedad de que todos los programas lineales
alcanzan un ptimo, si ste existe, en una de sus soluciones bsicas
factibles. Adems el nmero de tales soluciones bsicas es siempre
finito. Por tanto, un mtodo de resolucin de este tipo de problemas es
la construccin de todas las soluciones bsicas factibles y la seleccin
de aquella que minimice la funcin objetivo. Por supuesto, este mtodo
resulta claramente ineficiente cuando se trabaja con problemas con
gran nmero de variables de decisin.
La idea del mtodo Simplex, ideado por G. B. Dantzing en 1947,
consiste en llegar a encontrar esa solucin bsica ptima sin necesidad
de construirlas todas, nicamente seleccionando un subconjunto de
ellas que converja a la solucin. De una forma muy resumida el mtodo
Simplex consiste en:
Debe partirse de una solucin bsica factible inicial.
Si dicha solucin bsica no es ptima, entonces encontrar otra que
haga que el valor de la funcin objetivo disminuya, o por lo menos
que no aumente.
Repetir el paso anterior hasta encontrar una solucin bsica factible
que sea ptima.
Geomtricamente, el mtodo Simplex se puede interpretar de la
manera siguiente: partiendo de uno de los vrtices del poliedro, ir
desplazndose a uno de los vrtices adyacentes mejorando el valor de
la funcin objetivo hasta encontrar el ptimo.
cii
Figura 4.12. Regin de soluciones factibles.
4.9.1 Ruptura de las desigualdades
Como la solucin al problema de programacin lineal se abordar con
ecuaciones, ser necesario romper las restricciones de desigualdad, y
convertirlas en ecuaciones.
Por ejemplo, las desigualdades
Se pueden convertir en igualdades, aadiendo las variables no
negativas, U1 y U2 (variables de holgura), del lado ms dbil de las
desigualdades
Cuando se trata de romper las desigualdades:
A toda desigualdad del tipo , se le suma una variable de holgura
U 0 del lado izquierdo.
A toda desigualdad del tipo , se le resta una variable de holgura U
0 del lado izquierdo.
A cada desigualdad se le asocia una variable de holgura distinta.
Para resolver un programa lineal mediante el mtodo Simplex, debe
estar dado en su forma estndar, que matricialmente puede
expresarse:
ciii
13 X 5 X 2
10 X 2 X 3
2 1
2 1
+
+
2 2 1
1 2 1
U 13 X 5 X 2
10 U X 2 X 3
+ +
+ +
Min cx donde c 1 n
Ax b A m n
x 0 b m 1 > 0
4.9.2 Uso de variables artificiales
No siempre es posible en la tabla del Simplex disponer de un conjunto
de vectores que, convenientemente ordenados, formen la matriz
identidad. Una forma de conseguirlo es aadir unas nuevas variables al
problema que se conocen como variables artificiales. Lgicamente para
que estas variables introducidas no afecten a la solucin del problema,
lo deseable es que dejen de ser bsicas rpidamente y de esta manera
se anulen. La forma de conseguirlo es aadindolas a la funcin
objetivo con un coeficiente muy alto positivo.
As,
A toda desigualdad del tipo , se le suma una variable artificial V
0 del lado izquierdo.
A toda igualdad se le suma una variable artificial V 0 del lado
izquierdo.
Se supone adems que el nmero de variables es mayor o igual que el
nmero de restricciones de igualdad (n m). Sin ninguna prdida de
generalidad puede suponerse tambin que bk 0 para todo k =
1,2,...,m.
4.9.3 Solucin ptima por enteros
La programacin lineal entera constituye una variante de la
programacin lineal. En el ltimo caso las variables de decisin
pertenecen al cuerpo de los nmeros reales no negativos, mientras que
en el primero pertenecen al cuerpo de los nmeros enteros no
negativos. Un caso especial dentro de la programacin entera lo
constituye el caso lmite de que las variables sean binarias. Estas
variantes de la programacin lineal continua, se introduce de forma
necesaria en muchas situaciones prcticas en las que las variables de
actividad, objeto de decisin, solo pueden tomar valores enteros. El
nmero de ejemplos es enorme: trabajadores, ganado, mquinas,
civ
fabricas, proyectos, etc. Si el valor de las variables de decisin es
considerable, entonces no se comete un error excesivo tomando la
parte entera o redondeando la solucin continua, pero se puede correr
el riesgo de generar una solucin no factible. Si los valores de las
variables de actividad son bajos, entonces los errores pueden ser
considerables al igual que los riesgos de perdida de la factibilidad. Se
han desarrollado diversos mtodos de programacin lineal con la
condicin de valores enteros en las variables, la mayora de los cuales
parten de soluciones iniciales continuas. Se presenta nicamente un
algoritmo representativo.
Algoritmo:
1) La columna pivote corresponde a la variable que tiene el mayor
coeficiente positivo en la funcin objetivo.
2) Si el mayor coeficiente positivo de la funcin objetivo est en la
columna K, entonces el rengln pivote se escoge en donde est el
menor valor de (bi / aik) > 0.
3) Encerrar el pivote, y formar la tabla nueva:
3.1 Transcribir el rengln pivote, en la misma posicin.
3.2 Completar con ceros la columna pivote.
3.3 Modificar los elementos restantes, haciendo los
productos diagonales reducidos.
Observacin:
Caso de
estudio
Decisin Artificiales Holgura
MAX Z Cj - 1 000 0
MIN Z - Cj - 1 000 0
Coeficientes Cj, cuando hay t variables artificiales.
Ejemplo 4.3.
Una empresa tiene dos ranchos M y N. Diariamente, el rancho M, con
un gasto de 200 dlares, produce 1 tonelada de alfalfa de alta calidad,
7 toneladas de calidad mediana y 3 de baja calidad, mientras que el
rancho N, con un gasto de 300 dlares, produce 4 toneladas de alta
calidad, 3 de mediana y 3 de baja. La empresa debe atender una
demanda de al menos 80 toneladas de alta calidad, 210 de mediana y
cv

+
t
1 i
j ij j
n , , 2 , 1 j C a 1000 C
150 de baja. Cuntos das ha de trabajar en cada rancho para que el
costo sea mnimo?
Variables de decisin:
X1: Nmero de das en el rancho M.
X2: Nmero de das en el rancho N.
Funcin objetivo: (Maximizar las ganancias)
Min. Z = 200X1 + 300X2
Restricciones:
X1 + 4X2 80
7X1 + 3X2 210
3X1 + 3X2 150
X1, X2 0
Solucin ptima por enteros.
Datos
Tabla inicial
cvi
Note que la ultima fila los valores son cero y negativos. As, hemos
encontrado la solucin ptima.
cvii
Por lo tanto, el punto que produce el costo mnimo es: X1 = 40 das
(rancho M) y X2 = 10 das (rancho N).
4.10 Solucin a la programacin lineal con
MATLAB
La caja de herramientas de optimizacin o denominado Toolbox de
MATLAB

, incluye rutinas de muchos tipos, incluyendo la optimizacin:


Minimizacin no lineal sin restricciones.
Minimizacin no lineal con restricciones, problemas de minimizar y
maximizar, y problemas de minimizacin semi-infinitos.
Programacin cuadrtica y lineal.
No lineal, mnimos cuadrados y curvas adecuadas.
Solucin de ecuaciones de sistemas no lineales.
Restricciones lineales de mnimos cuadrados.
Problemas de larga escala.
La funcin de optimizacin linprog realiza la minimizacin de la funcin
objetivo f(x). La maximizacin es alcanzada sustituyendo en las rutinas
con f(x).
Por e ejemplo, MATLAB usa el siguiente formato para programas
lineales
Min Z = f
T
x
Sujeta a: Ax = b
Aeq = beq
x I
x u
cviii
Donde: f, x, b, beq, l, y u son vectores y A y Aeq son matrices.
Descripcin
linprog soluciona problemas de programacin lineal
x = linprog(f,A,b): soluciona min f'*x tales que A*xb. Es necesario
que todas las restricciones estn de la forma: 0 para poder crear
el archivo M-file, esto se logra multiplicando cada restriccin por -1
si A*xb.
x = linprog(f,A,b,Aeq,beq): soluciona el problema descrito
inicialmente, adems satisface la igualdad de las restricciones
Aeq*x = beq. Se coloca A=[ ] y b=[ ] si no existen desigualdades.
x = linprog(f,A,b,Aeq,beq,l,u): Se definen los limites inferior y
superior sobre la variable de diseo en x, de modo que la solucin
este siempre entre el rango l x u. Se colocara Aeq = [ ] y beq =
[ ] si no existen igualdad.
Ejemplo 4.4.
La familia Lpez tiene 175 hectreas disponibles para la crianza de
cerdos y ovejas. En promedio, se requiere 0.5 ha para criar un cerdo o
una oveja. La familia le puede dedicar un total de 7 000 horas hombre
a la crianza. La crianza de un cerdo necesita una labor de 15 horas
hombre y la crianza de una oveja toma 20 horas hombre de labor. La
familia planea criar al menos 100, pero no ms de 200 ovejas. Tambin
desea que los cerdos se limiten a 250. Se espera que las ganancias por
cada cerdo sea de $ 900, y de $ 500 por cada oveja. Encontrar la
solucin.
Variables de decisin:
X1: Nmero de ovejas.
X2: Nmero de cerdos.
Funcin objetivo: (Maximizar las ganancias)
Mx. Z = 500X1 + 900X2
Restricciones:
0.5X1 + 0.5X2 175
20X1 + 15X2 7000
X1 100
cix
X1 200
X2 250
X1, X2 0
Resolviendo con la funcin de optimizacin linprog.
f = -[500;900];
A = [0.5 0.5;20 15;-1 0;1 0;0 1];
b = [175;7000;-100;200;250];
Aeq = [];
beq = [];
l = [];
u = [];
x = linprog(f,A,b,Aeq,beq,l,u)
Optimization terminated.
x =
100.0000
250.0000
Por lo tanto, el punto que produce el beneficio mximo es: X1 = 100
ovejas y X2 = 250 cerdos, disponibles para crianza.
4.11 Programacin Dual
En este apartado veremos que a cada problema de programacin lineal
se le asocia otro, llamado el Problema de Programacin Dual. La
solucin ptima de est, proporciona la siguiente informacin:
Encuentra los precios en el mercado o los beneficios de los recursos
asignados en el problema original (primal).
La solucin ptima del problema dual aporta la solucin ptima del
problema primal y viceversa.
Conceptos sobre el Primal y el Dual
Para escribir los dos problemas asociados, asumiremos que el
problema del primal es de maximizacin con restricciones del tipo .
As
Maximizar Z = c1
n X n 1
Sujeta A m n X n 1 b m 1 , con X 0.
El problema dual es entonces
cx
Minimizar Z = b 1 m Y m 1
Sujeta An m Y m 1 c n 1 , con Y 0.
Ejemplo 4.5.
Una compaa produce dos tipos de mquinas agrcolas A y B. Cada
mquina A se vende con una ganancia de 20 mil pesos y cada mquina
B deja una utilidad de 30 mil pesos. Ambas mquinas deben pasar a
travs de dos diferentes departamentos de ensamble E1 y E2.
La capacidad del departamento E1 es el doble de la capacidad del
departamento E2, cuando estn disponibles 100 horas de E2. Cada
mquina A requiere 3 horas en E1, y 1 hora en E2. Cada mquina B
requiere 2 horas en E1 y 2 horas en E2. Encontrar las soluciones
optmales a los problemas del primal y del dual.
Solucin primal con la funcin de optimizacin linprog:
f = -[20;30];
A = [3 2;1 2];
b = [200;100];
Aeq = [];
beq = [];
l = [];
u = [];
x = linprog(f,A,b,Aeq,beq,l,u)
Optimization terminated.
x =
50.0000
25.0000
El resultado del primal indica que se deben producir 50 mquinas tipo A
y 25 tipo B.
cxi
1 2
1 2
1 2
1 2
Pr imal : Max Z 20X 30X
Sujeta a 3X 2X 200
X 2X 100
X , X 0
+
+
+

1 2
1 2
1 2
1 2
Dual : Min Z 200Y 100Y
Sujeta a 3Y Y 20
2Y 2Y 30
Y, Y 0
+
+
+

Solucin dual con la funcin de optimizacin linprog:


f = [200;100];
A = [-3 -1;-2 -2];
b = [-20;-30];
Aeq = [];
beq = [];
l = [];
u = [];
x = linprog(f,A,b,Aeq,beq,l,u)
Optimization terminated.
x =
2.5000
12.5000
En el problema dual, el propsito de la compaa es minimizar el costo
de la produccin de estas mquinas con las 200 horas disponibles en el
departamento de ensamble E1, y con 100 horas de capacidad en el
departamento E2. Si el costo de producir una mquina A es mayor $ 20
mil pesos, la compaa no produce mquinas A, y sera aconsejable
utilizar los recursos disponibles para otros propsitos.
La solucin ptima al problema dual: Z = 200* 2.50 + 100* 12.50
Proporciona Z = 1750 miles de pesos, que es el costo mnimo para
mantener la capacidad disponible en horas en los dos departamentos
de ensamble.
Ejemplo 4.6.
Una empresa produce suplemento alimenticio para bovinos: Harina de
pescado y Harina de sangre, a partir de dos materias primas, M1 y M2.
La siguiente tabla proporciona los datos:
Tabla 4.1: Datos de un proceso de manufactura
Harina de
pescado (ton )
Harina de
sangre (ton )
Disponibilidad
mxima diaria
Materia
prima M1
6 4 24 ton
Materia
prima M2
1 2 6 ton
Utilidad
por ton
5 mil 4 mil
Una encuesta de mercado restringe la demanda mxima diaria de
harina de sangre a 2 ton. Adems, la demanda diaria de harina de
cxii
sangre no puede exceder a la de harina de pescado por ms de 1 ton.
La empresa quiere determinar la mezcla de producto ptima que
maximice la utilidad total diaria.
Modelo
La solucin primal por el mtodo grfico (figura 4.13) indica que x1 = 3 y
x2 = 1.5 con una utilidad de $ 21000.
Ahora, estudiamos la sensibilidad de la solucin ptima a los cambios
en la disponibilidad de los recursos. El anlisis proporciona una sola
medida, llamada valor unitario del recurso, que cuantifica el ndice del
cambio en el valor ptimo en la funcin Z, como resultado de hacer
cambios en la disponibilidad de un recurso.
El resultado del dual por el mtodo grfico (figura 4.14), indica, que si
dejamos que Y1 represente el valor por unidad de la materia prima M1,
tenemos Y1 = 0.75 (shadow price).
cxiii
1 2
1 2
1 2
1 2
2
1 2
MAX Z 5X 4X
Sujeta 6X 4X 24
X 2X 6
X X 1
X 2
X , X 0
+
+
+
+

Figura 4.13. Regin de soluciones factibles para el primal.


Figura 4.14. Regin de soluciones factibles para el dual.
El resultado muestra que a un cambio de una tonelada en M1 dentro
del rango de 20 M1 36, el valor de Z asociado con el punto ptimo
cambia a un ndice constante en 750 pesos. De ello se sigue entonces,
que a un cambio de una tonelada en M2 dentro del rango de 4 M2
20/3, el valor de Z asociado con el punto ptimo cambia a un ndice
constante en 500 pesos.
Resolviendo el dual con la funcin de optimizacin linprog
f = [24;6;1;2];
A = [-6 -1 1 0;-4 -2 -1 -1];
b = [-5;-4];
Aeq = [];
beq = [];
l = [];
u = [];
x = linprog(f,A,b,Aeq,beq,l,u);
Exiting: One or more of the residuals, duality gap, or total relative error
cxiv
has stalled:
the dual appears to be infeasible (and the primal unbounded).
(El primal residual <TolFun = 1.00e-008
Indica que el problema es infactible para el dual.
Que es infactible?
En algunas ocasiones no es posible encontrar un punto X que satisfaga
todas las restricciones, esto es, la regin factible est constituida por el
conjunto vaco y se dice que el problema es Infactible.
4.12 Programacin no lineal
La programacin lineal es una de las mayores contribuciones al campo
de la toma cientfica de decisiones. Su versatilidad y adaptabilidad ha
hecho que este modelo tenga aplicacin en casi todos los campos de la
ingeniera y de la ciencia. No obstante, ciertas clases de problemas
requieren tener en cuenta los aspectos no lineales del mismo. Esta
necesidad ha conducido a investigar tanto los aspectos tericos como
los computacionales de los problemas de programacin no lineal. A
esta clase de problemas de optimizacin pertenecen todos aquellos, en
los cuales la funcin objetivo y/o las restricciones son funciones no-
lineales de las variables de decisin.
El problema de programacin no lineal, se puede formular como sigue.
Minimizar
Z = f(x1, . . . , xn)
sujeto a
h1(x1, . . . , xn) = 0
...
hs (x1, . . . , xn) = 0
g1(x1, . . . , xn) 0
...
gm(x1, . . . , xn) 0
El modelo anterior se puede formular de una forma compacta como:
Minimizar
Z = f(x)
sujeto a
h(x) = 0
g(x) 0
Donde x = (x1,. . ., xn)
T
es el vector de las variables de decisin,
cxv
f : R
n
R es la funcin objetivo, y h : R
n
R
s
y g : R
n
R
m
, donde h(x)
= (h1(x), . . . , hs(x))
T
y g(x) = (g1(x), . . . , gm(x))
T
son, respectivamente,
las restricciones de igualdad y desigualdad. Para que este problema
sea propiamente no lineal, al menos una de las funciones involucradas
en su formulacin debe serlo. Cualquier vector x R
n
que satisface las
restricciones se denomina solucin factible, y el conjunto de todas las
soluciones factibles se denomina regin factible.
4.12.1 La funcin fmincon de MATLAB
La funcin de minimizacin del Toolbox de Optimizacin fmincon, su
propsito es encontrar el mnimo del valor escalar que devuelve una
funcin de varias variables no lineal y sujeta a una serie de
restricciones. Normalmente se conoce este tipo de problemas como
optimizacin no lineal con restricciones o programacin no lineal.
Existen distintas sintaxis para invocar a la funcin fmincon, desde la
forma ms fcil en la que la rutina slo devuelve un parmetro de
salida, hasta la forma ms compleja en la que la funcin proporciona al
usuario distintos parmetros de salida que pueden resultarle de gran
utilidad en la resolucin de su problema e incluso le pueden ser tiles
para comprobar que el funcionamiento de la funcin ha sido el
deseado. Veamos a continuacin algunas de las formas de invocar la
funcin en MATLAB, y que parmetros de salida nos puede
proporcionar.
X = fmincon (fun,X0,A,b) empieza con los valores especificados por
el vector de inicio x0, y encuentra un valor mnimo del vector x para la
funcin que ha sido descrita en fun, y tal que se cumpla la inecuacin
lineal Ax b.
X = fmincon (fun,X0,A,b,Aeq,beq) encuentra el mnimo de la funcin
fun, sujeta a la condicin de igualdad AeqX = beq, adems de la
inecuacin AX b. Cuando no existan condiciones de desigualdad, se
debe establecer las variables A=[ ], y b=[ ].
X = fmincon(fun,X0,A,b,Aeq,beq,lb,lu) encuentra el mnimo de la
funcin fun, sujeta a las condiciones AX b y AeqX = beq. Ahora se
definen unos lmites inferiores y superiores para los valores de las
variables de diseo, el vector x, as que la solucin que haya la rutina
estar comprendida en el rango lb = X = lu. Cuando no se usen las
restricciones de igualdad de la funcin fun habr que establecer Aeq =
[ ], y beq = [ ].
cxvi
Ejemplo 4.7.
Un prototipo de una sembradora es una caja de dimensiones x, y, e z
(figura 4.15), que debe verificar los siguientes requisitos para ser
colocada en un tractor. La altura ms el permetro de la base no puede
exceder 108 cm.
z + 2x + 2y 108; x, y, z 0
Pues no son posibles las longitudes negativas. Se buscan las tres
dimensiones que maximizan el volumen
V(x, y, z) = x * y * z
Figura 4.15. Prototipo de una sembradora.
Se desea encontrar los valores de x1, x2, x3 que minimizan la funcin
f(x)= -x1*x2*x3, tal que adems se cumpla que: 0 x1 + 2x2+ 2x3
108. El primer paso sera escribir una funcin .m, que realiza los
clculos de f(x) y devuelve el valor escalar f de la funcin objetivo
evaluada en x. En este ejemplo, x es un vector de tres elementos, y el
cdigo de la rutina de la funcin objetivo simplemente:
function f= myfun(x)
f = - x(1)*x(2)*x(3);
Ahora se escribiran las restricciones, y dado que tenemos dos
desigualdades lineales, se escribirn procurando obtener algo tal que
A*x = b. Si se reescribe la ecuacin 0 x1 + 2x2+ 2x3 108 como
dos inecuaciones en las que ambas se tiene el signo menor o igual,
tendramos que: - x1 - 2x2 -2x3 0 y x1 + 2x2 + 2x3 108.
cxvii
Para poder invocar finalmente la funcin fmincon, deberamos escribir
el siguiente conjunto de variables en MATLAB:
A = [-1 -2 -2; 1 2 2];
b = [0 108];
x0 = [10; 10; 10];
[x,fval,exitflag,output]=fmincon(@myfun,x0,A,b)
Evala el valor inicial x0, y encuentra un mnimo de x para la funcin
descrita en fun sujeta a las desigualdades lineales A*x = b. x0 puede
ser un escalar, un vector o una matriz.
Despus de 10 iteraciones de fmincon, se obtiene la solucin, siendo
sta x = (36 18 18) y el valor de la funcin fun evaluada en x,
fval = 1.1664e+004.
4.12.2 Programacin cuadrtica
La programacin cuadrtica constituye un caso particular de
programacin no lineal en el que las restricciones son de tipo lineal y la
funcin es de tipo cuadrtico.
El problema general de la programacin cuadrtica se establece como
sigue:
Minimizar f = (1/2) x
T
H x + c
T
x
Sujeto a A*x b
Aeq = beq
x I
x u
f se llama la funcin objetivo, H es una matriz simtrica llamada matriz
Hessiana y c es un vector de constantes. Las hij (elementos de H) son
constantes dadas tales que hij = hji (que es la razn para que aparezca
el factor en la funcin objetivo).
La funcin quadprog de MATLAB resuelve el problema anterior:
Donde: f, x, b, beq, l, y u son vectores y A y Aeq son matrices. La
mayor parte de los argumentos son conocidos del caso similar de la
cxviii
programacin lineal. La invocacin mnima y mxima de la funcin es
de la forma:
x = quadprog(H,C,A,B,Aeq,Beq,L,U,x0,opciones)
Ejemplo 4.8.
Una compaa en maquinaria agrcola planea gastar 10,000 pesos en
publicidad. Cuesta 3,000 pesos un minuto de publicidad en T.V. y 1,000
pesos un minuto de publicidad en la radio. Si la empresa compra W1
minutos de comerciales en la T.V. y W2 minutos de comerciales en la
radio, su ingreso, en miles de dlares, est dado por
2 2
1
1 2 1 2 1 2 2
f (w) W W WW 2W 6W +
Cmo puede la empresa maximizar su ingreso?
Definiendo
H=[1 -1;-1 2];
C=[-2;-6];
A=[3000 1000];
B=[10000];
[x,fval,exitflag,output,lambda] = quadprog(H,C,A,B,[ ],[ ],[ ])
Optimization terminated.
x =
2.1600
3.5200
fval =
-18.3200
exitflag =
1
output =
iterations: 2
algorithm: 'medium-scale: active-set'
As, la empresa tendra que gastar 2.16 minutos de tiempo de T.V. Y
3.52 minutos de tiempo de radio. Teniendo as, un ingreso mximo de
18,320 pesos.
cxix
Graficando la funcin
2 2
1
1 2 1 2 1 2 2
f (w) W W WW 2W 6W + en MATLAB
como una superficie de tres dimensiones podemos ver que las
coordenadas corresponden un mnimo. Para ello se utiliza el cdigo:
ezmeshc('(0.5*w1.^2)+(w2.^2)-(w1*w2)-(2*w1)-(6*w2)',[-3,3,-3,4])
Figura 4.15. Grfico de la funcin
2 2
1
1 2 1 2 1 2 2
f (w) W W WW 2W 6W +
4.3 Modelo de transporte
El modelo de transporte es una clase especial de problema de
programacin lineal. Trata la situacin en la cual se enva un bien de
los puntos de origen (por ejemplo, fbricas), a los puntos de destino
(por ejemplo, bodegas).
El objetivo es determinar las cantidades enviadas desde cada punto de
origen hasta cada punto de destino, que minimicen el costo total del
envo, al mismo tiempo que satisfagan tanto los lmites de la oferta
como los requerimientos de la demanda.
cxx
Montoya 2008, creo un programa para la resolucin del problema de
transporte por el Mtodo de la Esquina Noroeste. El archivo que deber
ejecutar para arrancar el programa es: "inicio.m" el cual puede
ejecutarlo escribiendo directamente inicio en la ventana de comandos
de MATLAB.
Ejemplo 4.9.
Una fbrica de carnes fras tiene dos plantas A y B que producen 50 y
80 piezas de jamones por mes. Se distribuyen a tres supermercados de
las ciudad: M, N y O cuya demanda es 35, 50 y 45 piezas por mes,
respectivamente. El costo del transporte por jamn en pesos se ve en
la tabla siguiente:
Tabla 2.2: Costos del transporte
M N O
A 5 6 8
B 7 4 2
Calcular cuntos jamones deben enviarse desde cada planta a cada
supermercado para hacer mnimo el gasto en transporte.
Sea
Xij = Cantidad de unidades a enviar desde la planta i al supermercado j.
Minimizar Z = 5X11 + 6X12 + 8X13 + 7X21 + 4X22 + 2X23
Sujeta a:
X11 + X12 + X13 50
X21 + X22 + X23 80
X11 + X21 + X31 35
X12 + X22 + X32 50
X13 + X23 + X33 45
Xij 0; i = 1, 2 ; j = 1, 2, 3
Proporcionando datos a plantilla del programa
cxxi
Resultado
cxxii
De acuerdo al resultado, de la planta A se envan 35 piezas de jamn al
supermercado M y 15 al supermercado N. De la planta B se envan 35
piezas de jamn al supermercado N y 45 piezas al supermercado O.
Teniendo un costo total de operacin de $ 495.
cxxiii
cxxiv

Potrebbero piacerti anche