You are on page 1of 63

Pr

acticas de An

alisis
Matricial Aplicado y
Ampliaci

on de M

etodos
Num

ericos con MATLAB


Ion Zaballa

Indice general
1. Lo Basico 4
1.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2. Comienzo y Fin de una sesion de MATLAB . . . . . . . . . . . . . . . . . . . . . 5
1.3. Sistema de Ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4. Edicion en la Lnea de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2. Matrices y Vectores 9
2.1. Generacion de matrices explcitamente . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.1. Elementos de Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.2. Formatos de Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2. Manipulacion de vectores y matrices . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3. Matrices a partir de funciones predenidas en MATLAB . . . . . . . . . . . . . . 20
2.4. Otras formas de generar matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3. El Entorno de Trabajo de MATLAB 24
3.1. El Espacio de Trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.1. Comandos save y load . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.2. El Comando diary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.3. Lneas de comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2. El Camino de b usqueda (SEARCH PATH) de MATLAB . . . . . . . . . . . . . . 27
3.3. Manipulacion de cheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.1. Ejecucion de Programas Externos . . . . . . . . . . . . . . . . . . . . . . 30
2
3
4. Programacion en MATLAB 31
4.1. Empezando a programar en MATLAB . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.1. Operadores relacionales y logicos . . . . . . . . . . . . . . . . . . . . . . . 33
4.1.2. Bifurcaciones y Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.1.3. Presentacion de los resultados . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2. Scripts y Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5. N umeros complejos y polinomio 50
5.1. N umeros Complejos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2. Calculo con Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
A. Funciones incorporadas en MATLAB 54
A.1. Funciones que act uan sobre escalares . . . . . . . . . . . . . . . . . . . . . . . . . 55
A.2. Funciones que act uan sobre vectores . . . . . . . . . . . . . . . . . . . . . . . . . 57
A.3. Funciones que act uan sobre matrices . . . . . . . . . . . . . . . . . . . . . . . . . 57
B. Consejos para el uso de Matlab en picasso 61
B.1. Transferencia de cheros a picasso . . . . . . . . . . . . . . . . . . . . . . . . . . 61
B.2. Primer uso de MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Captulo 1
Lo Basico
1.1. Introducci on
Este documento pretende ser una gua basica para introducirse de forma personal en el uso
de MATLAB y en relacion con las asignaturas Analisis Matricial Aplicado y Ampliacion de
Metodos Numericos. Por lo tanto, aqu solo se cubriran aquellos aspectos de MATLAB que
tienen relacion con la materia discutida en dichas asignaturas. En otros documentos, que se
entregaran en clase, se plantearan ejercicios en base al contenido de esta gua y que deben ser
resueltos personalmente. Si se quiere disponer de una buena y completa gua de MATLAB, mi
recomendacion es el libro MATLAB Guide de D. J. Higham y N. J. Higham, editado por SIAM.
Aunque el origen de MATLAB estuvo ntimamente ligado a la manipulacion y computacion de
y con matrices, durante los ultimos a nos ha evolucionado de forma que hoy se puede considerar
como un software de proposito general para todas las ramas de la matematica y la ingeniera
desde el punto de vista numerico y computacional. Tambien es posible el calculo simbolico con
MATLAB siempre que se disponga del toolbox apropiado; en este caso el Symbolic toolbox. Exis-
ten muchos otros toolboxes que, sobre la base del n ucleo de MATLAB, proporcionan funciones
especcas para el calculo numerico de ciertas partes concretas de la matematica, la ingeniera
y otras ciencias. Si se quiere informacion sobre los productos relacionados con MATLAB puede
visitarse la pagina web de la empresa que lo desarrolla: www.mathworks.com.
Trabajando con MATLAB se debe tener muy claro que las unidades basicas son matrices (un
escalar es, por lo tanto, una matriz 1 1), y que por lo tanto todas las operaciones se reeren
a matrices.
Se puede ejecutar MATLAB sobre cualquier sistema operativo. Se presupone que las practicas se
realizaran en la sala de informatica del Departamento de Matematica Aplicada y EIO o en una
4
Lo Basico 5
de las aulas de ordenadores de la Facultad de Ciencias. En el primer caso, la sala esta compuesta
de una serie de terminales gracos conectados a un servidor de SUN Microsystems dotado del
sistema operativo UNIX Solaris y cuyo nombre en internet es picasso.lc.ehu.es. En lo sucesivo
hablaremos de picasso para referirnos a el. En el segundo caso se trata de un aula de ordenadores
personales con sistema operativo MSWindows (en alguna de sus versiones).
A partir de la version 6 los interfaces gracos para los sistemas basados en MSWindows y UNIX
son muy parecidos, as que hay muy pocas diferencias en el entorno de trabajo de MATLAB
para ambos sistemas operativos. Ademas, las ultimas versiones de MATLAB (desde Release
14MATLAB 7) corrigen algunas deciencias de edicion con el teclado en castellano (como
la ubicacion del smbolo [ o el acento circunejo ^) que tenan las versiones anteriores para los
sistemas UNIX. Esto signica que las explicaciones que damos en estas notas son, en su mayora,
de aplicacion para MATLAB bajo ambos sistemas.
1.2. Comienzo y Fin de una sesi on de MATLAB
Una sesion de MATLAB se comienza de forma diferente seg un la plataforma sobre la que lo
ejecutemos. En un PC o Mac basta hacer doble click con el boton izquierdo del raton sobre
el icono de MATLAB. En picasso podemos ejecutar MATLAB en modo consola o utilizando un
interfaz graco. En cualquier caso, se debe abrir primero una sesion X:
Escribir el username y password.
Abrir una ventana de comandos command tool.
Para ejecutar MATLAB en modo consola se debe abrir una xterminal y en ella escribir matlab
-nodesktop. Para utilizar MATLAB en modo graco, que es mas sencillo, se debe escribir
matlab y pulsar la tecla de entrada.
Trabajando en picasso en modo graco, MATLAB puede consumir muchos recursos del sistema;
principalmente si hay muchos usuarios conectados y dependiendo de la calidad de los terminales
gracos. Si este fuera el caso (que se nota por una excesiva ralentizacion del sistema) es reco-
mendable trabajar en modo consola. En este modo hay una serie de reglas que se recomienda
utilizar y que se exponen en el Apendice B.
Trabajando en modo graco, bien sea bajo UNIX o MSWindows, una vez ejecutadas las acciones
mencionadas, aparecera el logotipo de MATLAB y a continuacion una ventana parecida la que se
muestra en la Figura 1.1 (la gura mostrada corresponde al release 14. En las nuevas versiones la
ventana es diferente, pero todava guarda un cierto parecido). Si es la primera vez que se ejecuta
MATLAB, la ventana principal puede estar compuesta de otras varias, por ejemplo Launch
Pad, Command History y Command Window. De momento solo nos interesa la ultima de ellas
que es la ventana de comandos de MATLAB. Por ello, aunque no es estrictamente necesario,
cerramos las demas con un click del raton en el smbolo de cada ventana. En realidad hay
otras ventanas ocultas que se pueden ir cerrando sucesivamente hasta que no quede mas que la
ventana Command Window. Todas estas ventanas tienen, de momento, un interes secundario y
Lo Basico 6
Figura 1.1: Ventana inicial de MATLAB.
siempre se pueden volver a abrir seleccionandolas con el raton en el men u view de la ventana
principal.
En la ventana de comandos de MATLAB aparece el smbolo >> (este es el prompt de
MATLAB) y el cursor parpadeando. El programa esta preparado para recibir ordenes.
Para nalizar la sesion en cualquier sistema basta escribir el comando quit. Alternativamente
se puede elegir Exit MATLAB en el men u File del men u principal.
Cuando hablamos de usar un comando (por ejemplo quit), nos referimos a escribir detras del
prompt de MATLAB la palabra correspondiente (en este caso quit) y pulsar la tecla de
entrada.
1.3. Sistema de Ayuda
El sistema de ayuda de MATLAB es muy completo. Hay varios niveles de ayuda: desde demos
hasta ayuda especializada para saber lo que hace una determinada funcion o comando. Empe-
zando por lo ultimo, si se quiere saber, por ejemplo, lo que es y hace el comando lu se teclea en
la ventana de comandos help lu o helpwin lu. MATLAB responde, en la propia ventana de
comandos (en el primer caso) y en una ventana aparte en formato mas bonito (en el segundo),
explicando todo lo relativo a dicho comando.
Lo anterior implica que se sabe lo que se busca. Hay niveles mas generales de ayuda. Por ejemplo,
tecleando helpwin aparece una relacion de las carpetas de MATLAB que contienen ayuda y una
breve descripcion del contenido de cada carpeta. Pinchando en cada una de ellas se obtiene un
listado con los comandos o funciones que hay en dicha carpeta. Al pinchar, de nuevo, en cada
uno de ellos se obtiene una ayuda exhaustiva de lo que hace cada funcion.
Los dos niveles de ayuda anteriores (help funcion y helpwin) estan disponibles tanto en modo
graco como en modo consola. Si se trabaja en modo graco hay, ademas, una tercera posibilidad
de ayuda mas general. Pinchando en Help en el menu principal de MATLAB y seleccionando
Product Help aparecera una nueva ventana como la de la Figura 1.2 con toda la ayuda de
Lo Basico 7
MATLAB. En la parte izquierda aparece un men u que se puede desplegar pinchando en el
Figura 1.2: La ventana de ayuda de MATLAB.
smbolo . A partir de aqu se puede ir de un sitio a otro pinchando en el lugar apropiado
como en un navegador de internet.
1.4. Edicion en la Lnea de Comandos
Si se comete alg un error cuando se esta introduciendo un comando de MATLAB, no es necesario
volver a reescribir todo de nuevo. Las teclas de echas o la combinacion de la tecla ctrl y otra
pueden ayudarte:
ctrl-p Reescribe la lnea anterior
ctrl-n Reescribe la lnea siguiente
ctrl-b Mueve el cursor un caracter hacia atras
ctrl-f Mueve el cursor un caracter hacia adelante
ctrl- ctrl-r Mueve el cursor una palabra a la derecha
ctrl- ctrl-l Mueve el cursor una palabra a la izquierda
Inicio ctrl-a Mueve el cursor al comienzo de la lnea
Fin ctrl-e Mueve el cursor al nal de la lnea
Esc ctrl-u Borra la lnea
Supr ctrl-d Borra el caracter sobre el cursor
Backspace ctrl-h Borra el caracter que esta delante del cursor
ctrl-k Borra todo desde el cursor hasta el n de la lnea
No es necesario poner el cursor al nal de la lnea de comandos para que MATLAB reconozca
la lnea entera, se puede dar entrada estando el cursor en cualquier punto de dicha lnea. Esto
suele suceder cuando se ha observado un error al escribir y se mueve el cursor hacia atras para
corregir el fallo.
Si se va a volver a utilizar un comando ya usado anteriormente (o parte de el), basta teclear
unos pocos caracteres de dicho comando y entonces usar la tecla . MATLAB recordara el ultimo
Lo Basico 8
comando que comenzaba con esos caracteres. Sucesivas pulsaciones de producen la aparicion
de los anteriores comandos que empiezan por las letras o smbolos escritos.
Tambien se puede utilizar el clasico sistema de copiar y pegar para producir ordenes en la lnea
de comandos.
Captulo 2
Matrices y Vectores
Vectores y matrices son para MATLAB la misma cosa. Se pueden introducir matrices en
MATLAB de varias formas:
Introduciendo una lista explcita de elementos.
Generando matrices con funciones predenidas en MATLAB.
Cargando matrices desde un chero de datos externo.
Creando matrices con funciones denidas por el usuario/a a traves de cheros M.
En este captulo analizaremos cada una de estas formas de generar matrices y vectores.
2.1. Generaci on de matrices explcitamente
La forma mas sencilla de introducir matrices es escribiendo explcitamente los elementos de la
matriz. Las otras formas de generar matrices las iremos viendo posteriormente. Para obtener
una matriz escribiendo sus elementos solo hay que tener en cuenta unas pocas reglas:
Los elementos de la matriz hay que introducirlos la a la.
Los elementos de cada la deben estar separados por comas o espacios en blanco.
Para indicar el nal de una la se debe escribir ;.
La lista de todos los elementos debe estar encerrada entre corchetes, [ ].
9
Matrices y Vectores 10
Debe observarse que el n umero de elementos en cada la debe ser el mismo; en caso contrario,
MATLAB producira un mensaje de error. Por ejemplo para introduir la matriz
A =

16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1

escribiramos:
>> A=[16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
La respuesta de MATLAB, una vez pulsada la tecla de retorno, sera:
A =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
A veces el n umero de elementos en cada la es muy grande y es preferible introducir una la en
cada lnea, lo unico que hay que hacer es terminar la lnea con tres puntos: . . . y teclear retorno.
Por ejemplo
>> A=[16 3 2 13; ...
5 10 11 8;...
9 6 7 12;...
4 15 14 1 ]
produce la misma matriz.
De cualquiera de las formas la matriz introducida queda asignada a la variable A. Debe observarse
que con MATLAB no hay que declarar las variables. Se podra haber introducido la matriz sin
asignarsela de forma especca a una variable. Por ejemplo, si escribimos
>> [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
MATLAB responde:
ans =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
Matrices y Vectores 11
Aunque nosotros no hemos asignado la matriz a ninguna variable, MATLAB se la asigna a la
variable ans, que es una variable predenida en el sistema. Esta variable es como las demas.
Dado que A y ans son dos variables a las que les hemos asignado el mismo valor, el resultado de
multiplicar A por s misma debe ser el mismo que el de multiplicar ans por s misma:
>> A*A
ans =
341 285 261 269
261 301 309 285
285 309 301 261
269 261 285 341
>> ans*ans
ans =
341 285 261 269
261 301 309 285
285 309 301 261
269 261 285 341
MATLAB distingue entre may usculas y min usculas de forma que a y A son dos variables distintas.
Para saber las variables que tienes denidas puedes usar el comand who.

Estas tambien aparecen
en la ventana workspace. En el siguiente captulo se explica como acceder a esta ventana y lo
que signica.
2.1.1. Elementos de Matrices
En el ejemplo anterior los elementos de la matriz eran n umeros enteros, pero en realidad los
elementos de una matriz pueden ser cualquier expersion valida de MATLAB. Por ejemplo
>> x=[ -1.3 sqrt(3) (1+2+3)*4/5]
produce
x =
-1.3000 1.7321 4.8000
MATLAB dispone de un gran n umero de funciones elementales matematicas, incluyendo valor
absoluto abs, raz cuadrada sqrt, exponencial exp, seno sin, etc. Todas ellas se usan mas o
menos igual. As, para calcular

3 escribiramos sqrt(3). MATLAB no produce un error si se


le pide la raz cuadrada o el logaritmo de un n umero negativo, sino que devuelve el correspon-
diente n umero complejo. Tambien proporciona muchas funciones matematicas avanzadas como
las funciones de Bessel o la funcion Gamma. Una lista de todas las funciones elementales con su
uso se puede obtener utilizando la ayuda interactiva:
Matrices y Vectores 12
>> helpwin
y haciendo doble click en /matlab/elfun y /matlab/specfun. En el Apendice A se resumen algunas
de la funciones mas importantes de MATLAB.
Tambien hay una serie de constantes predenidas:
pi 3.14159265. . .
i la unidad imaginaria,

1.
j lo mismo que i.
eps precision relativa de los n umeros en coma otante, 2
52
= 2,204e 16. Es decir distancia
de 1.0 al siguiente n umero mas proximo en coma otante.
realmin n umero en coma otante mas peque no, 2
1022
.
realmax n umero en coma otante mas grande, (2 eps)2
1023
.
inf innito. Se produce al dividir un n umero distinto de cero por cero.
nan Not-A-Number. Se produce al evaluar expresiones como 0/0 o inf-inf.
2.1.2. Formatos de Salida
En el ejemplo de mas arriba hemos podido observar que aparentemente MATLAB siempre res-
ponde redondeando los resultados de las operaciones correspondientes a cuatro cifras decimales.
En realidad, los resultados puede presentarlos de diversas formas. Para ello se dispone del co-
mando format. Estos son los posible formatos
format short coma ja con 4 decimales(formato por defecto)
format long coma ja con 15 decimales
format hex cifras hexadecimales
format bank n umeros con dos cifras decimales
format short e notacion cientca con 4 decimales
format short g notacion cientca o decimal, dependiendo del valor
format long e notacion cientca con 15 decimales
format loose intercala algunas lneas en blanco en las salida para facilitar
la lectura (por defecto)
format compact elimina las lneas en blanco del fomat loose
format rat aproxima los n umeros a cocientes de enteros; i.e. n umeros
racionales
MATLAB aplica un factor de escala general a las matrices cuando los elementos mas grandes o
mas peque nos son superiores o inferiores, respectivamente, a una determinada cantidad (10
3
y
10
3
).
Matrices y Vectores 13
Las expresiones se pueden construir con n umeros (reales o complejos) y utilizando los operadores
aritmeticos y las reglas de precedencia habituales (en caso de duda siempre se pueden utilizar
parentesis):
+ adicion
sustraccion
multiplicacion
/ division por la derecha
\ division por la izquierda
potenciacion
transposicion
Estos mismos operadores se utilizan con matrices, por eso se incluye la transposicion y la division
por la izquierda. Si A y B son matrices y A es invertible entonces A\B = A
1
B y B/A = BA
1
.
Ambas producen lo mismo cuando son aplicadas a n umeros. As 1/4 y 1 \ 4 producen el mismo
valor numerico: 0,25. De la misma forma A

es la transpuesta de A y si a es un n umero a

= a.
Si A no es invertible A \ B es una matriz C tal que A C es aproximadamente B (en cierto
sentido que estudiaremos en teora). De la misma forma B/A es una matriz C tal que C A es
aproximadamente B. En otras palabras A \ B y B/A son soluciones ( unicas si A es invertible)
de las ecuaciones AX = B y XA = B, respectivamente.
Hay otras operaciones especiales para matrices:
. multiplicacion termino a termino
./ division a la derecha
termino a termino
.\ division a la izquierda
termino a termino
. potenciacion termino a termino
Dadas dos matrices A y B no es lo mismo A*B que A.*B, ni A/B que A./B. Los primeros son
el producto y la division (en el sentido de mas arriba) habituales. Cuando estos operadores
estan precedidos por un punto, la operacion se realiza elemento a elemento. As
>> [1 2; 3 4]*[0 1; 2 3]
ans =
4 7
8 15
>> [1 2; 3 4].*[0 1; 2 3]
ans =
0 2
6 12
Cuando la operacion se hace entre una matriz y un escalar el resultado es el mismo:
Matrices y Vectores 14
>> 2\[1 2; 3 4]
ans =
0.5000 1.0000
1.5000 2.0000
>> 2.\[1 2; 3 4]
ans =
0.5000 1.0000
1.5000 2.0000
Que respondera MATLAB a la siguiente orden?
>> 2/[1 2; 3 4]
Para una matriz A tampoco es lo mismo A^3 que A.^3. Lo primero es el resultado de multiplicar
A por s misma tres veces; solo es aplicable a matrices cuadradas. Lo segundo es la matriz
cuyos elementos son los cubos de los elementos de A; es aplicable a cualquier matriz. En algunos
sistemas UNIX puede haber problemas para escribir el signo de potenciacion en MATLAB.
Para evitar el uso de este smbolo tenemos la siguiente alternativa:
A.^3=power(A,3) A^3=mpower(A,3)
2.2. Manipulaci on de vectores y matrices
Puesto que las unidades basicas de MATLAB son las matrices, dispone de varias formas de crear
vectores y matrices de forma casi automatica, y de manipular los elementos de una matriz.
El operador dos puntos, : , es uno de los mas importantes. Sirve para generar vectores y
matrices cuyos elementos estan igualmente espaciados. As
>> x=1:5
produce un vector cuyas componentes van de 1 a 5 en incrementos de 1:
x =
1 2 3 4 5
Mientras que
>> y=0:pi/4:pi
proporciona un vector entre 0 y con incrementos de /4:
Matrices y Vectores 15
y =
0 0.7854 1.5708 2.3562 3.1416
Tambien son posibles incrementos negativos:
>> z=6:-.5:3
z =
6.0000 5.5000 5.0000 4.5000 4.0000 3.5000 3.0000
El comando linspace se puede utilizar para generar un vector en el que se especica las com-
ponentes primera y ultima y el n umero de ellas:
>> k=linspace(-sqrt(3),pi,5)
k =
-1.7321 -0.5136 0.7048 1.9232 3.1416
El n umero de componentes por defecto es 100. Esto signica que una sentencia del tipo
>> k=linspace(-sqrt(3),pi);
asignara a la variable k un vector de 100 componentes igualmente espaciadas entre

3 y
(hemos escrito ; al nal del comando para que el resultado no sea mostrado).
Por otra parte, dada una matriz A, el elemento de la la i y la columna j, se denota por A(i,j).
As, con la matriz A de mas arriba (que utilizaremos a lo largo de esta seccion):
>>A=[16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
A =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
el elemento en la posicion (2, 4) es 8. Si escribimos
>> A(2,4)
MATLAB nos devuelve:
ans =
8
Se puede modicar el elemento de cualquier posicion sin mas que cambiar su valor. La respuesta
de MATLAB es toda la matriz con el nuevo valor en dicha posicion. Para seguir manteniendo,
para los siguientes ejemplos, la misma matriz A, primero almacenamos en c el elemento que
vamos a cambiar y a continuacion recuperamos la matriz original::
Matrices y Vectores 16
>> c=A(2,4),A(2,4)= 3*sqrt(A(1,4))-1/log10(A(3,4))
c =
8
A =
16.0000 3.0000 2.0000 13.0000
5.0000 10.0000 11.0000 9.8900
9.0000 6.0000 7.0000 12.0000
4.0000 15.0000 14.0000 1.0000
>> A(2,4)=c
A =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
En la primera lnea de comandos hemos puesto dos ordenes: c=A(2,4),A(2,4)= 3*sqrt(A(1,4))
-1/log10(A(3,4)). Tal y como se ha mencionado mas arriba escribir ; despues de una orden
produce el efecto de que el resultado no se escribe en la pantalla. En cada lnea de comandos
podemos poner cuantas ordenes queramos separadas bien sea por comas (en cuyo caso los re-
sultados correspondientes apareceran sucesivamente en la pantalla) o bien por ; para que los
resultados no aparezcan en la pantalla. (Mas abajo hay un ejemplo).
Por otra parte, si pedimos el valor del elemento en la posicion (4, 5), MATLAB nos devuelve un
mensaje de error porque el tama no de A es 4 4:
>> A(4,5)
??? Index exceeds matrix dimensions.
Desde la version 5 de MATLAB se puede usar end para indicar el ultimo elemento de una matriz,
respecto de una dimension dada. As:
>> a=4:10
a =
4 5 6 7 8 9 10
>> a(end)
ans =
10
>> A(end,end)
ans =
1
>> A(2,end)
ans =
15
>> A(end,2)
ans =
8
Matrices y Vectores 17
No solo se puede extraer cada elemento de una matriz sino cualquier submatriz. Para ello basta
expresar la submatriz deseada en notacion vectorial. As, para obtener el subvector de a
formado por los ultimos 5 primeros elementos escribiramos:
>> a(1:5)
ans =
4 5 6 7 8
y el formado por los ultimos 4:
>> a(end-3:end)
ans =
7 8 9 10
Para obtener la submatriz formada por los elementos que ocupan las posiciones donde se inter-
ceptan las las 1 y 3 y las columnas 3 y 4 escribiramos:
>> C=A([1 3],[3 4])
C =
2 13
7 12
Si queremos la submatriz formada por las dos primeras las podemos utilizar el comando dos
puntos:
>> A([1 2],:)
ans =
16 3 2 13
5 10 11 8
O, utilizando el comando end:
>> A(end-2:end, end-1:end)
ans =
11 8
7 12
14 1
Podemos hacer uso de esta tecnica para generar submatrices correspondientes a las o columnas
igualmente espaciadas. Por ejemplo, si Afuera una matriz 1015, el comando A(2:2:10,1:3:15)
nos devolvera la submatriz formada por las las pares y las columnas 1,4,7,10 y 13.
Si a una matriz le especicamos un solo subndice, MATLAB cuenta los elementos por columnas
y nos devuelve el elemento correspondiente:
Matrices y Vectores 18
>> A(7)
ans =
6
>> A(12)
ans =
14
Por el mismo motivo la orden A(:) nos devuelve el vector columna formado por los elementos
de la matriz colocados columna tras columna:
>> A(:)
ans =
16
5
9
4
3
10
6
15
2
11
7
14
13
8
12
1
La notacion vectorial para los subndices de una matriz puede utilizarse para permutar las o
columnas de una matriz. As para obtener una matriz B con las las primera y segunda, y las
columnas segunda y cuarta de A permutadas, haramos lo siguiente:
>> B=A([2 1 3 4],[1 4 3 2])
B =
5 8 11 10
16 13 2 3
9 12 7 6
4 1 14 15
Y si solo queremos permutar las dos primeras las:
>> B=A([2 1 3 4],:)
B =
Matrices y Vectores 19
5 10 11 8
16 3 2 13
9 6 7 12
4 15 14 1
Dada una matriz A podemos a nadirle las y columnas sin mas que especicar el vector con los
elementos que se quiere a nadir. Por ejemplo, si a nuestra matriz A le queremos a nadir la la
[1 3 5 7] haramos lo siguiente:
>> C=[A;[1 3 5 7]]
C =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
1 3 5 7
Claro que tambien podramos denir primero el vector la que vamos a a nadir y luego a nadirlo:
>> r=1:2:7; C=[A;r]
C =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
1 3 5 7
Si lo que queremos es a nadir una columna actuaramos por transposicion (recordemos que r

es
la transpuesta de r):
>> [A r]
ans =
16 3 2 13 1
5 10 11 8 3
9 6 7 12 5
4 15 14 1 7
Esta forma de crear matrices a partir de otras mas peque nas nos permite ir creando matrices
sobre la marcha empezando desde una matriz vaca. En efecto, la orden >> B=[] nos devuelve
una matriz sin elementos a la que podemos ir a nadiendole las o columnas como hemos hecho
mas arriba:
>> B=[]
Matrices y Vectores 20
B =
[]
>> c1=1:3:7; c2=2:3:8; c3=3:3:9; B1=[B c1 c2 c3], B2=[B;c1;c2;c3]
B1 =
1 2 3
4 5 6
7 8 9
B2 =
1 4 7
2 5 8
3 6 9
Tambien podemos eliminar las y/o columnas con ayuda de la matriz vaca. Simplemente
igualamos a [] la submatriz que queramos eliminar:
>> B2(:,2)=[]
B2 =
1 7
2 8
3 9
nos devuelve la submatriz de B2 que se obtiene al suprimir la segunda columna.
2.3. Matrices a partir de funciones predenidas en MATLAB
Hay un buen n umero de funciones de matrices predenidas en MATLAB. Una relacion de todas
ellas con la descripcion de su uso la puedes encontar escribiendo helpwin y en la ventana que
aparece haciendo doble click en matlab/elmat. Describimos aqu las funciones para generar
las matrices mas elementales:
zeros(m,n) Crea una matriz de tama no mn cuyos elementos son todos 0.
ones(m,n) Crea una matriz de tama no mn cuyos elementos son todos 1.
rand(m,n) Crea una matriz de tama no mn con elementos aleatorios distribudos
uniformemente entre 0 y 1
randn(m,n) Crea una matriz de tama no mn con elementos aleatorios elegidos
con una distribucion normal de media 0 y varianza y desviacion standrad 1
eye(m,n) Crea una matriz de tama no mn con 1s en la diagonal principal
diag(v,k) El argumento v es un vector y el argumento k es opcional pero si
se da, debe ser un n umero entero. MATLAB crea una matriz cuadrada de tama no
n +|k|, con todos lo elementos cero excepto los de la k-esima diagonal
que son los elementos del vector v. Poner k = 0 o no dar un valor
explcito produce el mismo resultado: una matriz diagonal con el vector v
en la diagonal principal. Si k > 0 el vector v aparece en la k-esima
Matrices y Vectores 21
supradiagonal y si k < 0 en la k-esima subdiagonal.
diag(A,k) El argumento A es una matriz y el agumento k es opcional pero si
se da, debe ser un n umero entero. MATLAB produce un vector: la k-esima diagonal
de la matriz A.
Algunos ejemplos:
>> Z=zeros(2,4)
Z =
0 0 0 0
0 0 0 0
>> F=5*ones(3,3)
F =
5 5 5
5 5 5
5 5 5
>> N=10*rand(2,5)
N =
9.5013 6.0684 8.9130 4.5647 8.2141
2.3114 4.8598 7.6210 0.1850 4.4470
>> I=2*eye(2,4)
I =
2 0 0 0
0 2 0 0
>> G=diag(-3:3) + diag(ones(6,1),1) + diag(-1*ones(6,1),-1)
G =
-3 1 0 0 0 0 0
-1 -2 1 0 0 0 0
0 -1 -1 1 0 0 0
0 0 -1 0 1 0 0
0 0 0 -1 1 1 0
0 0 0 0 -1 2 1
0 0 0 0 0 -1 3
>> diag(G),diag(G,1),diag(G,-1)
ans =
-3
-2
-1
0
1
2
Matrices y Vectores 22
3
ans =
1
1
1
1
1
1
ans =
-1
-1
-1
-1
-1
-1
2.4. Otras formas de generar matrices
Hay otras formas de producir matrices. Comentamos a continuacion como generar matrices a
partir de cheros externos. Estos son cheros almacenados en el disco duro y que han sido
producidos bien por MATLAB o bien por nosotros mismos. En cualquier caso, conviene tener
un directorio especco donde almacenar estos y otros posibles cheros. Hablaremos mas ex-
tensamente sobre este tema y otros relacionados cuando estudiemos el entorno de trabajo de
MATLAB. Ahora comentamos solo lo necesario para crear matrices a partir de cheros externos.
Me referire a matlabdir como el directorio donde se guardaran todos los cheros de MATLAB
creados por nosotros mismos. El nombre real de este directorio para cada cual puede ser diferente.
En primer lugar se debe crear. Para ello conviene comprobar primero en que directorio del
sistema de archivos nos encontramos. Esto se hace con el comando pwd. Se puede cambiar al
directorio que se desee con el comando cd y crear entonces el directorio matlabdir con la orden
habitual: mkdir matlabdir. Hay otras ordenes correspondientes al sistema operativo que se
veran mas adelante. Tambien se pueden consultar con el sistema de ayuda: helpwin y entonces
matlab/general.
Lo siguiente que tenemos que hacer es posibilitar que MATLAB reconozca el directorio matlabdir.
Es decir, que sepa de su existencia para que pueda encontrar los cheros all depositados. Para
ello debemos a nadirlo al path de MATLAB con el comando addpath. Por ejemplo: addpath
/ruta completa/matlabdir. Si ahora tecleamos path, en la primera lnea debera aparecer la
ruta completa hasta nuestro directorio matlabdir.
Analizamos ahora la forma de generar matrices desde cheros externos:
Con el comando load. Este comando puede leer cheros externos binarios, producidos por
sesiones anteriores de MATLAB, o de texto. Para obtener matrices de cheros de texto
externos estos deben estar organizados como una tabla rectangular de n umeros, separados
Matrices y Vectores 23
por espacios en blanco, con una la por lnea y con igual n umero de elementos en cada
la. Por ejemplo, con un editor de texto (textedit en picasso o notepad en MSWindows)
podemos crear un chero de texto que contenga estas cuatro lneas:
16,0 3,0 2,0 13,0
5,0 10,0 11,0 8,0
9,0 6,0 7,0 12,0
4,0 15,0 14,0 1,0
Guardamos este chero bajo el nombre de magico.dat en el directorio matlabdir. El coman-
do
>> load magico.dat
lee el chero y asigna a la variable magico la matriz contenida en el chero.
>> magico
magico =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
Creando un chero M con el contenido de una o mas matrices. Los cheros M son parte
fundamental de MATLAB y los analizaremos posteriormente. Por ahora solo necesitamos
saber que si con nuestro editor creamos un chero de texto que contenga las siguientes 5
las:
A = [...
16,0 3,0 2,0 13,0
5,0 10,0 11,0 8,0
9,0 6,0 7,0 12,0
4,0 15,0 14,0 1,0
];
y salvamos este chero como magico.m, entonces el comando magico en MATLAB lee el
chero y crea la variable A que contiene la matriz del chero. Por supuesto, el chero debe
estar en el directorio matalbdir.
Captulo 3
El Entorno de Trabajo de MATLAB
3.1. El Espacio de Trabajo
El espacio de trabajo (workspace en ingles) es el area de memoria accesible desde la lnea de
comandos de MATLAB. Si estamos trabajando en modo graco hay dos formas de acceder a el:
abriendo la ventana correspondiente o mediante los comandos who y whos. Empezando por lo
segundo, estos dos comandos muestran el contenido del espacio de trabajo en cada momento. El
comando who proporciona una lista corta, mientras que whos da, ademas, el tama no y alguna
informacion adicional sobre almacenamiento de las variables que se han utilizado. He aqu un
ejemplo:
>> who
Your variables are:
A a b
>> whos
Name Size Bytes Class
A 3x4 96 double array
a 1x7 56 double array
b 1x100 800 double array
Grand total is 119 elements using 952 bytes
Para abrir la ventana correspondiente al espacio de trabajo procedemos de la siguiente manera:
desplegamos el men u Desktop (version 7) o View (versiones anteriores a la 7), que esta en el
24
El Entorno de Trabajo de MATLAB 25
men u principal de MATLAB, y all seleccionamos workspace. Cualquier otra ventana de las
disponibles en Desktop (View) se abre igual. Puede suceder que la ventana workspace, o
cualquier otra que se desee abrir, ya este abierta aunque no se vea. Ello es debido a que puede
estar oculta por alguna otra ventana. Para saberlo hay que ir a Window en el men u principal y
ver si esta all relacionada. Si no lo esta se abre como se ha mencionado mas arriba. Y si lo esta y
no se ve es que esta abierta pero oculta. En este caso, basta pinchar en el nombre de la ventana
que se quiere consultar (en nuestro caso workspace) para que pase a primer plano. Pegada a
la ventana de comandos nos aparecera la ventana del espacio de trabajo con la informacion que
proporciona el comando whos(ver la gura 3.1)
Figura 3.1: Ventana del Espacio de Trabajo.
Esta informacion puede ser interesante cuando se estan consumiendo grandes recursos para saber
la cantidad de memoria que se utiliza o, sobre todo, cuando se quieren conocer los nombres de
las variables que ya se han usado a n de no sobreescribir alguna que pueda ser importante.
Para cerrar la ventana del espacio de trabajo basta seleccionar, de nuevo, Workspace en el
men u Desktop (o View para versiones anteriores a la 7) o pinchar en el smbolo .
Para borrar todas las variables del espacio de trabajo se utiliza el comando clear.
3.1.1. Comandos save y load
En muchas ocasiones puede resultar interesante interrumpir el trabajo con MATLAB y poderlo
recuperar mas tarde en el mismo punto en el que se dejo (con las mismas variables denidas,
con los mismos resultados intermedios, etc.). Hay que tener en cuenta que al salir del programa
todo el contenido de la memoria se borra automaticamente. Tambien en este caso tenemos dos
formas de hacerlo: mediante los comandos save y load o eligiendo Save Workspace As ...
(para salvar el trabajo) o Import Data (para recuperarlo) en el men u File. Esta segunda forma
de hacerlo es muy intuitiva y no requiere comentarios. Los comandos save y load apenas los
usaremos en estas practicas y se puede encontrar todo lo relativo a ellos usando helpwin
El Entorno de Trabajo de MATLAB 26
matlab/general
3.1.2. El Comando diary
Los comandos save y load crean cheros binarios o ASCII con el estado de la sesion, pero
no sirven para guardar todo lo que hemos ido tecleando y ha ido saliendo en la ventana de
comandos. Existe una forma sencilla de almacenar todos estos datos en un chero de texto. Esto
se hace con el comando diary. El uso general es de la forma siguiente:
>> diary filename.txt
De esta forma se va escribiendo en el chero filename.txt todo lo que aparece, lnea tras
lnea, en la ventana de comandos de MATLAB con posterioridad a la utilizacion del comando.
Esto signica que si se quiere guardar todo lo que vaya apareciendo en la ventana de comandos
desde el principio, se debe utilizar este comando en cuanto se empieza la sesion. Ojo! si se
quieren salvar distintas sesiones se deben guardar en archivos con nombres diferentes. Salvo que
se especique el path completo en el que se quiere guardar el chero, este se salva (en Windows)
en el subdirectorio work del directorio principal de MATLAB (es decir, en la subcarpeta work
de la carpeta de instalacion de MATLAB) y en un sistema UNIX en el directorio home de cada
usuario.
Si se quiere interrumpir el proceso basta escribir
>> diary off
y para reanudarlo de nuevo
>> diary on
El simple comando diary pasa de on a off y viceversa. Para poder acceder al chero le-
name.txt con un editor de texto es necesario que diary este en off porque si no MATLAB
mantiene abierto el chero y no es accesible desde el exterior.
No obstante, en la ventana Command History que se puede abrir desde el men u Desktop se
guardan las sesiones anteriores (hasta cierto punto) especicadas por el da y la hora en que se
comenzaron.
3.1.3. Lneas de comentarios
Para MATLAB el caracter tanto por ciento ( %) indica comienzo de comentario. Cuando aparece
en una lnea de comandos, el programa supone que todo lo que va desde ese caracter hasta el
n de la lnea es un comentario y por lo tanto no lo lee. Raramente se usan en la ventana de
comandos, pero son muy utiles cuando se escriben programas (cheros M) tal y como veremos
mas adelante.
El Entorno de Trabajo de MATLAB 27
3.2. El Camino de b usqueda (SEARCH PATH) de MATLAB
El search path de MATLAB es una lista de directorios que se puede ver y modicar a partir
de la lnea de comandos. El comando path hace que se escriba el search path de MATLAB (el
resultado depende de en que directorio esta instalado MATLAB):
>> path
MATLABPATH
/home/Ion/matlab
/home/Ion/matlab/prog
/home/Ion/matlab/prog/clase/anal_matr
/usr/local/share/matlab6/toolbox/matlab/general
/usr/local/share/matlab6/toolbox/matlab/ops
/usr/local/share/matlab6/toolbox/matlab/lang
/usr/local/share/matlab6/toolbox/matlab/elmat
/usr/local/share/matlab6/toolbox/matlab/elfun
/usr/local/share/matlab6/toolbox/matlab/specfun
/usr/local/share/matlab6/toolbox/matlab/matfun
Para ver como MATLAB utiliza el search path supongase que se utiliza la palabra nombre1
en un comando. El proceso que sigue MATLAB para tratar de conocer que es nombre1 es el
siguiente:
1. Comprueba si nombre1 es una variable previamente denida por el usuario.
2. Comprueba si nombre1 es una funcion del usuario (hablaremos mas adelante de las fun-
ciones en MATLAB).
3. Comprueba si nombre1 es una funcion interna o intrnseca de MATLAB.
4. Comprueba si hay un chero llamado nombre1.mex o nombre1.m en el directorio actual
(de los cheros M hablaremos mas adelante, los cheros .mex tienen un signicado especial
para MATLAB del que no hablaremos aqu).
5. Comprueba si hay cheros llamados nombre1.mex o nombre1.m en los directorios incluidos
en el search path de MATLAB.
Estos pasos se realizan en el orden indicado. En cuanto se encuentra lo que se esta buscando se
detiene la b usqueda y se utiliza el chero que se ha encontrado. Si no se encuentra en todo el
proceso MATLAB produce un error:
>> nombre1
??? Undefined function or variable nombre1.
El Entorno de Trabajo de MATLAB 28
El Path Browser es el programa que ayuda a denir la lista de directorios donde MATLAB debe
buscar los cheros de comandos y las funciones, tanto del sistema como de usuario. Para abrir
el Path Browser se elige Set Path en el men u File. Una vez seleccionado se abre otra nueva
ventana en la que se muestra la lista de directorios en la que MATLAB buscara (MATLAB
search path) (ver Figura 3.2. Seleccionando Add Folder se pueden a nadir nuevos directorios.
Figura 3.2: Ventana con el path de MATLAB.
Se puede especicar, ademas que se incorporen al search path todos los subdirectorios del
directorio seleccionado. Tambien se pueden quitar directorios con la opcion Remove (es mejor
que ni lo intentes salvo que estes seguro/a de lo que haces). El nuevo directorio se puede a nadir al
comienzo o nal de la lista. Tal y como hemos mencionado, el orden de la lista es muy importante
porque reeja el orden de la b usqueda: si una funcion esta en dos directorios, se utilizara la que
primero se encuentre. Las operaciones realizadas se pueden salvar utilizando Save. En MATLAB
bajo Windows el listado de directorios salvado se hace permanente, de forma que la proxima vez
que se empieza una sesion de MATLAB las carpetas a nadidas apareceran en el path browser.
Este no es el caso en sistemas UNIX porque la posibilidad de escribir de forma permanente en
el directorio donde esta instalado MATLAB es exclusiva del administrador del sistema. Para
a nadir permanentemente unos directorios al search path en UNIX hay que hacerlo a traves
del chero startup.m del que hablaremos enseguida.
Tambien se puede incluir un directorio de b usqueda desde la lnea de comandos de MATLAB.
La forma de hacerlo depende del sistema operativo sobre el que este instalado MATLAB. Lo
mejor es utilizar el comando helpwin y consultar en matlab/general lo relativo a los comandos
path, addpath y rmpath.
El chero responsable de los parametros con los que se inicia cada sesion de MATLAB es matla-
brc.m que se encuentra en el subdirectorio toolbox/local de la instalacion de MATLAB (en
sistemas UNIX). En sistemas multiusuario, como picasso, solo puede modicarlo el administra-
dor. En Windows puede hacerlo cualquiera, pero es altamente recomendable que no lo hagas.
Ahora bien, cada usuario puede escribir un chero para que cada vez que se empiece una sesion
de MATLAB, este se inicie con los parametros que cada cual desee. Este chero se debe llamar
startup.m y debe estar, en sistemas UNIX, en el subdirectorio home/izaballa/matlab del
correspondiente ususario. Bajo Windows este chero se debe colocar en la subcarpeta work de
la carpeta donde esta instalado MATLAB (posiblemente C:\matlabr14 o algo as). Por ejemplo,
un chero startup.m que contenga las siguientes lneas:
El Entorno de Trabajo de MATLAB 29
cd \$HOME/matlab
format compact
addpath /usr/alu/julen/matlab/practicas -end
!texedit
disp(Kaixo)
hara lo siguiente cuando el usuario correspondiente (en este caso posiblemente Julen) empiece
una sesion de MATLAB en picasso:
Cambiara al directorio matlab, donde posiblemente se encuentren los trabajos de MATLAB
de Julen.
Utilizara el formato compact para exponer las salidas producidas por MATLAB (este
formato, como ya se dijo en el Captulo 2, suprime algunos saltos de lnea y presenta las
salidas mas compactas).
A nadira el directorio /usr/alu/julen/matlab al nal del search path.
Abrira el editor de openxt y
Escibira Kaixo como primera lnea en la ventana de comandos de MATLAB.
Bajo Windows el chero que producira algo parecido sera
cd c:\matlabr14\programas
format compact
addpath c:\matlabr14\programas -end
edit
disp(Kaixo)
De forma analoga, al abandonar la ejecucion de MATLAB con el comando quit se ejecuta
automaticamente el chero finish.m, siempre que se encuentre en alguno de los directorios del
search path. Este chero se puede utilizar por ejemplo para guardar el espacio de trabajo de
MATLAB (recuerda el comando save).
3.3. Manipulaci on de cheros
Los comandos dir, type, delete y cd implementan un conjunto de comandos del sistema opera-
tivo que corre por debajo de MATLAB. Los nombres con los que se corresponden en los sistemas
operativos MS-DOS-Windows y Unix se muestran en la siguiente tabla
MATLAB Windows UNIX
dir dir ls
type type cat
delete del o erase rm
cd cd cd
pwd pwd
El Entorno de Trabajo de MATLAB 30
Como en todos los sistemas operativos se pueden utilizar los caracteres comodn, pathnames y
nombres de los discos o directorios en la forma habitual. As los comandos
>> cd c:\matlab
>> delete *.dos
produciran, bajo MS-DOS o Windows, un cambio al directorio matlab que se encuentra en
el disco C (en caso de que tal directorio exista; si no, produce un mensaje de error). Y a
continuacion se borraran todos los cheros cuya extension es dos en dicho directorio.
En un sistema UNIX los discos habitualmente no se designan con las letras a, c, etc..., sino que
todos los directorios cuelgan del directorio raz: /. Por lo tanto, para cambiar al directiorio
/usr/alu/Julen/matlab deberemos utilizar el comando:
cd /usr/alu/Julen/matlab
Desde la ventana de comandos de MATLAB siempre se puede utilizar el comando pwd (como
en UNIX) para conocer en que directorio nos encontramos trabajando.
3.3.1. Ejecucion de Programas Externos
El cierre de exclamacion, !, indica que el resto de la lnea es un comando del sistema operativo.
Esto puede ser util porque permite ejecutar programas o invocar utilidades del sistema operativo
sin salir de MATLAB aunque rara vez se utiliza cuando el sistema operativo es Windows. Por
ejemplo, en UNIX de Solaris (que es el sistema operativo de picasso)
>> !textedit parabola.m &
es una orden para abrir el editor de cheros Text Editor que trae por defecto el sistema
Open windows de Solaris y cargar en el el chero parabola.m. El smbolo & le pide al sistema
operativo que lo ejecute en background; es decir, que deje la ventana de comandos de MATLAB
libre para seguir tecleando nuevas ordenes.
Captulo 4
Programacion en MATLAB
4.1. Empezando a programar en MATLAB
Lo interesante de MATLAB no es que realiza operaciones individuales sobre matrices y vectores,
sino que es un verdadero lenguaje de programacion con cantidad de funciones primitivas que
facilitan mucho la tarea de programar.
Un ejemplo muy simple es el siguiente: supongamos que queremos dibujar la parabola x = t
2
en el intervalo [2, 2]. El comando para dibujar curvas en el plano es plot. Este comando
admite muchos argumentos incluyendo la posibilidad de dibujar varias curvas al mismo tiempo.
Nosotros solo lo usaremos de la forma mas sencilla, pero si quieres saber todo lo que puede
hacer, puedes usar el comando helpwin graph2d plot. Por ahora la unica informacion
pertinente es que plot(t,x) dibuja el vector t versus el vector x. Esto quiere decir que si el
vector t es t = [t
1
t
2
t
3
. . .] y x = [x
1
x
2
x
3
. . .] entonces plot(t,x) dibuja una poligonal que
une los puntos (t
1
, x
1
), (t
2
, x
2
), t
3
, x
3
), etc. Si estos puntos estan sucientemente proximos el
efecto visual es una curva. As pues, para dibujar la curva x = t
2
tenemos que dar tres pasos:
denir el vector t,
denir el vector x = t
2
, y
ordenar a MATLAB que dibuje; i.e. teclear plot(t,x).
En este caso tan simple, se pueden dar las tres ordenes en la misma lnea de comando (recuerda
las dicultades que hay para usar en picasso y que este operador se puede sustituir por
power):
31
Programacion en MATLAB 32
>> t=-2:0.1:2; x=t.^2; plot(t,x)
o preferiblemente
>> t=linspace(-2,2);x=t.^2; plot(t,x)
Recuerda tambien que linspace(a,b) forma un vector de 100 componentes igualmente espa-
ciadas entre a y b. Si estos puntos no estan muy alejados entre s, cada componente del vector
esta muy proxima a la siguiente.
Otra posibilidad es escribir cada orden en una lnea:
>> t=linspace(-2,2);
>> x=t.^2;
>> plot(t,x)
Y hay una tercera posibilidad que es la mas interesante: escribir el conjunto de ordenes en un
chero, mediante un editor. Ya se ha dicho mas arriba como hacerlo tanto en picasso (mediante
!texedit) como en Windows (con edit) (ver Figura4.1 Esto es lo que se llama un script, un
Figura 4.1: Ventanas de comando y de edicion para escribir programas de MATLAB
programa (en este caso peque no) con c odigo ejecutable por MATLAB. La traduccion de script
en castellano es algo as como guion pero seguiremos utilizando el original en ingles.
Una vez escrito, se salvara con el nombre que se desee, por ejemplo parabola.m (la extension
.m es obligatoria, es la forma en que MATLAB sabe que es un chero con codigo ejecutable).
Para ejecutar las ordenes contenidas en este chero basta escribir su nombre en la ventana de
comandos; en este caso parabola:
>> parabola
El resultado es una nueva ventana, como la de la gura 4.2, que contiene la graca de la parabola.
Si a = (a
1
, . . . , a
n
) es un vector de n componentes plot(a) dibuja una poligonal uniendo los
Programacion en MATLAB 33
Figura 4.2: Ventana graca con la parabola producida por el script parabola.m
puntos (1, a
1
), (2, a
2
), . . . . Si lo que se quiere es se nalar con el smbolo los puntos (x
1
, y
1
),
(x
2
, y
2
),. . . , (x
n
, y
n
) pero sin unirlos a traves de una poligonal basta crear los vectores x e y y
usar el comando plot(x,y,*).
4.1.1. Operadores relacionales y logicos
Para programar en MATLAB se pueden usar bucles de la forma for . . . end, o bifurcaciones
de la forma while . . . end, if. . . end y switch . . . case Su sintaxis es como en cualquier otro
lenguaje de programacion. La idea es que cierta accion se realice dependiendo de si una condicion
es verdadera o no. La verdad o falsedad de estas condiciones se suele evaluar comparando dos
expresiones. Para ello existen operadores relacionales y logicos. MATLAB dispone de los
siguiente operadores relacionales:
< menor que
> mayor que
<= menor o igual que
>= mayor o igual que
== igual que
~= distinto que
En MATLAB los operadores relacionales pueden aplicarse a vectores y matrices, y eso hace que
tengan un signicado especial. Por ejemplo, dada una matriz A la comparacion abs(A)<eps
genera una matriz de 0s y 1s con el mismo tama no de A. El elemento (i, j) de dicha matriz es
1 si |A
ij
| < eps, siendo eps el epsilon de la maquina (=2.204e-16).
>> A=[-1 2 0; 0 -1 -3; 1 -1 0]
A =
-1 2 0
0 -1 -3
1 -1 0
Programacion en MATLAB 34
>> B=(abs(A)<eps)
B =
0 0 1
1 0 0
0 0 1
La sentencia any(abs(A)<eps) genera un vector de 0s y 1s; 0 si la correspondiente columna es
cero y 1 en caso contrario. Es decir, any responde true si alg un elemento no es cero y false si
todos son cero.
>> any(B)
ans =
1 0 1
Y la sentencia any(any(abs(A)<eps)) produce un 0 (i.e. false) si todos los elementos de
any(B) son cero y 1 (true) en caso contrario.
>> any(any(B))
ans =
1
As pues, la sentencia any(any(abs(A)<eps)) se puede utilizar como una condicion. Sera ver-
dadera si y solo si alg un elemento de A es, en modulo, mas peque no que eps. En caso contrario
es falsa.
Hay un operador logico similar: all. Responde true si todos los elementos del vector son distintos
de cero; en caso contrario, responde false. Con la matriz A de mas arriba:
>> all(A)
ans =
0 1 0
En efecto, la unica columna de A con todos sus elementos distintos de cero es la segunda. Pero
como ninguna columna de A tiene todos sus elementos menores que eps:
>> all(abs(A)<eps)
ans =
0 0 0
Vemos en estos ejemplos que al igual que en otros lenguajes de programacion, si una comparacion
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. Cuando
los operadores relacionales de MATLAB se aplican a dos matrices o vectores del mismo tama no,
la comparacion se realiza elemento a elemento, y el resultado es otra matriz de unos y ceros del
mismo tama no, que recoge el resultado de cada comparacion entre elementos. Por ejemplo:
Programacion en MATLAB 35
>> A=[1 2;0 3]; B=[4 2;1 5];
>> A==B
ans =
0 1
0 0
>> A~=B
ans =
1 0
1 1
>> A>2
ans =
0 0
0 1
Para saber si dos matrices son iguales, se puede usar la expresion isequal(A,B)
>> isequal(A,B)
ans =
0
La expresion isequal(A,B) es equivalente a all(all(A==B)). Por otra parte, isequal es una de
las muchas funciones logicas que empiezan por is. He aqu una seleccion de ellas. Para obtener
un listado completo escribe doc is tras el prompt de MATLAB
ischar verdadero si la entrada es un vector de caracteres
isempty verdadero si la entrada es un vector vaco
isequal verdadero si los vectores son iguales
isfinite detecta los elementos nitos de un vector
isfloat verdadero si el vector es de elementos en coma otante
isinf detecta los elementos innitos de un vector
isinteger verdadero si el vector es de n umeros enteros
isnan detecta los elementos que son NaN en un vector
isnumeric veradero si el vector es de n umeros (no de caracteres)
isprime detecta los n umeros primos en un vector
is real verdadero si todos los n umeros del vector son reales
isvector verdadero si se trata de un vector
Algunos ejemplos adicionales con la matriz A de mas arriba
>> A
A =
1 2
0 3
>> isfinite(A)
Programacion en MATLAB 36
ans =
1 1
1 1
>> isnumeric(A)
ans =
1
>> isreal(A)
ans =
1
>> isvector(A)
ans =
0
Ademas una condicion puede constar de una o mas operaciones relacionales.

Estas normalmente
estan concatenadas con expresiones logicas cuya verdad o falsedad sigue las leyes de la logica
formal. Los operadores logicos de MATLAB son los siguientes:
& y
| o
~ negacion logica
xor o excluyente
any verdad si cualquiera de los elementos de un vector es no cero
all verdad si todos lo elemntos de un vector son no cero
Algunos ejemplos
>> x=[-1 1 1]; y=[ 1 2 -3];
>> x>0, y>0
ans =
0 1 1
ans =
1 1 0
>> x>0 & y>0
ans =
0 1 0
>> x>0 | y>0
ans =
1 1 1
>> xor(x>0,y>0)
ans =
1 0 1
>> any(x>0)
ans =
1
>> all(x>0)
Programacion en MATLAB 37
ans =
0
>>
Para terminar con los operadores logicos estudiamos otro comando muy util: find. Este comando
devuelve los ndices (los lugares que ocupan) los elementos no nulos de un vector. Por ejemplo
>> x=[-3 1 0 -inf 0]
x =
-3 1 0 -Inf 0
>> f=find(x)
f =
1 2 4
Una primera aplicacion es extraer de x los elementos no nulos:
>> x(f)
ans =
-3 1 -Inf
Podemos extraer los elementos nitos
> x(find(isfinite(x)))
ans =
-3 1 0 0
o reemplazar las componentes negativas por cero:
>> x(find(x<0))=0
x =
0 1 0 0 0
Cuando find se aplica a una matriz se hace mirandola como un vector; es decir al vector A(:)
que se obtiene -recordemos- poniendo las columnas de A una debajo de otra. Por ejemplo
>> A=[ 4 2 16; 12 4 3], B=[12 3 1; 10 -1 7]
A =
4 2 16
12 4 3
B =
12 3 1
10 -1 7
>> C=A<B
Programacion en MATLAB 38
C =
1 1 0
0 0 1
>> C(:)
ans =
1
0
1
0
0
1
>> find(A<B)
ans =
1
3
6
Otro posible uso de find con matrices es [i,j]=find(A) que devuelve vectores i y j con los
ndices de las las y columnas de A distintos de cero, respectivamente. As
>> [i,j]=find(A<B)
i =
1
1
2
j =
1
2
3
nos dice que en las posiciones (1, 1), (1, 2) y (2, 3) estan los elementos de A que son menores que
los de B.
4.1.2. Bifurcaciones y Bucles
Tal y como hemos dicho mas arriba las bifurcaciones de MATLAB son while . . . end, if. . . end
y switch . . . case. Este ultimo tipo de bifurcaciones no lo vamos a comentar; se puede consultar
la ayuda de MATLAB para saber como funciona. Tambien se dispone de bucles for . . . end.
La forma mas simple de una bifurcacion del tipo if. . . end es la siguiente
if condicion
sentencias
end
Programacion en MATLAB 39
Existe tambien la bifurcacion m ultiple, 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 % opcion por defecto para cuando no se cumplan las condiciones 1,2,3
bloque4
end
donde la opcion por defecto else puede ser omitida: si no esta presente no se hace nada en caso
de que no se cumpla ninguna de las condiciones que se han chequeado.
Exponemos un ejemplo a continuacion. Recordemos que los operadores logicos se pueden com-
binar con los relacionales para poder comprobar el cumplimiento de condiciones m ultiples.
Ejemplo 4.1.1 .- El siguiente programa comprueba si un n umero es positivo, si no lo es produce
un mensaje de error con el comando disp que sirve para escribir mensajes en la pantalla (mas
adelante se explica con detalle la accion de este comando). A continuacion comprueba si, siendo
positivo, es par . La orden rem(p,q) calcula el resto de la division eucldea de p por q. Si el
n umero es positivo lo divide por 2 y en caso contrario, le suma 1 y el resultado lo divide por 2.
if n<0 | n==0
disp(Introduce un numero positivo);
elseif rem(n,2)==0
a=n/2;
else
a=(n+1)/2
end
Naturalmente la condicion n<0 | n==0 podra sustituirse por la mas compacta n<=0. Se ha
escrito de la forma expuesta para hacer uso de una condicion con dos relaciones y un operador
logico.
SENTENCIA WHILE.- La estructura del bucle while es muy similar a la de cualquier otro
lenguaje de programacion. Su sintaxis es la siguiente:
while condicion
sentencias
end
Programacion en MATLAB 40
donde condicion puede ser una expresion vectorial o matricial. Las sentencias se siguen ejecu-
tando mientras haya elementos distintos de cero en condicion; es decir, mientras haya alg un
o algunos elementos true. El bucle se termina cuando todos los elementos de condicion son
false (es decir, cero).
Ejemplo 4.1.2 .- En el siguiente ejemplo se ejecutan una serie de operaciones sobre un cierto
n umero n mientras este se mantenga mayor que 1. Concretamente, si n es par se divide por 2 y
si es impar se multiplica por 3 y se le suma 1:
while n>1
if rem(n,2)==0
n=n/2
else
n=3*n+1
end;
end;
Crees que este proceso tiene n cualquiera que sea el valor de n? (Conjetura de Collatz, misterio
de Siracusa, problema de Kakutani, algoritmo de Hasse o problema de Ulam).
Finalmente, los bucles del tipo for . . . end tienen la siguiente sintaxis:
for variable= expresion
sentencias
end
Habitualmente la expresion es un vector de la forma i:s:j y las sentencias se ejecutan sucesi-
vamente con la variable igual a cada elemento de la expresion. Por ejemplo, para sumar los 25
primeros terminos de la serie
1
n
:
>> n=0;
>> for i=1:25
n=n+1/i;
end
>> n
n =
3.8160
Otra forma de denir una expresion es usando notacion vectorial:
>> for x=[pi/6 pi/4 pi/3]
disp([x, sin(x)])
end
0.5236 0.5000
0.7854 0.7071
1.0472 0.8660
Programacion en MATLAB 41
Y por supuesto, se pueden encajar m ultiples bucles for. . . end unos dentro de otros. El siguiente
codigo proporciona una matriz simetrica 5 5 con el elemento
i
j
en la posicion (i, j) para i j:
>> n=5; A=eye(n);
>> for j=2:n
for i=1:j-1
A(i,j)=i/j;
A(j,i)=i/j;
end
end
>> A
A =
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 1.0000 0.6667 0.5000 0.4000
0.3333 0.6667 1.0000 0.7500 0.6000
0.2500 0.5000 0.7500 1.0000 0.8000
0.2000 0.4000 0.6000 0.8000 1.0000
4.1.3. Presentaci on de los resultados
Si en MATLAB hacemos
>> v=1:5
la respuesta es la exposicion del resultado
v =
1 2 3 4 5
A veces, sin embargo se quiere disponer de un formato de salida un poco mas estructurado. Por
ejemplo se quiere mostrar una tabla de los valores de sen(2t) para 10 valores de t igualmente
espaciados en el intervalo [0,1].Con el comando disp lo podemos hacer facilmente. Escribimos
un chero con el siguiente contenido
t=linspace(0,1,10);
y=sin(2*pi*t);
disp( t sen(2*pi*t) )
disp(--------------------------)
disp([t y])
Lo salvamos con el nombre, por ejemplo, seno2pit.m en nuestro directorio de trabajo de
MATLAB, y lo ejecutamos en la ventana de comandos:
Programacion en MATLAB 42
>> seno2pit
t sen(2*pi*t)
--------------------------
0 0
0.1111 0.6428
0.2222 0.9848
0.3333 0.8660
0.4444 0.3420
0.5556 -0.3420
0.6667 -0.8660
0.7778 -0.9848
0.8889 -0.6428
1.0000 -0.0000
El comando disp lo que hace es mostrar en pantalla el contenido de un vector (o matriz). Lo
que sucede es que hay vectores de n umeros como
>> v=[1 2 3]
v =
1 2 3
y hay vectores de letras o caracteres o strings como
>> v=ke kosa
v =
ke kosa
As, una frase entre acentos es un vector de caracteres. Por eso en el programa de mas arriba
escribimos disp( t sen(2*pi*t) ) para que en la pantalla aparezca exactamente la frase
t sen(2*pi*t) .
Si se quieren conseguir formatos mas especiales se puede usar el comando sprintf. Su uso en
MATLAB es muy parecido al del comando homonimo en lenguaje C.
4.2. Scripts y Funciones
El nombre que se utiliza para los programas en MATLAB es el de M-les o cheros M. Hay
dos tipos de cheros M: los scripts y las funciones. Son el equivalente a programas, funciones,
subrutinas o procedimientos de otros lenguajes de programacion como FORTRAN, C, Pascal o
Java. Los cheros M son, por lo tanto, secuencias de comandos de MATLAB que se almacenan
en cheros y que tienen alg un proposito concreto. Un chero M puede hacer referencia a otros
cheros M e incluso a s mismos (es decir, esta permitida la autorecursividad). Los cheros M
son especialmente apropiados para
Programacion en MATLAB 43
experimentar con algoritmos escribiendoles en un chero sobre el que poder hacer correc-
ciones en vez de reescribir cada vez que se quiere experimentar una larga lista de comandos,
guardar el resultado de un experimento numerico, como una lista de comandos y variables
que producen un determinado resultado numerico o graco,
construir programas que pueden ser utilizados con posterioridad varias veces,
o, simplemente, intercambiar con alg un amigo o colega cheros de mutuo interes.
En la pagina web de Mathworks mencionada en la Introduccion pueden encontrarse numerosos
cheros M escritos con distintos prop ositos, desde puramente computacionales a didacticos o
por puro placer.
Hay dos tipos de cheros M:
Sripts o cheros de comandos. Por lo general no tienen argumentos de entrada ni de salida
y operan con las variables del espacio de trabajo. Es decir, recogen variables ya existentes e
interact uan con ellas para producir resultados numericos o gracos y quiza nuevas variables.
Funciones. Deben contener una primera lnea en la que aparece la palabra function.
Se diferencian de los scripts en que aceptan entradas y devuelven salidas. Las variables
internas son locales a la funcion (salvo que sean declaradas como global)
Ya hemos visto en la seccion anterior como hacer cheros M de tipo script. Simplemente son
cheros que ejecutan sucesivamente varios comandos de MATLAB con un objetivo especco
y siempre que se ejecutan producen el mismo resultado. Volveremos sobre ellos mas adelante
para recalcar su diferencia con el otro tipo de cheros M, y que son los mas importantes:
las funciones. Las funciones en MATLAB guardan una gran similitud con las funciones en
lenguaje C o Pascal. Lo que exponemos a continuacion esta inspirado en el primer captulo del
libro Introduction to Scientic Computation de Charles F. van Loan.
Sabemos de calculo elemental que la serie de Taylor
T
n
(x) =
n

k=0
x
k
k!
aproxima la funcion exponencial, e
x
, cerca de x = 0. Nuestro objetivo es estudiar esta aproxima-
cion. Es decir, cuan cerca esta T
n
(x) de e
x
para los diversos valores de n? Teoricamente cuanto
mayor es n mas cerca esta T
n
(x) de e
x
. Para que valores de n nuestro ordenador no distingue
entre T
n
(x) y e
x
?. Para ello damos por bueno el calculo que hace MATLAB de la exponencial y
creamos una funcion de MATLAB que nos devuelva el valor de T
n
(x) en funcion de x y n. Esta
funcion sera la siguiente:
function y= miexp1(x,n)
%
%Precondiciones: acepta dos valores x=numero real y
Programacion en MATLAB 44
% n=entero positivo.
%
%Postcondiciones: devuelve en y la aproximacion de
% orden n de la serie de Taylor de exp(x).
y=1;
t=1;
for k=1:n
t=x*t/k;
y=y+t;
end
Al igual que con los scripts debemos escribir estas lneas en un chero de texto y salvarlo con
el nombre miexp1.m en un directorio (o carpeta) que este en el path de MATLAB; por ejemplo,
en nuestro directorio de trabajo. Debe observarse que ahora el nombre del chero solo puede ser
el que hemos dado a la funcion. Debemos tener cuidado, ademas, con que el nombre de la funcion
no coincida con un nombre ya existente en el path de MATLAB. Como las distribuciones de
MATLAB incorporan innidad de funciones debemos elegir nombres signicativos para nosotros
pero no demasiado standard; por ejemplo, podemos empezar los nombres de nuestras funciones
con el prejo mi. . . o escoger un nombre en euskera, etc.
Al escribir una funcion en MATLAB debes seguir unas pocas, simples e importantes reglas:
El chero debe empezar con la palabra function y tiene la siguiente estructura
function variables de salida= Nombre de la funcion(variables de entrada)
%
% Comentarios que denen completamente las variables que deben pasarse a la funcion
% (variables de entrada) y el resultado que produce la funcion (variables de salida)
%
cuerpo de la funcion: comanos de MATLAB
En alg un sitio del cuerpo de la funcion se debe pasar a la variable de salida el valor deseado.
Los comentarios que denen completamente la funcion deben hacerse inmediatamente
despues de la denicion de la funcion. Esto es importante porque cuando en la ventana
de comandos se escriba help nombredelafuncion, MATLAB respondera escribiendo los
comentarios que ah se escriban. Opcionalmente, y es recomendable hacerlo, se pueden
escribir comentarios en otros lugares del cuerpo de la funcion para claricar el objetivo de
uno o varios de los comandos que se utilizan. Estos comentarios deben ir siempre precedidos
del smbolo %.
Las variables de entrada y salida son parametros formales (es decir, letras). Cuando se
llama a la funcion para que realice la accion que se desea, deben ser sustitudos por
parametros reales (es decir, n umeros, vectores, matrices,...). Por ejemplo, la funcion miexp1
debe ser llamada con dos n umeros concretos. x=miexp1(0.1,3) devolvera en la variable x
el valor de la aproximacion de Taylor de tercer orden en 0,1.
Programacion en MATLAB 45
Las variables que se denan en el interior de la funcion (en nuestro caso t y k) son variables
locales. Puede haber otras con el mismo nombre en el espacio de trabajo de MATLAB sin
ning un problema.
El chero que contiene la funcion debe estar en el path de MATLAB.
Lo importante de las funciones de MATLAB, sean nativas o creadas por nosotros mismos, es
que pueden ser llamadas por cualquier otro programa de MATLAB, bien sea un script u otra
funcion. Por ejemplo, si queremos las gracas para cuatro valores de n = 4, 8, 16, 20 del error
relativo que se comete al aproximar e
x
por T
n
(x) en el intervalo [-1,1], podemos crear un script
como el que sigue
m=100;
x=linspace(-1,1,m);
y=[];
exacto=exp(x);
k=0;
for n=[4 8 16 20]
for i=1:m
y(i)=miexp1(x(i),n);
end
errorrel=abs(exacto-y)./exacto;
k=k+1;
subplot(2,2,k)
plot(x,errorrel)
title(sprintf(n=%2.0f,n))
end
Si escribimos estas lneas en un chero .m (por ejemplo, smiexp1.m) tenemos un script que al
ejecutarlo en MATLAB
>> smiexp1
nos produce cuatro gracas (gura 4.3), cada una correspondiente a un valor de n, con el
error relativo de la aproximacion. Observese el efecto del comando subplot(n,m,p). Crea una
matriz de nm guras y asigna a la p-esima el siguiente comando plot. As p=1 corresponde a
la gura en al posicion (1, 1), p=2 a la gura en la posicion (1, 2), etc. Todos los demas comandos
en el script ya son conocidos.
En el script hemos creado el vector x=linspace(-1,1,100) de 100 componentes y se lo hemos
pasado a la funcion exponencial obteniendo otro vector de 100 componentes que hemos llamado
exacto. Sin embargo, para calcular T
n
(x) hemos tenido que hacerlo componente a componente.
Ello es debido a que la funcion miexp1 solo acepta escalares y devuelve escalares. MATLAB
esta pensado para trabajar con vectores, y como veremos enseguida lo hace mas rapido. Conviene
que modiquemos nuestra funcion para que admita vectores y produzca vectores. La modicacion
es muy sencilla: hay que redenir y y t para que sean vectores del mismo tama no que x y cuyas
componentes sean todas igual a 1. Ademas hay que usar el producto componente a componente
entre x y t.
Programacion en MATLAB 46
1 0.5 0 0.5 1
0
0.005
0.01
0.015
0.02
n= 4
1 0.5 0 0.5 1
0
1
2
3
4
5
6
7
x 10
6
n= 8
1 0.5 0 0.5 1
0
2
4
6
8
x 10
15
n=16
1 0.5 0 0.5 1
0
1
2
3
4
5
6
7
x 10
16
n=20
Figura 4.3: Error relativo al aproximar por T
n
(x)
function y= miexp2(x,n)
%
%Precondiciones: acepta dos valores x=vector de numeros reales y
% n=entero positivo.
%
%Postcondiciones: devuelve en el vector y la aproximacion de
% orden n de la serie de Taylor de exp(x).
y=ones(size(x));
t=ones(size(x));
for k=1:n
t=x.*t/k;
y=y+t;
end
Esto simplica mucho el correspondiente script para hallar el error relativo:
x=linspace(-1,1,100);
exacto=exp(x);
errorrel=abs(exacto-miexp2(x,n))./exacto
El resto del script sera igual que en el caso anterior.
As pues las variables de entrada y de salida pueden ser cualquier tipo de variable soportada por
MATLAB. No solo eso, pueden aparecer mezcladas. Por ejemplo las variables de entrada de la
funcion miexp2 son un vector y un n umero. Tambien las variables de salida pueden ser varias
Programacion en MATLAB 47
y de distintos tipos. Por ejemplo, la siguiente funcion calcula el tiempo que tarda MATLAB en
crear (no escribir en pantalla, sino poner en la memoria del ordenador) m matrices aleatorias de
tama no n n y nos proporciona la ultima matriz creada. Es un ejemplo un poco articial pero
sirve para ilustrar las ideas que estamos comentando: la salida es un vector formado por dos
variables, la primera es un n umero y la segunda una matriz.
function [t,A]=tgmaf(n,m)
% Precond: dos enteros positivos n y m,
% Postcond: el tiempo,t, que tarda MATLAB en generar
% m matrices aleatorias nxn y la ultima matriz generada, A
%ponemos en marcha el reloj
t0=clock;
for j=1:m-1
rand(n);
end
A=rand(n);
%Paramos el reloj
t1=clock;
% etime cuenta el tiempo transcurrido
t=etime(t1,t0);
Utilizamos aqu dos nuevos comandos (en realidad como todos los comandos de MATLAB, se
trata de funciones del propio sistema, bien sean precompiladas o denidas a partir de cheros
M): clock asigna a la variable correspondiente la hora del sistema y etime cuenta el tiempo (en
segundos) que ha pasado entre dos instantes obtenidos con clock.
Podemos hacer uso de estas dos funciones para comprobar que MATLAB emplea menos tiempo
cuando trabaja con vectores como un todo que cuando trabaja componente a componente. El
siguiente script nos sirve para comprobar el tiempo que tarda MATLAB en calcular el valor de
T
n
(x) para un determinado valor de n y para vectores x de distinto tama no con componentes
en el intervalo [-1,1]:
disp(length(x) miexp1(x) miexp2(x))
disp( tiempo tiempo )
disp(------------------------------------------------)
for k=1000:1000:10000
x=linspace(-1,1,k);
ti=clock;
y=[];
for i=1:k
y(i)=miexp1(x(i),17);
end
tf=clock;
t1=etime(tf,ti);
ti=clock;
Programacion en MATLAB 48
y=miexp2(x,17);
tf=clock;
t2=etime(tf,ti);
disp(sprintf(%6.0f %16.2f %16.4f ,k ,t1 ,t2))
end
El resultado de este script depende de cada ordenador porque la rapidez con la que MATLAB
realiza las operaciones no solo depende del codigo que se emplee sino, sobre todo, de las carac-
tersticas del propio ordenador (procesador, memoria, bus,. . . ). La salida debe parecerse a una
tabla con la siguiente forma
length(x) miexp1(x) miexp2(x)
tiempo tiempo
------------------------------------------------
1000 0.11 0.0006
2000 0.20 0.0007
3000 0.25 0.0010
4000 0.35 0.0013
5000 0.43 0.0016
6000 0.52 0.0020
7000 0.61 0.0023
8000 0.71 0.0025
9000 0.81 0.0029
10000 0.93 0.0033
Una ultima observacion. Se podra querer tener tablas comparativas para diversos valores de n
y de la longitud de x. Para conseguirlo bastara convertir el script anterior en una funcion:
function fetmiexp(k,n)
% Precond: un vector de enteros k y un entero n
%
% Postcond: fetmiexp produce una tabla
% que compara el tiempo que se tarda en
% calcular la aproximacion de exp(x) mediante
% la aproximacion de orden n de la serie de Taylor
% para un vector x de k componentes. Cada fila de
% la tabla corresponde a cada componente de k.
%
disp(length(x) miexp1(x) miexp2(x))
disp( tiempo tiempo )
disp(------------------------------------------------)
for j=k
x=linspace(-1,1,j);
ti=clock;
Programacion en MATLAB 49
y=[];
for i=1:j
y(i)=miexp1(x(i),17);
end
tf=clock;
t1=etime(tf,ti);
ti=clock;
y=miexp2(x,17);
tf=clock;
t2=etime(tf,ti);
disp(sprintf(%6.0f %16.2f %16.4f ,j ,t1 ,t2))
end
Si en MATLAB hacemos
>> fetmiexp(1000:1000:10000,17)
obtenemos la misma tabla de mas arriba. La ventaja es que ahora podemos probar con diversos
valores de k y n sin tener que modicar el script cada vez.
Debe notarse que no hay variable de salida. Esta funcion produce un resultado: una tabla con
la comparativa de tiempos pero no almacena esta salida en ninguna variable. El recproco, que
una funcion tenga variables de salida pero no de entrada, tambien es posible pero muy poco
frecuente.
Captulo 5
N umeros complejos y polinomio
MATLAB trabaja indistintamente con n umeros reales o complejos, pero hay algunas propie-
dades especcas de estos ultimos que hay que tener en cuenta. Polinomios son vectores cuyas
componentes son los coecientes del polinomio. Sumar polinomios es como sumar vectores, pero
tambien se puede multiplicar y dividir polinomios. MATLAB tiene una serie de funciones que
ayudan a trabajar con polinomios comodamente.
5.1. N umeros Complejos
El comando abs(a) devuelve el valor absoluto o el modulo del n umero a seg un que este sea real
o complejo. De la misma forma abs(A) devuelve una matriz cuyos elementos son los modulos
o los valores absolutos de los elementos de A seg un que estos sean n umeros complejos o reales.
Ademas, como ya se dijo en el Captulo 2, MATLAB no produce un error si se le pide la raz
cuadrada o el logaritmo de un n umero negativo sino que devuelve el correspondiente n umero
complejo. La unidad imaginaria es una constante predenida en MATLAB. Las letras que la
designan son bien i, bien j.
Hay que tener cuidado con la trasposicion. Si A es una matriz de n umeros complejos entonces
A

es la transpuesta conjugada de A (lo que nosotros solemos designar como A

). Si queremos
la transpuesta de A debemos usar A.

. Por ejemplo
>> A=[1-i 2+i; 3+i i]
A =
1.0000 - 1.0000i 2.0000 + 1.0000i
50
N umeros complejos y polinomio 51
3.0000 + 1.0000i 0 + 1.0000i
>> Atc=A
Atc =
1.0000 + 1.0000i 3.0000 - 1.0000i
2.0000 - 1.0000i 0 - 1.0000i
>> At=A.
At =
1.0000 - 1.0000i 3.0000 + 1.0000i
2.0000 + 1.0000i 0 + 1.0000i
Finalmente, el comando plot cuando se emplea con n umeros complejos tiene un signica-
do especial: Si y es un vector de n umeros complejos la sentencia plot(y) es equivalente a
plot(real(y),imag(y)).
5.2. Calculo con Polinomios
Tal y como hemos dicho Para MATLAB un polinomio es el vector de sus coecientes. Por
ejemplo, el polinomio:
p(x) = x
4
8x
2
+ 6x 10
se puede representar mediante el vector
>>[1, 0, -8, 6, -10].
MATLAB puede realizar diversas operaciones sobre el, como por ejemplo evaluarlo para un
determinado valor de x (funcion polyval()) y calcular las races (funcion roots()):
>> pol=[1 0 -8 6 -10]
pol =
1 0 -8 6 -10
>> roots(pol)
ans =
-3.2800 2.6748 0.3026 + 1.0238i 0.3026 - 1.0238i
>> polyval(pol,1)
N umeros complejos y polinomio 52
ans =
-11
Hay una funcion similar a polyval pero para matrices: la funcion plyvalm. Dada una matriz
A y polinomio p() = pol, la funcion polyvalm(pol,A) devuelve la matriz p(A). As con el
polinomio pol=[1 0 -8 6 -10] denido mas arriba:
>> A=ceil(rand(3,3)*5-7)
A =
-2 -4 -4
-5 -2 -6
-3 -3 -2
>> polyvalm(pol,A)
ans =
3130 2896 3688
3818 3526 4476
2568 2370 2998
Para calcular el producto de polinomios MATLAB utiliza una funcion llamada conv() (de
producto de convolucion). En el siguiente ejemplo se va a ver como se multiplica un polinomio
de segundo grado por otro de tercer grado:
>> pol1=[1 -2 4]
pol1 =
1 -2 4
>> pol2=[1 0 3 -4]
pol2 =
1 0 3 -4
>> pol3=conv(pol1,pol2)
pol3 =
1 -2 7 -10 20 -16
Para dividir polinomios existe otra funcion llamada deconv(). Las funciones orientadas al calculo
con polinomios son las siguientes:
poly(A) polinomio caracterstico de la matriz A
N umeros complejos y polinomio 53
poly(v) polinomio cuyas races son los elementos de v
roots(pol) races del polinomio pol
polyval(pol,x) evaluacion del polinomio pol para el valor de x. Si x es un
vector, pol se eval ua para cada elemento de x
polyvalm(pol,A) evaluacion del polinomio pol de la matriz A
conv(p1,p2) producto de convolucion de dos polinomios p1 y p2
[c,r]=deconv(p,q) division del polinomio p por el polinomio q. En c se devuelve
el cociente y en r el resto de la division
residue(p1,p2) descompone el cociente entre p1 y p2 en suma de fracciones
simples (ver >> help residue)
polyder(pol) calcula la derivada de un polinomio
polyder(p1,p2) calcula la derivada del producto de polinomios
polyfit(x,y,n) calcula los coecientes de un polinomio p(x) de grado n que
se ajusta a los datos (x
i
, y
i
), en el sentido de los mnimos
cuadrados.
Existen tambien algunas funciones orientadas a la interpolacion polinomial que no vamos a
considerar aqu. Si quieres saber algo sobre ellas utiliza la ayuda.
Apendice A
Funciones incorporadas en MATLAB
En este apendice se relacionan algunas (muchas) funciones nativas de MATLAB. Algunas de
ellas estan incorporadas al n ucleo de MATLAB y otras son cheros M. Nosotros no vamos
a distinguir entre ambos tipos de funciones. Las hemos clasicado de acuerdo a su proposito
general pero algunas de ellas podran estar en varios grupos.
Se describe brevemente lo que hacen y en muchos casos tanto las variables de entrada (los tipos
de variables que aceptan) como las de salida (lo que producen) son mas de las que se relacionan.
Es decir, se explica su objetivo principal pero pueden hacer mas cosas de las que se mencionan.
Por ejemplo, si v = [1 2 3 4] entonces
>> v=[1 2 3 4];
>> diag(v)
ans =
1 0 0 0
0 2 0 0
0 0 3 0
0 0 0 4
Es decir, diag(v) devuelve la matriz diagonal cuya diagonal es el vector v. Pero
>> diag(v,1)
ans =
0 1 0 0 0
0 0 2 0 0
0 0 0 3 0
0 0 0 0 4
0 0 0 0 0
devuelve una matriz 5 5 cuya superdiagonal es v.
Tanto para una explicacion mas detallada de cada una de las funciones como de toda su poten-
cialidad se recomienda utilizar el sistema de ayuda. Conociendo el nombre de la funcion lo mas
54
Funciones incorporadas en MATLAB 55
rapido es utilizar el comando help funcion.
A.1. Funciones que act uan sobre escalares
Hay funciones matematicas elementales que operan de modo escalar. Estas funciones, que com-
prenden las funciones matematicas trascendentales y otras funciones basicas, act uan sobre cada
elemento de la matriz como si se tratase de un escalar. Se aplican de la misma forma a esca-
lares, vectores y matrices. Algunas de las funciones de este grupo son las que se relacionan a
continuacion. Se debe entender que si el argumento o argumentos sobre los que act ua la funcion
son matrices o vectores entonces dicha funcion act ua termino a termino. As, si x es una matriz,
sin(x) devuelve una matriz cuyos elementos son los senos de los elementos de la matriz x.
TRIGONOM

ETRICAS
sin(x) seno
cos(x) coseno
tan(x) tangente
cot(x) cotangent
sec(x) secante
csc(x) cosecante
asin(x) arco seno
acos(x) arco coseno
atan(x) arco tangente (devuelve un angulo entre /2 y +/2)
atan2(x,y) arco tangente (devuelve un angulo entre y +); se le
pasan 2 argumentos, proporcionales al seno y al coseno
acot(x) arco cotangente
asec(x) arco secante
acsc(x) arco cosecante
sinh(x) seno hiperbolico
cosh(x) coseno hiperbolico
tanh(x) tangente hiperbolica
coth(x) cotangente hiperbolica
sech(x) secante hiperbolica
csch(x) cosecante hiperbolica
asinh(x) arco seno hiperbolico
acosh(x) arco coseno hiperbolico
atanh(x) arco tangente hiperbolica
acoth(x) arco cotangente hiperbolica
asech(x) arco secante hiperbolica
acsch(x) arco cosecante hiperbolica
Funciones incorporadas en MATLAB 56
EXPONENCIALES
exp(x) funcion exponencial
log(x) logaritmo natural (neperiano)
log10(x) logaritmo decimal
log2(x) logaritmo en base 2
sqrt(x) raz cuadrada
realpow(x) potencia que da error si x no es real
reallog(x) logaritmo neperiano de n umeros reales
realsqrt(x) raz cuadrada de n umeros mayores o iguales a cero
COMPLEJAS
abs(x) valor absoluto o modulo si x es un n umero complejo
angle(x) argumento del n umero complejo x
complex(x,y) devuelve el n umero complejo x +iy
conj(x) complejo conjugado
real(x) parte real
imag(x) parte imaginaria
isreal(x) devuelve 1 si x es real y 0 si x tiene parte imaginaria
DE REDONDEO Y RESTO
sign(x) devuelve -1 si x < 0, 0 si x = 0 y 1 si x > 0. Aplicada a un
n umero complejo, devuelve un vector unitario en la misma
direccion que x
rem(x,y) resto de la division de x entre y. Los argumentos son n umeros
reales (no necesariamente enteros)
mod(x,y) similar a rem (Ver diferencias con el sistema de ayuda)
round(x) redondeo hacia el entero mas proximo
fix(x) redondea hacia el entero mas proximo a 0
floor(x) valor entero mas proximo hacia
ceil(x) valor entero mas proximo hacia +
gcd(x,y) maximo com un divisor
lcm(x,y) mnimo com un m ultiplo
Funciones incorporadas en MATLAB 57
Hay otras funciones escalares que pueden ser consultadas a traves de la ayuda en el apartado
matlab/specfun.
A.2. Funciones que act uan sobre vectores
Las siguientes funciones act uan sobre vectores. Aqu se presentan solo algunas funciones. Una
relacion completa de todas las funciones soportadas por MATLAB se puede obtener consultando
la ayuda: matlab/datafun.
length(x) devuelve la longitud del vector x
[vM,pM]=max(x) maximo elemento de un vector. Devuelve el valor maximo
vM y la posicion que ocupa pM en el vector
[vm, pm]=min(x) mnimo elemento de un vector. Devuelve el valor mnimo y
la posicion que ocupa
sum(x) suma de los elementos de un vector
cumsum(x) devuelve el vector suma acumulativa de los elementos de un
vector. Es decir, el primer elemento del nuevo vector es el
mismo que el de x, el segundo es la suma de los dos primeros
de x, el tercero es la suma de los tres primeros vectores de
x, y as sucesivamente
mean(x) valor medio de los elementos de un vector
std(x) desviacion tpica
prod(x) producto de los elementos de un vector
cumprod(x) devuelve el vector producto acumulativo de los elementos de
un vector (como en cumsum pero respecto al producto)
[y,i]=sort(x) ordenacion de menor a mayor de los elementos de un vector
x. Devuelve el vector ordenado y, y un vector i con las posi-
ciones iniciales en x de los elementos en el vector ordenado
En realidad estas funciones se pueden aplicar tambien a matrices , pero en ese caso se aplican
por separado a cada columna de la matriz, dando como valor de retorno un vector resultado de
aplicar la funcion a cada columna de la matriz considerada como vector. Si estas funciones se
quieren aplicar a las las de la matriz basta aplicar dichas funciones a la matriz traspuesta.
A.3. Funciones que act uan sobre matrices
Las siguientes funciones exigen que el/los argumento/s sean matrices. En este grupo aparecen
algunas de las funciones mas utiles y potentes de MATLAB. No estan todas las que soporta
MATLAB. La relacion completa se puede consultar a traves de la ayuda: matlab/elmat y
matlab/matfun principalmente. Se clasicaran en varios subgrupos:
Funciones incorporadas en MATLAB 58
FUNCIONES MATRICIALES ELEMENTALES
A calcula la traspuesta (conjugada) de la matriz A
A. calcula la traspuesta (sin conjugar) de la matriz A. Si la
matriz A es de n umeros reales A. y A producen el mismo
resultado.
trace(A) devuelve la traza de la matriz cuadrada A
[m,n] = size(A) devuelve el n umero de las m y de columnas n de una matriz
rectangular A
numel(A) devuelve el n umero de elementos de la matriz A.
FUNCIONES MATRICIALES ESPECIALES
power(A,b) Si A = [a
ij
] devuelve la matriz cuyos elementos son a
b
ij
.
power(b,A) devuelve la matriz cuyos elementos son b
a
ij
.
exp(A) devuelve una matriz cuyos elementos son exp(a
ij
) = e
a
ij
.
sprt(A) devuelve una matriz cuyos elementos son

a
ij
.
log(A) devuelve una matriz cuyos elementos son ln(a
ij
).
mpower(A,n) devuelve la matriz A . . . A n veces, si n es un entero.
expm(A) devuelve la exponencial de A; i.e. e
A
.
sqrtm(A) devuelve

A; i.e. una matriz que multiplicada por s misma


da A.
logm(A) devuelve la matriz ln(A); i.e. una matriz B tal que e
B
= A.
Los comandos A.^n y A^ n son equivalentes a las funciones power(A,n) y powerm(A,n) respec-
tivamente.
FUNCIONES PARA MANIPULAR MATRICES
cat(Dim,A,B) concatena las matrices A y B, i.e. las pone una junto a la
otra. Si Dim=1 B debajo de A y si Dim=2 pone B detras de
A
reshape(A,m,n) cambia el tama no de A a una matriz mn
diag dependiendo del argumento se emplea para construir una
matriz diagonal o para extraer la diagonal de una matriz
blkdiag(A,B) construye una matriz diagonal por bloques
tril(A) extrae la parte triangular inferior de A
triu(A) extrae la parte triangular superior de A
fliplr(A) permuta las columnas de A: la ultima pasa a ser la primera,
la ante ultima pasa a ser la segunda, etc..
Funciones incorporadas en MATLAB 59
flipud(A) lo mismo que fliplr pero por las
rot90(A) rota A 90 grados
[I,J,V]= find(A) encuentra las las y columnas donde estan los elementos no
nulos de A y los almacena en I y J, respectivamente. En V
pone el vector de elementos no nulos.
end(A) devuelve el ultimo ndice de A
FUNCIONES DE AN

ALISIS MATRICIAL
n=norm(v) norma
2
del vector v o de la matriz, si el argumento es una
matriz.Hay variantes para otras normas
n=normest(A) estimacion de la norma
2
de la matriz A. Se usa cuando el
tama no de A es muy grande y se consume mucho tiempo en
calcular norm(A)
r=rank(A) rango de la matriz A
d=det(A) determinante de A
t=trace(A) traza de A
N=null(A) las columnas de N forman una base del n ucleo de A
Q=orth(A) las columnas de Q forman una base ortonormal del espacio
imagen de A
subspace1(A,B) angulo entre los subespacios generados por las columnas de
A y B
FUNCIONES DE FACTORIZACI

ON DE MATRICES Y
DE RESOLUCI

ON DE SISTEMAS LINEALES
/ y \ solucion de sistemas lineales (ver la ayuda help slash)
B = inv(A) inversa de A
c = cond(A) n umero de condicion de A en la norma
2
. Hay una variante
para otras normas
U = chol(A) descomposicion de Cholesky de una matriz denida positiva
[L,U] = lu(A) descomposicion LU (con pivotamiento) de la matriz A. Es
decir, PA = LU, P una matriz de permutacion, L triangular
inferior con 1s en la diagonal y U una matriz triangular
superior.
[Q,R]=qr(A) descomposicion QR de A
d = det(A) Determinante de la matriz cuadrada A
E = rref(A) reduccion a forma de escalera por las de una matriz rec-
tangular A
U = chol(A) descomposicion de Cholesky de una matriz denida positiva
Funciones incorporadas en MATLAB 60
P=pinv(A) pseudoinversa (o inversa de Moore-Penrose) de A
FUNCIONES PARA CALCULO DE VALORES PROPIOS Y SINGULARES
E=eig(A) devuelve el vector E con los valores propios de A
[U,S,V]=svd(A) descomposicion de A en valores singulares: A = USV

P=poly(X) si X es una matriz cuadrada, P es un vector cuyas compo-


nentes son los coecientes del polinomio caracterstico de X.
Si X es un vector, P es un polinomio cuyas races son las
componentes de X
H=hess(A) forma Hessenberg de A
[U,S]=schur(A) forma de Schur de A. U es la matriz unitaria tal que A =
USU

[U,S]=rsf2csf(U,R) transforma la forma de Schur real en la compleja. La forma


de Scur compleja es la habitual: una matriz triangular su-
perior con los valores propios (posiblemente complejos) en
la diagonal. La forma real de Schur se reere a una matriz
real cuyos valores propios complejos aparecen en pares con-
jugados. La matriz R de la forma de Schur es real y en ella
aparecen bloques diagonales 2 2 asociados a los valores
propios complejos conjugados.
[U,S]=cdf2rdf(U,R) el recproco del anterior. Convierte la forma diagonal com-
pleja de Schur de una matriz real a la forma real.
Apendice B
Consejos para el uso de Matlab en
picasso
B.1. Transferencia de cheros a picasso
Para transferir cheros a picasso desde el aula de ordenadores sigue las siguientes instrucciones:
1. Selecciona Programas ->FileZilla Ftp Client ->Filezilla . Veras el siguiente icono:
2. Aparecera la siguiente ventana
3. En la ventanita Servidor escribe la direccion de picasso: 158.227.5.31, En Nombre de
ususario escribe el nombre de tu cuenta. En Contrase~na tu contrase na y puerto escribe
22. A continuacion pulsa la tecla Entrar.
4. Conrma la conexion si as te lo pide.
5. Aparecera una ventana como la siguiente:
61
Consejos para el uso de Matlab en picasso 62
Las ventanas de la izquierda muestran el contenido del ordenador en el que estas actuando
(el cliente) y las de la derecha el de tu cuenta en picasso (servidor).
6. En picasso cambia al directorio matlab pinchando sobre el. Si todava no lo has creado
procede de la siguiente forma: Pincha con el boton derecho del raton en cualquiera de
las ventanas correspondientes a picasso. Te aparece un men u en el que puedes seleccionar
crear directorio. Una vez hecho, aparece una ventanita con el path completo del
directorio que se creara. Comprueba que es correcto y escribe el nombre del directorio; en
este caso, matlab (en min usculas).
7. Para trasladar cheros entre el cliente y el servidor muevete al directorio que contiene el
chero que quieres transferir y al directorio de destino. Arrastra entonces el chero de una
ventana a la otra. Comprueba que la transferencia ha sido correcta.
Una vez terminada la transferencia, sal de FileZilla.
Este programa de transferencia segura de cheros puedes obtenerlo de forma gratuita en la red.
Para ello busca e instala los programas putty y FileZilla.
B.2. Primer uso de MATLAB
La primera vez que vayas a usar MATLAB en el servidor del Departamento de Matematica
Aplicada y EIO, picasso, debes hacer lo siguiente:
1. Abre una ventana de comandos o x-terminal
2. Escribe en ella matlab
3. Una vez abierto MATLAB, pincha sucesivamente en File Preferences Editor/Debugger.
4. Selecciona Text Editor
5. Escribe en el espacio en blanco: /usr/bin/gedit
6. Pincha en OK
Consejos para el uso de Matlab en picasso 63
La razon es que el editor que tiene por defecto MATLAB no funciona bien (en la version instalada
en picasso) con el sistema operativo Solaris y hay que denir uno que s lo haga. Hemos
elegido gedit como editor por defecto, pero si preeres otro (hay varios posibles) basta sustituir
/usr/bin/gedit por el correspondiente comando.
Puedes automatizar el modo de abrir MATLAB a nadiendo un icono al escritorio de modo que
al pinchar sobre el se lance MATLAB. El procedimiento es el siguiente:
1. Coloca el raton en cualquier punto libre del escritorio y haz click con el boton derecho.
Aparece un men u.
2. Pincha sobre Create Launcher. Aparece un cuadro con recuadros para rellenar.
3. En el recuadro Name escribe MATLAB
4. En el recuadro Command escribe /opt/matlab2007/bin/matlab
5. Los demas recuadros puedes dejarlos en blanco.
6. Pincha sobre el cuadradito que sirve para seleccionar Run in terminal
7. Pincha en el cuadro grande en el que pone No Icon. Se abrira una ventana con posibles
dibujos a utilizar.
8. En el recuadro superior pone /usr/share/pixmaps. Sustit uyelo por
/opt/matlab2007/X11/icons/matlab48c icon.xpm y pincha en OK.
Aparecera el icono de MATLAB en tu escritorio. Ahora pinchando (doble click) sobre el se
debera abrir MATLAB. No olvides cambiar el editor.

You might also like