Está en la página 1de 31

GUIA BSICA DE

PREPARADA POR:
BIBIANA LPEZ RODRGUEZ MAURICIO OSORIO LEMA

UNIVERSIDAD NACIONAL DE COLOMBIA SEDE MEDELLN FACULTAD DE CIENCIAS 2003

INTRODUCCIN En el desarrollo de Mtodos Numricos, es indispensable el uso del computador. sta es tal vez, la herramienta ms importante de la cual disponemos para realizar grandes clculos en poco tiempo. Sin embargo, el computador por s slo no puede realizar nada; necesita de un buen programa y de un buen programador para poder trabajar para nosotros. Dentro de los programas con los que se cuenta actualmente para trabajar en matemticas aplicadas e ingeniera, est MATLAB (MATrix LABoratory), que ha venido incrementando su popularidad en los ltimos aos, debido a su gran versatilidad, pues cuenta con una gran cantidad de funciones que pueden ser usadas por los trabajadores de diversas reas y, adems es por si mismo un lenguaje de programacin que permite crear nuevas y mejores aplicaciones. En muchas ocasiones no es tan rpido como otros lenguajes de programacin (por ejemplo Fortran, C++ y Java), sin embargo debido a las funciones incorporadas y a su facilidad en el trabajo con vectores y matrices, puede requerir mucho menos tiempo de programacin que los dems lenguajes. En esta gua describimos el funcionamiento bsico de MATLAB, principalmente como lenguaje de programacin dirigido al clculo numrico. Est basada en una gua ms amplia disponible va Internet en http://www.tayuda.com, que invitamos a consultar para ampliar algunas de las explicaciones que aqu damos. Esperamos que esta sencilla gua sea de utilidad tanto para programadores expertos como para principiantes, pero que sobre todo, sirva como un medio para incrementar el nmero de personas interesadas en una de las herramientas ms tiles con las que actualmente se dispone, para trabajar en ciencias aplicadas e ingeniera.

GUA BSICA DE MATLAB 1. El programa MATLAB


MATLAB es el nombre abreviado de MATrix LABoratory. MATLAB es un programa para realizar clculos numricos con vectores y matrices. Como caso particular puede tambin trabajar con nmeros escalares tanto reales como complejos, con cadenas de caracteres y con otras estructuras de informacin ms complejas. Una de las capacidades ms atractivas es la de realizar una amplia variedad de grficos en dos y tres dimensiones. MATLAB tiene tambin un lenguaje de programacin propio. MATLAB es un gran programa de clculo tcnico y cientfico. Para ciertas operaciones es muy rpido, cuando puede ejecutar sus funciones en cdigo nativo con los tamaos ms adecuados para aprovechar sus capacidades de vectorizacin. En otras aplicaciones resulta bastante ms lento que el cdigo equivalente desarrollado en C/C++ o Fortran. Sin embargo, siempre es una magnfica herramienta de alto nivel para desarrollar aplicaciones tcnicas, fcil de utilizar y aumenta significativamente la productividad de los programadores respecto a otros entornos de desarrollo. MATLAB dispone de un cdigo bsico y de varias libreras especializadas (toolboxes). En estos apuntes se har referencia exclusiva al cdigo bsico. MATLAB se puede arrancar como cualquier otra aplicacin de Windows, haciendo clic dos veces en el icono correspondiente en el escritorio o por medio del men Inicio. Al arrancar MATLAB se abre una ventana del tipo de la indicada en la Figura 1. sta es la vista que se obtiene eligiendo la opcin Desktop Layout/Default, en el men View. 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 View/Desktop Layout/Default. Esta ventana inicial requiere unas primeras explicaciones.

Figura 1

La parte ms importante de la ventana inicial es la Command Window, que aparece en la parte derecha. En esta sub-ventana es donde se ejecutan los comandos de MATLAB, a continuacin del prompt (aviso) caracterstico (>>), que indica que el programa est preparado para recibir instrucciones. En la pantalla mostrada en la Figura 1 se ha ejecutado el comando A=magic(4), mostrndose a continuacin el resultado proporcionado por MATLAB. En la parte superior izquierda de la pantalla aparecen dos ventanas tambin muy tiles: en la parte superior aparece la ventana Launch Pad, que se puede alternar con Workspace haciendo clic en la pestaa correspondiente. Launch Pad da acceso a todos los mdulos o componentes de MATLAB que se tengan instalados, como por ejemplo al Help o a las Demos. El Workspace contiene informacin sobre todas las variables que se hayan definido en esta sesin. En la parte inferior derecha aparecen otras dos ventanas, Command History y Current Directory, que se pueden mostrar alternativamente por medio de las pestaas correspondientes. La ventana Command History muestra los ltimos comandos ejecutados en la Command Window. Estos comandos se pueden volver a ejecutar haciendo doble clic sobre ellos. Haciendo clic sobre un comando con el botn derecho del ratn se muestra un men contextual con las posibilidades disponibles en ese momento. Para editar uno de estos comandos hay que copiarlo antes a la Command Window. Por otra parte, la ventana Current Directory muestra los ficheros del directorio activo o actual. A diferencia de versiones anteriores de MATLAB en que el directorio activo se deba cambiar desde la Command Window, a partir de la versin 6.0 se puede cambiar desde la propia ventana (o desde la barra de herramientas, debajo de la barra de mens) con los mtodos de navegacin de directorios propios de Windows. Haciendo clic dos veces sobre uno de los ficheros *.m del directorio activo se abre el editor de ficheros de

MATLAB, herramienta fundamental para la programacin sobre la que se volver en las prximas pginas.

2. Uso del Help


MATLAB dispone de un excelente Help con el que se puede encontrar la informacin que se desee: 1. Full Product Family Help, Se abre una ventana en la que se puede buscar informacin general sobre MATLAB o sobre otros productos de la familia a los que se tenga acceso. La forma de la ventana de ayuda es tpica y comn con otros niveles de ayuda. La mayor parte de las pginas de ayuda estn en formato HTML. 2. Matlab Help. Se abre la ventana en la que se puede buscar ayuda general sobre MATLAB o sobre la funcin o el concepto que se desee. La portada de esta ayuda tiene tres captulos principales: Learning Matlab, que contiene distintos apartados de introduccin al programa; Finding Functions and Properties, que permite acceder a informacin concreta sobre las distintas funciones o propiedades de los objetos grficos; y Printing the Documentation, que da acceso a versiones completas e imprimibles de los manuales del programa en formato PDF (Portable Document Format), que precisa del programa Adobe Acrobat Reader 4.0 o superior. En la parte izquierda de la ventana, cuando est seleccionada la pestaa Contents, aparece un ndice temtico estructurado en forma de rbol que puede ser desplegado y recorrido con gran facilidad. Las restantes pestaas de esta ventana dan acceso a un ndice por palabras (Index), a un formulario de bsqueda (Search) y a una seccin en la que el usuario puede almacenar enlaces a las pginas que ms vaya a utilizar (Favorites). 3. Using the Desktop. Se abre una ventana de ayuda con un formato similar a las de las Figuras anteriores con informacin detallada sobre cmo utilizar y configurar el entorno de desarrollo. 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. 4. Using the Command Window. Esta opcin del men Help da acceso a la informacin necesaria para aprovechar las capacidades de la Command Window, que es el corazn de MATLAB. 5. Demos. Se abre una ventana que da acceso a un buen nmero de ejemplos resueltos con MATLAB, cuyos resultados se presentan grficamente de diversas formas. Es bastante interesante recorrer estos ejemplos para hacerse idea de las posibilidades del programa. Es asimismo muy instructivo analizar los ficheros *.m de los ejemplos que renen caractersticas similares a las de la aplicacin de se desea desarrollar.

3. El entorno de trabajo de MATLAB


El entorno de trabajo de MATLAB, ha mejorado mucho desde la versin 6.0, hacindose ms grfico e intuitivo, similar al de otras aplicaciones de windows. Ya se

explicaron algunas de las componentes al principio de este manual, ahora nos centraremos en las dos componentes ms importantes:

3.1 La ventana de comandos (Command Window)


sta es la ventana en la que se 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 versiones anteriores de la 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 clic con el botn derecho sobre el nombre de una funcin que aparezca en esta ventana se tiene acceso a la pgina del Help sobre dicha funcin. Si el cdigo fuente (fichero *.m) est disponible, tambin se puede acceder al fichero correspondiente por medio del Editor/Debugger. 3. Comenzando a teclear el nombre de una funcin y pulsando la tecla 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 fichero *.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 fichero fuente en la que se ha producido el error. Haciendo clic en ese enlace se va a la lnea correspondiente del fichero por medio del Editor/Debugger.

3.2 El Editor/Debugger
Es la ventana en la que se crean los programas de MATLAB. Se obtiene al hacer clic en File New - M file. En MATLAB tienen particular importancia los ya citados ficherosM (o M-files). Son ficheros de texto ASCII, con la extensin *.m, que contienen conjuntos de comandos o definicin de funciones. La importancia de estos ficheros-M es que al teclear su nombre en la lnea de comandos y pulsar Intro, se ejecutan uno tras otro todos los comandos contenidos en dicho fichero. El poder guardar instrucciones y grandes matrices en un fichero permite ahorrar mucho trabajo de tecleado.

figura 2

Aunque los ficheros *.m se pueden crear con cualquier editor de ficheros ASCII tal como Notepad, MATLAB dispone de un editor que permite tanto crear y modificar estos ficheros, como ejecutarlos paso a paso para ver si contienen errores (proceso de Debug o depuracin). La Figura muestra la ventana principal del Editor/Debugger, en la que se ha tecleado un fichero-M 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 (en verde los comentarios, en rojo las cadenas de caracteres, etc.). El Editor se preocupa tambin de que las comillas o parntesis que se abren, no se queden sin el correspondiente elemento de cierre. Colocando el cursor antes o despus de una apertura o cierre de corchete o parntesis y pulsando las teclas () o (), el Editor muestra con qu cierre o apertura de corchete o parntesis se empareja el elemento considerado; si no se empareja con ninguno, aparece con una rayita de tachado. Seleccionando varias lneas y haciendo clic con el botn derecho aparece un men contextual que permite entre otras cosas comentar con el carcter % todas las lneas seleccionadas. La ejecucin se comienza eligiendo el comando Run en el men Debug, pulsando la tecla F5, haciendo clic en el botn Continue ( ) de la barra de herramientas del Editor o tecleando el nombre del fichero 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 indica la sentencia en que est detenida la ejecucin (antes de ejecutar dicha sentencia); cuando el cursor se coloca sobre una variable (en este caso sobre la matriz A) aparece una pequea ventana con los valores numricos de esa variable. Puede apreciarse los botones que corresponden al Debugger. El significado de estos botones, que aparece al colocar el cursor sobre cada uno de ellos, es el siguiente:
Set/Clear Breakpoint. Coloca o borra un breakpoint en la lnea en que est el cursor. Clear All Breakpoints. Elimina todos los breakpoints que haya en el fichero. Step. Avanzar un paso sin entrar en las funciones de usuario que se llamen en esa lnea. Step In. Avanzar un paso, y si en ese paso hay una llamada a una funcin cuyo fichero *.m est accesible, entra en dicha funcin. Step Out. Salir de la funcin que se est ejecutando en ese momento. Continue. Continuar la ejecucin hasta el siguiente breakpoint. Quit Debugging. Terminar la ejecucin del Debugger.

El Debugger es un programa que hay que conocer muy bien, pues es muy til para detectar y corregir errores. Es tambin enormemente til para aprender mtodos numricos y tcnicas de programacin. Para aprender a manejar el Debugger lo mejor es practicar. Cuando se est ejecutando un programa con el Debugger, en cualquier puede ir a la lnea de comandos de MATLAB y teclear una expresin resultado. Tambin se puede seleccionar con el ratn una sub-expresin lnea vista en el Editor/Debugger, hacer clic con el botn derecho y momento se para ver su en cualquier en el men

contextual que se abre elegir Evaluate Selection. El resultado de evaluar esa subexpresin aparece en la lnea de comandos de MATLAB.

4. programacin en MATLAB:
Como se mencion en el numeral anterior, los programas de MATLAB se crean en la ventana Editor/Debugger, la cual se puede obtener al hacer clic en File New - M file. Como ya se ha dicho varias veces, MATLAB es una aplicacin que se puede programar muy fcilmente. De todas formas, como lenguaje de programacin pronto ver que no tiene tantas posibilidades como otros lenguajes (ni tan complicadas...). Se comenzar viendo las bifurcaciones y bucles, y la lectura y escritura interactiva de variables, que son los elementos bsicos de cualquier programa de una cierta complejidad.

4.1 SENTENCIAS Y BUCLES:


4.1.1 SENTENCIA IF En su forma ms simple, la sentencia if se escribe en la forma siguiente (obsrvese que a diferencia de C/C++/Java la condicin no va entre parntesis, aunque se pueden poner si se desea):
if condicion sentencias end

Existe tambin la bifurcacin mltiple, en la que pueden concatenarse tantas condiciones como se desee, y que tiene la forma:
if condicion1 bloque1 elseif condicion2 bloque2 elseif condicion3 bloque3 else % opcin por defecto bloque4 end

para cuando no se cumplan las c condiciones 1,2,3

donde la opcin por defecto else puede ser omitida: si no est presente no se hace nada en caso de que no se cumpla ninguna de las condiciones que se han chequeado. Una observacin muy importante: la condicin del if puede ser una condicin matricial, del tipo A==B, donde A y B son matrices del mismo tamao. Para que se considere que la condicin se cumple, es necesario que sean iguales dos a dos todos los elementos de las matrices A y B (aij=bij, 1im, 1jn). Basta que haya dos elementos aij y bij diferentes para que las matrices ya no sean iguales, y por tanto las sentencias del if no se ejecuten. Anlogamente, una condicin en la forma A~=B exige que todos los elementos sean diferentes dos a dos (aijbij, 1im, 1jn). Bastara que hubiera dos elementos aij y bij iguales para que la condicin no se cumpliese. En resumen: if A==B exige que todos los elementos sean iguales dos a dos if A~=B exige que todos los elementos sean diferentes dos a dos

Como se ha dicho, MATLAB dispone de funciones especiales para ayudar en el chequeo de condiciones matriciales. Por ejemplo, la funcin isequal(A, B) devuelve un uno si las dos matrices son idnticas y un cero en caso de que difieran en algo. 4.1.2 SENTENCIA FOR La sentencia for repite un conjunto de sentencias un nmero predeterminado de veces. La sentencia for de MATLAB es muy diferente y no tiene la generalidad de la sentencia for de C/C++/Java. La siguiente construccin ejecuta sentencias con valores de i de 1 a n, variando de uno en uno.
for i=1:n sentencias end

o bien,
for i=vectorValores sentencias end

donde vectorValores es un vector con los distintos valores que tomar la variable i. En el siguiente ejemplo se presenta el caso ms general para la variable del bucle (valor_inicial: incremento: valor_final); el bucle se ejecuta por primera vez con i=n, y luego i se va reduciendo de 0.2 en 0.2 hasta que llega a ser menor que 1, en cuyo caso el bucle se termina:
for i=n:-0.2:1 sentencias end

En el siguiente ejemplo se presenta una estructura correspondiente a dos bucles anidados. La variable j es la que vara ms rpidamente (por cada valor de i, j toma todos sus posibles valores):
for i=1:m for j=1:n sentencias end end

Una ltima forma de inters del bucle for es la siguiente (A es una matriz):
for i=A sentencias end

en la que la variable i es un vector que va tomando en cada iteracin el valor de una de las columnas de A. Cuando se introducen interactivamente en la lnea de comandos, los bucles for se ejecutan slo despus de introducir la sentencia end que los completa. 4.1.3 SENTENCIA WHILE

La estructura del bucle while es muy similar a la de C/C++/Java. Su sintaxis es la siguiente:


while condicion sentencias end

donde condicion puede ser una expresin vectorial o matricial. Las sentencias se siguen ejecutando mientras haya elementos distintos de cero en condicion, es decir, mientras haya algn o algunos elementos true. El bucle se termina cuando todos los elementos de condicion son false (es decir, cero). 4.1.4 SENTENCIA BREAK Al igual que en C/C++/Java, la sentencia break hace que se termine la ejecucin del bucle ms interno de los que comprenden a dicha sentencia. 4.1.5 OTRAS SENTENCIAS:

En MATLAB, existen otras sentencias como switch, continue, try que no son muy utilizadas y, por lo tanto, omitimos su explicacin.

4.2 LECTURA Y ESCRITURA INTERACTIVA DE VARIABLES


Existen varias formas de ingresar datos e imprimir resultados, en los programas de MATLAB, algunas de estas son: 4.2.1. FUNCIN INPUT La funcin input permite imprimir un mensaje en la lnea de comandos de MATLAB y recuperar como valor de retorno un valor numrico o el resultado de una expresin tecleada por el usuario. Despus de imprimir el mensaje, el programa espera que el usuario teclee el valor numrico o la expresin. Cualquier expresin vlida de MATLAB es aceptada por este comando. El usuario puede teclear simplemente un vector o una matriz. En cualquier caso, la expresin introducida es evaluada con los valores actuales de las variables de MATLAB y el resultado se devuelve como valor de retorno. Vase un ejemplo de uso de esta funcin:
>> n = input('Teclee el nmero de ecuaciones')

Otra posible forma de esta funcin es la siguiente (obsrvese el parmetro 's'):


>> nombre = input('Cmo te llamas?','s')

En este caso el texto tecleado como respuesta se lee y se devuelve sin evaluar, con lo que se almacena en la cadena nombre. As pues, en este caso, si se teclea una frmula, se almacena como texto sin evaluarse.

4.2.2. FUNCIN DISP La funcin disp permite imprimir en pantalla un mensaje de texto o el valor de una matriz, pero sin imprimir su nombre. En realidad, disp siempre imprime vectores y/o matrices: las cadenas de caracteres son un caso particular de vectores. Considrense los siguientes ejemplos de cmo se utiliza:
>> disp('El programa ha terminado') >> A=rand(4,4) >> disp(A)

Ejectense las sentencias anteriores en MATLAB y obsrvese la diferencia entre las dos formas de imprimir la matriz A.

4.2.3 FUNCIN fprintf


Finalmente, la funcin fprintf dirige su salida formateada hacia el fichero indicado por el identificador. Su forma general es:
fprintf(fi,'cadena de control',var1,var2,...)

Esta es la funcin ms parecida a su homloga de C. La cadena de control contiene los formatos de escritura, que son similares a los de C, como muestran los ejemplos siguientes:
fprintf(fi,'El nmero de ecuaciones es: %d\n',n) fprintf(fi,'El determinante es: %lf10.4\n',n)

De forma anloga, la funcin sprintf convierte su resultado en una cadena de caracteres que devuelve como valor de retorno, en vez de enviarlo a un fichero. Vase un ejemplo:
resultado = sprintf('El cuadrado de %f es %12.4f\n',n,n*n)

donde resultado es una cadena de caracteres. Esta funcin constituye el mtodo ms general de convertir nmeros en cadenas de caracteres, por ejemplo para ponerlos como ttulos de figuras. Al igual que su equivalente en C, existen varios smbolos que dentro de la instruccin, pueden establecer una accin o un formato especial en los resultados que se imprimen. Algunos de los caracteres de accin son: \n Nueva lnea \t tabulacin horizontal \b backspace \r retorno Mientras que los caracteres de formato son: %e Notacin exponencial %f Notacin de punto flotante (%12.4f = A 12 espacios y con 4 cifras decimales) %g Bien sea %e o %f, segn sea el ms corto. %lf Notacin de doble precisin.

10

4.3 LOS FICHEROS *.m


Los ficheros con extensin (.m) son ficheros de texto sin formato (ficheros ASCII) que constituyen el centro de la programacin en MATLAB. Estos ficheros se crean y modifican con un editor de textos cualquiera. En el caso de MATLAB 6.* ejecutado en un PC bajo Windows, lo mejor es utilizar su propio editor de textos, que es tambin Debugger. Existen dos tipos de ficheros *.m, los ficheros de comandos (llamados scripts en ingls) y las funciones. Los primeros contienen simplemente un conjunto de comandos que se ejecutan sucesivamente cuando se teclea el nombre del fichero en la lnea de comandos de MATLAB o se incluye dicho nombre en otro fichero *.m. Un fichero de comandos puede llamar a otros ficheros de comandos. Si un fichero de comandos se llama desde de la lnea de comandos de MATLAB, las variables que crea pertenecen al espacio de trabajo base de MATLAB, y permanecen en l cuando se termina la ejecucin de dicho fichero. Las funciones permiten definir funciones enteramente anlogas a las de MATLAB, con su nombre, sus argumentos y sus valores de retorno. Los ficheros *.m que definen funciones permiten extender las posibilidades de MATLAB; de hecho existen bibliotecas de ficheros *.m que se venden (toolkits) o se distribuyen gratuitamente (a travs de Internet). Las funciones definidas en ficheros *.m se caracterizan porque la primera lnea (que no sea un comentario) comienza por la palabra function, seguida por los valores de retorno (entre corchetes [ ] y separados por comas, si hay ms de uno), el signo igual (=) y el nombre de la funcin, seguido de los argumentos (entre parntesis y separados por comas). Recurdese que un fichero *.m puede llamar a otros ficheros *.m, e incluso puede llamarse a s mismo de forma recursiva. Los ficheros de comandos se pueden llamar tambin desde funciones, en cuyo caso las variables que se crean pertenecen a espacio de trabajo de la funcin. El espacio de trabajo de una funcin es independiente del espacio de trabajo base y del espacio de trabajo de las dems funciones. Esto implica por ejemplo que no puede haber colisiones entre nombres de variables: aunque varias funciones tengan una variable llamada A, en realidad se trata de variables completamente distintas (a no ser que A haya sido declarada como variable global). A continuacin se ver con un poco ms de detalle ambos tipos de ficheros *.m. 4.3.1 Ficheros de comandos (scripts)

Como ya se ha dicho, los ficheros de comandos o scripts son ficheros con un nombre tal como file1.m que contienen una sucesin de comandos anloga a la que se tecleara en el uso interactivo del programa. Dichos comandos se ejecutan sucesivamente cuando se teclea el nombre del fichero que los contiene (sin la extensin), es decir cuando se teclea file1 con el ejemplo considerado. Cuando se ejecuta desde la lnea de comandos, las variables creadas por file1 pertenecen al espacio de trabajo base de MATLAB. Por el contrario, si se ejecuta desde una funcin, las variables que crea pertenecen al espacio de trabajo de la funcin.

11

En los ficheros de comandos conviene poner los puntos y coma (;) al final de cada sentencia, para evitar una salida de resultados demasiado cuantiosa. Un fichero *.m puede llamar a otros ficheros *.m, e incluso se puede llamar a s mismo de modo recursivo. Las variables definidas por los ficheros de comandos son variables del espacio de trabajo desde el que se ejecuta el fichero, esto es variables con el mismo carcter que las que se crean interactivamente en MATLAB si el fichero se ha ejecutado desde la lnea de comandos. Al terminar la ejecucin del script, dichas variables permanecen en memoria.

4.3.2 Definicin de funciones:


La primera lnea de un fichero llamado name.m que define una funcin tiene la forma:
function [lista de valores de retorno] = name(lista de argumentos)

Donde name es el nombre de la funcin. Entre corchetes y separados por comas van los valores de retorno (siempre que haya ms de uno), y entre parntesis tambin separados por comas los argumentos. Puede haber funciones sin valor de retorno y tambin sin argumentos. Recurdese que los argumentos son los datos de la funcin y los valores de retorno sus resultados. Si no hay valores de retorno se omiten los corchetes y el signo igual (=); si slo hay un valor de retorno no hace falta poner corchetes. Tampoco hace falta poner parntesis si no hay argumentos. Una diferencia importante con C/C++/Java es que en MATLAB una funcin no modifica nunca los argumentos que recibe. Los resultados de una funcin de MATLAB se obtienen siempre a travs de los valores de retorno, que pueden ser mltiples y matriciales. Tanto el nmero de argumentos como el de valores de retorno no tienen que ser fijos, dependiendo de cmo el usuario llama a la funcin. Las variables definidas dentro de una funcin son variables locales, en el sentido de que son inaccesibles desde otras partes del programa y en el de que no interfieren con variables del mismo nombre definidas en otras funciones o partes del programa. Se puede decir que pertenecen al propio espacio de trabajo de la funcin y no son vistas desde otros espacios de trabajo. Para que la funcin tenga acceso a variables que no han sido pasadas como argumentos es necesario declarar dichas variables como variables globales, tanto en el programa principal como en las distintas funciones que deben acceder a su valor. Es frecuente utilizar el convenio de usar para las variables globales nombres largos (ms de 5 letras) y con maysculas. Por razones de eficiencia, los argumentos que recibe una funcin de MATLAB no se copian a variables locales si no son modificados por dicha funcin (en trminos de C/C++ se dira que se pasan por referencia). Esto tiene importantes consecuencias en trminos de eficiencia y ahorro de tiempo de clculo. Sin embargo, si dentro de la funcin se realizan modificaciones sobre los argumentos recibidos, antes se sacan copias de dichos argumentos a variables locales y se modifican las copias (dirase que en este caso los argumentos se pasan por valor). Dentro de la funcin, los valores de retorno deben ser calculados en algn momento (no hay sentencia return, como en C/C++/Java). De todas formas, no hace falta calcular

12

siempre todos los posibles valores de retorno de la funcin, sino slo los que el usuario espera obtener en la sentencia de llamada a la funcin. En cualquier funcin existen dos variables definidas de modo automtico, llamadas nargin y nargout, que representan respectivamente el nmero de argumentos y el nmero de valores de retorno con los que la funcin ha sido llamada. Dentro de la funcin, estas variables pueden ser utilizadas como el programador desee. La ejecucin de una funcin termina cuando se llega a su ltima sentencia ejecutable. Si se quiere forzar el que una funcin termine de ejecutarse se puede utilizar la sentencia return, que devuelve inmediatamente el control al entorno de llamada. Tambin las funciones creadas por el usuario pueden tener su help, anlogo al que tienen las propias funciones de MATLAB. Esto se consigue de la siguiente forma: las primeras lneas de comentarios de cada fichero de funcin son muy importantes, pues permiten construir un help sobre esa funcin. En otras palabras, cuando se teclea en la ventana de comandos de MATLAB:
>> help mi_func

el programa responde escribiendo las primeras lneas del fichero mi_func.m que comienzan por el carcter (%), es decir, que son comentarios. De estas lneas, tiene una importancia particular la primera lnea de comentarios (llamada en ocasiones lnea H1). En ella hay que intentar poner la informacin ms relevante sobre esa funcin. La razn es que existe una funcin, llamada lookfor que busca una determinada palabra en cada primera lnea de comentario de todas las funciones *.m.

4.4

Ejemplo:

Para ilustrar los procedimientos de programacin, consideremos el siguiente ejemplo de un programa que calcula la raz (o cero) de una funcin f(x), por el mtodo de biseccin, cuyo algoritmo general es:

Lea f, a, b, M, e u f(a) v f(b) c (a+b)/2 si signo(u) = signo(v) pare, si no xnew c iter iter +1 mientras xnew-xold< e w f(c) si signo(w) signo(u) entonces bc vw else 13

ac uw xold xnew iter iter +1 si iter M imprima se ha excedido el nmero mximo de iteraciones termine termine
4.4.1 En forma de scripts:

f=input('ingrese la funcion, entre apostrofos: '); x=input('ingrese el intervalo en que se encuentra la raiz, en la forma [a b]: '); toler=input('ingrese la tolerancia deseada: '); mx = input(ingrese el nmero mximo de iteraciones permitido: ); f=inline(f); a=x(1); b=x(2); if sign(feval(f,a)*feval(f,b))~= -1 fprintf('no se cumplen las condiciones del terorema del valor intermedio \n') fprintf('y no se puede usar el metodo de biseccion \n') else xnew=(a+b)/2; xold=b; iter = 1; while abs(xnew - xold)>toler fa=feval(f,a); fb=feval(f,b); fx=feval(f,xnew); if sign(fx)==sign(fb) b=xnew; else a=xnew; end xold=xnew; xnew=(a+b)/2; iter = iter + 1; if iter >=mx fprintf(se ha excedido el nmero mximo de iteraciones) return end end fprintf('la raiz buscada es x = %2.10f ', xnew) fprintf('\nel valor de f, en la raiz encontrada es f(x)= %2.10f', feval(f,xnew)) 14

end
En este caso, debemos usar instrucciones input, para pedirle al usuario que ingrese los datos necesarios: La funcin (f) a la que se le desea encontrar la raz, y el intervalo [a b] donde se sabe que debe estar la raz. Si guardamos este programa con el nombre biseccion.m, se puede ejecutar desde la ventana de comandos, simplemente digitando:

>> biseccion
despus de oprimir <enter> se empezar a ejecutar la primera lnea del programa:

>> ingrese la funcion, entre apostrofos:


y el programa esperar a que el usuario ingrese la funcin (en la forma indicada) antes de seguir ejecutando la siguiente lnea del cdigo. Si se hace una revisin del cdigo anterior, podremos ver que la estructura es muy similar a la de otros programas como Visual Basic, sin embargo tiene unas caractersticas propias que le dan su inmensa utilidad, entre stas est la instruccin inline que permite establecer que una cadena de caracteres ingresada por el usuario (en nuestro ejemplo: f) define una funcin. Adems podemos ver la instruccin feval que permite evaluar una funcin definida, en un punto en particular1. 4.4.2 En forma de funcin:

Si queremos que el programa funcione como una funcin, podemos modificar las cuatro primeras lneas del programa anterior, por una sola lnea:

function [y, fy] = biseccin(f, a, b, toler, mx)


que indica que la funcin se llama biseccin, tiene cinco datos de entrada (f, a, b, toler, mx) y dos resultados (y, fy). As que tambin podran eliminarse del cdigo anterior las lneas que corresponden a la impresin de los resultados. Esta funcin se puede usar a travs de la ventana command window, por ejemplo digitando:

>> [raiz, fraiz] = biseccin(sin(x), -pi/4, pi, 0.00001, 30)


Obtenindose como resultado:

>> raiz = 0.0000 fraiz =


Tambin se podra simplemente escribir f(x) (en lugar de feval(f,x)), para evaluar una funcin llamada f , en un punto x, sin embargo esta notacin podra confundirse con la de componente, empleada para vectores.
1

15

0.0000
Obsrvese que no es necesario nombrar las variables de salida con el mismo nombre asignado en el cdigo. 4.4.3 Otra modificacin:

En versiones anteriores de MATLAB, la instruccin inline, no se encontraba y era difcil definir una cadena de caracteres ingresada por el usuario, como una funcin. En este caso era necesario que la funcin f se definiera (como una funcin) en un archivo f.m aparte, grabado en la misma carpeta del programa principal biseccion.m. Esto tiene el inconveniente que cada vez que el usuario quiera cambiar de funcin, debe abrir el archivo f.m, cambiar la funcin que all se encuentra, por la que el desea, y grabar, antes de ejecutar el programa principal. Sin embargo, esto es muy til cuando se desea trabajar con la misma funcin y slo modificar los dems datos de entrada.

5. Recomendaciones Generales de Programacin:


Las funciones vectoriales de MATLAB son mucho ms rpidas que sus contrapartidas escalares. En la medida de lo posible es muy interesante vectorizar los algoritmos de clculo, es decir, realizarlos con vectores y matrices, y no con variables escalares dentro de bucles. Aunque los vectores y matrices pueden ir creciendo a medida que se necesita, es mucho ms rpido reservarles toda la memoria necesaria al comienzo del programa. Se puede utilizar para ello la funcin zeros. Adems de este modo la memoria reservada es contigua. Es importante utilizar el profile para conocer en qu sentencias de cada funcin se gasta la mayor parte del tiempo de clculo. De esta forma se descubren cuellos de botella y se pueden desarrollar aplicaciones mucho ms eficientes. Conviene desarrollar los programas incrementalmente, comprobando cada funcin o componente que se aade. De esta forma siempre se construye sobre algo que ya ha sido comprobado y que funciona: si aparece algn error, lo ms probable es que se deba a lo ltimo que se ha aadido, y de esta manera la bsqueda de errores est acotada y es mucho ms sencilla. Recurdese que de ordinario el tiempo de correccin de errores en un programa puede ser 4 5 veces superior al tiempo de programacin. El debugger es una herramienta muy til a la hora de acortar ese tiempo de puesta a punto. En este mismo sentido, puede decirse que pensar bien las cosas al programar (sobre una hoja de papel en blanco, mejor que sobre la pantalla del PC) siempre es rentable, porque se disminuye ms que proporcionalmente el tiempo de depuracin y eliminacin de errores. Otro objetivo de la programacin debe ser mantener el cdigo lo ms sencillo y ordenado posible. Al pensar en cmo hacer un programa o en cmo realizar determinada tarea es

16

conveniente pensar siempre primero en la solucin ms sencilla, y luego plantearse otras cuestiones como la eficiencia. Finalmente, el cdigo debe ser escrito de una manera clara y ordenada, introduciendo comentarios, utilizando lneas en blanco para separar las distintas partes del programa, sangrando las lneas para ver claramente el rango de las bifurcaciones y bucles, utilizando nombres de variables que recuerden al significado de la magnitud fsica correspondientes, etc. En cualquier caso, la mejor forma (y la nica) de aprender a programar es programando.

6. Operaciones con matrices y vectores


Para definir una matriz no hace falta 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 (o se utilizan). Las matrices se definen por filas; los elementos de una misma fila estn separados por blancos o comas, mientras que las filas estn separadas por pulsaciones intro o por caracteres punto y coma (;). Por ejemplo, el siguiente comando define una matriz A de dimensin (3x3):
A=[1 2 3; 4 5 6; 7 8 9]

La respuesta del programa 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 apstrofo (') es el smbolo de trasposicin 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

Como el resultado de la operacin no ha sido asignado a ninguna otra matriz, MATLAB utiliza un nombre de variable por defecto (ans, de answer), que contiene el resultado de la ltima operacin. La variable ans puede ser utilizada como operando en la siguiente expresin que se introduzca. Tambin podra haberse asignado el resultado a otra matriz llamada B:
B=A'

17

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 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) x(i)). Los elementos de las matrices se acceden poniendo los dos ndices entre parntesis, separados por una coma (por ejemplo A(1,2) A(i,j)). Las matrices se almacenan por columnas (aunque se introduzcan por filas, como se ha dicho antes), y teniendo en cuenta esto puede accederse a cualquier elemento de una matriz con un slo subndice. Por ejemplo, si A es una matriz (3x3) se obtiene el mismo valor escribiendo A(1,2) que escribiendo A(4). Invertir una matriz es casi tan fcil como trasponerla. 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 = 1 4 -3 2 1 5 -2 5 3

Ahora se va a calcular la inversa de A y el resultado se asignar a B. Para ello basta hacer uso de la funcin inv( )
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 pre-multiplicar A por B;


B*A ans = 1.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0 0.0000 1.0000

De forma anloga a las matrices, es posible definir un vector fila x en la forma siguiente (si los tres nmeros estn separados por blancos o comas, el resultado ser un vector fila):
x=[10 20 30] % vector fila x = 10 20 30

18

MATLAB considera comentarios todo lo que va desde el carcter tanto por ciento (%) hasta el final de la lnea. Por el contrario, si los nmeros estn separados por intros o puntos y coma (;) se obtendr un vector columna:
y=[11; 12; 13] % vector columna y = 11 12 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 transpuesto de y:


x+y' ans = 21 32 43

MATLAB puede operar con matrices por medio de operadores y por medio de funciones. Se han visto ya los operadores suma (+), producto (*) y transpuesta ('), as como la funcin invertir inv( ). Los operadores matriciales de MATLAB son los siguientes: + adicin o suma sustraccin o resta * 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. 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 operando 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 3 4 A*2 ans = 2 4

19

6 8 A-4 ans = -3 -2 -1 0

Existen en MATLAB varias funciones orientadas a definir con gran facilidad matrices de tipos particulares. Algunas de estas funciones son las siguientes: eye(4) forma la matriz unidad de tamao (4x4) zeros(3,5) forma una matriz de ceros de tamao (3x5) zeros(4) dem de tamao (4x4) ones(3) forma una matriz de unos de tamao (3x3) ones(2,4) idem de tamao (2x4) linspace(x1,x2,n) genera un vector con n valores igualmente espaciados entre x1 y x2 rand(3) forma una matriz de nmeros aleatorios entre 0 y 1, con distribucin uniforme, de tamao (3x3) magic(4) crea una matriz (4x4) con los nmeros 1, 2, ... 4*4, con la propiedad de que todas las filas y columnas suman lo mismo. 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 ms 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 nmero 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(x) 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 triu(A) forma una matriz triangular superior a partir de una matriz A (no tiene por qu ser cuadrada) tril(A) dem con una matriz triangular inferior Un caso especialmente interesante es el de crear una nueva matriz componiendo como submatrices otras matrices definidas previamente. A modo de ejemplo, ejectense las siguientes lneas de comandos y obsrvense los resultados obtenidos:
A=rand(3) B=diag(diag(A)) C=[A, eye(3); zeros(3), B]

20

En el ejemplo anterior, la matriz C de tamao (6x6) se forma por composicin de cuatro matrices de tamao (3x3). 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 s con intros o puntos y comas. Los tamaos de las submatrices deben de ser coherentes. 6.1 OPERADOR DOS PUNTOS (:) Este operador es muy importante en MATLAB y puede usarse de varias formas. Se sugiere al lector que practique mucho sobre los ejemplos contenidos en este apartado, introduciendo todas las modificaciones que se le ocurran y haciendo pruebas abundantes (Probar es la mejor forma de aprender!). Para empezar, defnase 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 podra 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 va entre el valor inferior y el superior, en las formas que se muestran 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 trasponer el resultado. El siguiente ejemplo genera una tabla de funciones seno y coseno. Ejectese y obsrvese el resultado (recurdese que con (;) despus de un comando el resultado no aparece en pantalla).
x=[0.0:pi/50:2*pi]'; y=sin(x); z=cos(x); [x y z]

El operador dos puntos (:) es an ms til y potente y tambin ms complicado con matrices. A continuacin se va a definir una matriz A de tamao 6x6 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

21

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

El siguiente comando extrae los 4 primeros elementos de la 6 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 3 fila:
A(3, :) ans = 31 9 2 22 27 20

Para acceder a la ltima fila o columna puede utilizarse la palabra end, en lugar del nmero correspondiente. Por ejemplo, para extraer la sexta fila (la ltima) de la matriz:
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:
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 del espacio ocupado por el resultado en la hoja de papel. Es evidente que todo lo que se dice para filas vale para columnas y viceversa: basta cambiar el orden de los ndices. El operador dos puntos (:) puede utilizarse en ambos lados del operador (=). Por ejemplo, a continuacin se va a definir una matriz identidad B de tamao 6x6 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

22

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,:)

Como nuevo ejemplo, se va a ver la forma de invertir el orden de los elementos de un vector:
x=rand(1,5) x = 0.9103 0.7622 0.2625 0.0475 0.7361 x=x(5:-1:1) x = 0.7361 0.0475 0.2625 0.7622 0.9103

Obsrvese que por haber utilizado parntesis en vez 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(3) A = 8 1 6 3 5 7 4 9 2 A(:,3:-1:1) ans = 6 1 8 7 5 3 2 9 4

aunque hubiera sido ms fcil utilizar la funcin fliplr(A), que es especfica para ello. Finalmente, hay que decir que A(:) representa un vector columna con las columnas de A una detrs de otra.

6.2 EJEMPLO
Para nuestro estudio de solucin de sistemas de ecuaciones utilizando mtodos iterativos (Jacobi, Gauss-Seidel y SOR) tendremos en cuenta las siguientes funciones internas de MATLAB Normas de matrices: norm(A) norma sub-2, es decir, mximo valor singular de A, max(svd(A)). norm(A,2) lo mismo que norm(A) norm(A,1) norma sub-1 de A, mxima suma de valores absolutos por columnas, es decir: max(sum(abs((A)))) norm(A,inf) norma sub- de A, mxima suma de valores absolutos por filas, es decir: max(sum(abs((A)))) Normas de vectores: norm(x,p) norma sub-p, es decir sum(abs(x)^p)^(1/p). norm(x) norma eucldea; equivale al mdulo o norm(x,2).

23

norm(x,inf) norma sub-inf, es decir max(abs(x)). norm(x,1) norma sub-1, es decir sum(abs(x)). Funcin basada en el clculo 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). Si utilizamos la instruccin sola, es decir, x=eig(B) obtenemos los valores propios de B almacenados en la variable x y podremos obtener el radio espectral de A usando la instruccin max(abs(x)) y concluir sobre la convergencia o divergencia de cierto mtodo. Ahora realizaremos un estudio sobre el mtodo iterativo de Jacobi. Recordemos que la iteracin en el paso k+1 para la variable xi esta dada por

xi

( k +1)

n (k ) bi ai , j x j j =1 j i = a i ,i

donde a i ,i 0 , utilizando las instrucciones de MATLAB podemos escribir esta iteracin como

xnew(i ) = (b(i ) A(i,1 : i 1) * xold (i,1 : i 1) A(i, i + 1 : n) * xold (i, i + 1 : n )) / A(i, i )

o equivalentemente

xnew(i ) = (b(i ) A(i, [1 : i 1, i + 1 : n]) * xold (i, [1 : i 1, i + 1 : n])) / A(i, i ) .


El algoritmo para el mtodo de Jacobi requiere como datos de partida la matriz de coeficiente A, el vector de trminos independientes b, un vector inicial xold, una tolerancia tol (para medir las distancias entre las aproximaciones) y un nmero mximo de iteraciones nmax. Realizamos un ciclo mientras para hallar las aproximaciones (iteraciones) a la solucin del sistema, en cada paso de la iteracin es necesario actualizar el valor de xold (iteracin en el paso k) y hallar xnew (iteracin en el paso k+1), calculamos la distancia entre el valor anterior y el nuevo, si es menor que tol salimos del ciclo mientras sino continuamos, cuando el nmero de iteraciones supera a nmax salimos del ciclo mientras.

Algoritmo de Jacobi Lea A, b, xold, tol, nmax dist = tol+1 cont = 1 Mientras dist>tol y cont nmax Para i = 1 hasta n n bi ai , j xold i j =1 j i xnewi = a i ,i

24

fin dist = xnew xold cont=cont+1 xold=xnew fin si dist tol imprima la aproximacin a la solucin del sistema es muestre xold muestre cont si no imprima se excede el nmero de iteraciones, la aproximacin es muestre xold fin
El correspondiente cdigo en MATLAB es (utilizando funciones)

function jacobi(A,b,xold,tol,nmax) if det(A)==0 disp('el sistema no tiene solucin unica') return end dist=tol+1; cont=1; n=length(b); xnew=zeros(n,1); while cont<=nmax & dist>tol for i=1:n xnew(i)=(b(i)-A(i,[1:i-1,i+1:n])* xold([1:i-1,i+1:n]))/A(i,i); end dist=norm(xnew-xold,2); cont=cont+1; xold=xnew; end if error <= tol disp('la aproximacin a la solucin del sistema es ') disp(xold) disp(cont) else disp('se exceden el numero de iteraciones, aproximacin a la solucin del sistema es ') disp(xold) end

la

Para este algoritmo y cdigo no hay forma de analizar convergencia del mtodo. Si analizamos el mtodo de Jacobi desde el punto de vista matricial podemos construir la matriz de iteracin dentro del algoritmo (y cdigo) y si la matriz de iteracin tiene radio

25

espectral menor que uno que realice las iteraciones, en caso contrario que muestre un mensaje en el que diga que el mtodo diverge. Recordemos que la iteracin en los mtodos iterativos de Jacobi, Gauss Seidel y SOR estn dados por

x ( k +1) = ( I M 1 A) x ( k ) + M 1b , para Jacobi M = diagonal ( A) con la condicin de que a i ,i 0 para todo i.


Usando las instrucciones internas de Matlab, M est dado por

M=diag(diag(A))
Y el algoritmo para jacobi ser

Algoritmo de Jacobi Lea A, b, xold, tol, nmax para i=1 hasta n si ai,i=0 Muestre no se puede calcular M-1 , termine fin fin M=diagonal(A) Bj=I-M-1A bj=M-1b si max(abs(eig(Bj)))1 muestre el mtodo de Jacobi no converge , termine fin dist = tol+1 cont = 1 Mientras dist>tol y cont nmax xnew=Bj*xold+bj dist = xnew xold cont=cont+1 xold=xnew fin si dist tol imprima la aproximacin a la solucin del sistema es muestre xold muestre cont si no imprima se excede el nmero de iteraciones, la aproximacin es muestre xold fin
El correspondiente codigo en MATLAB es (utilizando funciones)

function jacobim(A,b,xold,tol,nmax) if det(A)==0 disp('el sistema no tiene solucin unica')

26

return end n=length(b); for i=1:n if A(i,i)==0 disp('no se puede calcular la inversa de M') return end end M=diag(diag(A)); Bj=eye(n)-inv(M)*A; bj=inv(M)*b; if max(abs(eig(Bj)))>=1 disp('el mtodo de Jacobi no converge') return end error=tol+1; cont=1; while cont<=nmax & error>tol xnew=Bj*xold+bj; error=norm(x0-x1); cont=cont+1; xold=xnew; end if error <= tol disp('la aproximacin a la solucin del sistema es ') disp(xold) disp(cont) else disp('se exceden el numero de iteraciones, aproximacin a la solucin del sistema es ') disp(xold) end

la

7. Graficacin En MATLAB:
Otra de las caractersticas importantes de MATLAB, que lo hacen ms til que otros lenguajes de programacin, es su capacidad de graficar en dos y tres dimensiones. A estas alturas, despus de ver cmo funciona este programa, a nadie le puede resultar extrao que los grficos 2-D y 3-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 de vectores fila). MATLAB utiliza un tipo especial de ventanas para realizar las operaciones grficas. Ciertos comandos abren una ventana (figure) nueva y otros dibujan sobre la ventana

27

activa, bien sustituyendo lo que hubiera en ella elementos grficos a un dibujo anterior (hold on).

(hold off), bien aadiendo nuevos

7.1. Funciones grficas 2D elementales


MATLAB dispone de cuatro 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 cuatro funciones son las siguientes: plot() crea un grfico a partir de vectores y/o columnas de matrices, con escalas lineales sobre ambos ejes 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 As si queremos graficar, por ejemplo, la funcin sin(x) entre 0 y 2, podemos ejecutar las siguientes instrucciones en MATLAB

>> x = 0:0.001:2*pi; >> y = sin(x); >> plot(x,y)

%define el vector de abscisas %define el vector de ordenadas

Existen adems otras funciones orientadas a aadir ttulos al grfico, a cada uno de los ejes, a dibujar una cuadrcula auxiliar, a introducir texto, etc. Estas funciones son las siguientes: title('ttulo') aade un ttulo al dibujo xlabel('tal') aade una etiqueta al eje de abscisas. Con xlabel off desaparece ylabel('cual') aade una etiqueta al eje de 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 texto es tambin un vector de cadenas de texto 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 clic para introducir el texto en esa posicin. legend() define rtulos para las distintas lneas o ejes utilizados en la figura.

7.2.

Funciones grficas tridimensionales

MATLAB tiene posibilidades de realizar varios tipos de grficos 3D. Para darse una idea de ello, lo mejor es verlo en la pantalla. La primera forma de grfico 3D es la 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

28

continua (defecto), bien mediante markers. espiral:

As, el siguiente comando dibuja una lnea

>> fi=[0:pi/20:6*pi]; plot3(cos(fi),sin(fi),fi,'g')

Ahora se ver cmo se representa una funcin de dos variables. Para ello se va a definir una funcin de este tipo en un fichero llamado test3d.m. La frmula ser la siguiente:

z = 3(1 x ) e x
2

( y +1)2

2 2 x 2 2 1 10 x 3 y 5 e x y e ( x +1) y 3 5

El fichero test3d.m debe contener las lneas siguientes:


function z=test3d(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);

Ahora, ejectese la siguiente lista de comandos (directamente, o mejor creando un fichero test3dFC.m que los contenga):
>> >> >> >> >> >> >> >> >> >> >> >> >> x=[-3:0.4:3]; y=x; close subplot(2,2,1) figure(gcf),fi=[0:pi/20:6*pi]; plot3(cos(fi),sin(fi),fi,'r') [X,Y]=meshgrid(x,y); Z=test3d(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)

Se obtiene el siguiente grfico:

8.

El Entorno Grfico de MATLAB: Creacin de Interfaces.


29

Hoy en da, con la proliferacin de programas tipo Windows, en los que el usuario encuentra un ambiente amigable y fcil de usar, en el que puede ingresar sus datos en cajas de texto y ejecutar cdigos con slo hacer clic en un botn, MATLAB no poda quedarse atrs. Las ltimas versiones de MATLAB, en especial despus de la versin 6.0, se han preocupado por incorporar herramientas fciles de usar, con las que el usuario pueda crear interfaces grficas para sus programas, como lo hara un programador de Visual Basic. Claro est, todava falta avanzar mucho en este campo y no es la ms grande preocupacin de los desarrolladores de MATLAB. MATLAB posee herramientas que permiten crear interfaces grficas, de manera similar a como se hace en Visual Basic, pero con muchas menos posibilidades. Estas son las llamadas GUI (Guide User Interface) y podemos acceder a ellas digitando la instruccin guide en la ventana de comandos. Encontraremos 12 herramientas (muchas menos de las 32 con las que cuenta Visual Basic) con las que podemos crear nuestra interfaz: Push Button, Toggle Button, Radio Button, CheckBox, Edit Text, Static Text, Slider, Frame, ListBox, Popup Menu, Axes. As mismo, encontraremos un formulario en blanco sobre el cual podemos empezar a construir el nuestro. Todas las anteriores tienen su equivalente en Visual Basic (Edit Text = Textbox, Static Text = Label, etc), sin embargo, MATLAB posee una herramienta que permite desarrollar grficos en nuestra interfaz: Axes. Esta ltima no tiene equivalente en Visual Basic. En general, programar una interfaz grfica de MATLAB es un poco ms complicado que programarla en Visual Basic, sin embargo, la mejor forma de aprenderlo es practicando. Para ello se puede usar el Help, que en sus ltimas versiones tiene guas paso a paso para crear GUIs.

30

También podría gustarte