Documentos de Académico
Documentos de Profesional
Documentos de Cultura
de Métodos Numéricos
con MATLAB
Ion Zaballa
Índice general
1. Lo Básico 4
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Matrices y Vectores 9
2
3
4. Programación en MATLAB 31
Lo Básico
1.1. Introducción
Este documento pretende ser una guı́a básica para introducirse de forma personal en el uso
de MATLAB y en relación con las asignaturas Análisis Matricial Aplicado y Ampliación de
Métodos Numéricos. Por lo tanto, aquı́ sólo se cubrirán aquellos aspectos de MATLAB que
tienen relación con la materia discutida en dichas asignaturas. En otros documentos, que se
entregarán en clase, se plantearán ejercicios en base al contenido de esta guı́a y que deben ser
resueltos personalmente. Si se quiere disponer de una buena y completa guı́a de MATLAB, mi
recomendación es el libro MATLAB Guide de D. J. Higham y N. J. Higham, editado por SIAM.
Trabajando con MATLAB se debe tener muy claro que las unidades básicas son matrices (un
escalar es, por lo tanto, una matriz 1 × 1), y que por lo tanto todas las operaciones se refieren
a matrices.
Se puede ejecutar MATLAB sobre cualquier sistema operativo. Se presupone que las prácticas se
realizarán en la sala de informática del Departamento de Matemática Aplicada y EIO o en una
4
Lo Básico 5
de las aulas de ordenadores de la Facultad de Ciencias. En el primer caso, la sala está compuesta
de una serie de terminales gráficos 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 él. 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 versión 6 los interfaces gráficos 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. Además, las últimas versiones de MATLAB (desde Release
14–MATLAB 7) corrigen algunas deficiencias de edición con el teclado en castellano (como
la ubicación del sı́mbolo [ o el acento circunflejo ^) que tenı́an las versiones anteriores para los
sistemas UNIX. Esto significa que las explicaciones que damos en estas notas son, en su mayorı́a,
de aplicación para MATLAB bajo ambos sistemas.
Una sesión de MATLAB se comienza de forma diferente según la plataforma sobre la que lo
ejecutemos. En un PC o Mac basta hacer doble “click” con el botón izquierdo del ratón sobre
el icono de MATLAB. En picasso podemos ejecutar MATLAB en modo consola o utilizando un
interfaz gráfico. En cualquier caso, se debe abrir primero una sesión X:
Para ejecutar MATLAB en modo consola se debe abrir una xterminal y en ella escribir matlab
-nodesktop. Para utilizar MATLAB en modo gráfico, que es más sencillo, se debe escribir
matlab y pulsar la tecla de entrada.
Trabajando en picasso en modo gráfico, MATLAB puede consumir muchos recursos del sistema;
principalmente si hay muchos usuarios conectados y dependiendo de la calidad de los terminales
gráficos. Si este fuera el caso (que se nota por una excesiva ralentización 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 Apéndice B.
Trabajando en modo gráfico, bien sea bajo UNIX o MSWindows, una vez ejecutadas las acciones
mencionadas, aparecerá el logotipo de MATLAB y a continuación una ventana parecida la que se
muestra en la Figura 1.1 (la figura mostrada corresponde al release 14. En las nuevas versiones la
ventana es diferente, pero todavı́a 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 sólo nos interesa la última de ellas
que es la ventana de comandos de MATLAB. Por ello, aunque no es estrictamente necesario,
cerramos las demás con un click del ratón en el sı́mbolo de cada ventana. En realidad hay
otras ventanas ocultas que se pueden ir cerrando sucesivamente hasta que no quede más que la
ventana Command Window. Todas estas ventanas tienen, de momento, un interés secundario y
Lo Básico 6
siempre se pueden volver a abrir seleccionándolas con el ratón en el menú view de la ventana
principal.
Para finalizar la sesión en cualquier sistema basta escribir el comando quit. Alternativamente
se puede elegir Exit MATLAB en el menú File del menú principal.
Cuando hablamos de usar un comando (por ejemplo quit), nos referimos a escribir detrás del
“prompt” de MATLAB la palabra correspondiente (en este caso quit) y pulsar la tecla de
entrada.
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 función o comando. Empe-
zando por lo último, 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 más bonito (en el segundo),
explicando todo lo relativo a dicho comando.
Lo anterior implica que se sabe lo que se busca. Hay niveles más generales de ayuda. Por ejemplo,
tecleando helpwin aparece una relación de las carpetas de MATLAB que contienen ayuda y una
breve descripción 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 función.
Los dos niveles de ayuda anteriores (help función y helpwin) están disponibles tanto en modo
gráfico como en modo consola. Si se trabaja en modo gráfico hay, además, una tercera posibilidad
de ayuda más general. Pinchando en Help en el menu principal de MATLAB y seleccionando
Product Help aparecerá una nueva ventana como la de la Figura 1.2 con toda la ayuda de
Lo Básico 7
No es necesario poner el cursor al final de la lı́nea de comandos para que MATLAB reconozca
la lı́nea entera, se puede dar entrada estando el cursor en cualquier punto de dicha lı́nea. Esto
suele suceder cuando se ha observado un error al escribir y se mueve el cursor hacia atrás para
corregir el fallo.
comando que comenzaba con esos caracteres. Sucesivas pulsaciones de ↑ producen la aparición
de los anteriores comandos que empiezan por las letras o sı́mbolos escritos.
También se puede utilizar el clásico sistema de copiar y pegar para producir órdenes en la lı́nea
de comandos.
Capı́tulo 2
Matrices y Vectores
Vectores y matrices son para MATLAB la misma cosa. Se pueden introducir matrices en
MATLAB de varias formas:
En este capı́tulo analizaremos cada una de estas formas de generar matrices y vectores.
Los elementos de cada fila deben estar separados por comas o espacios en blanco.
9
Matrices y Vectores 10
Debe observarse que el número de elementos en cada fila debe ser el mismo; en caso contrario,
MATLAB producirı́a un mensaje de error. Por ejemplo para introduir la matriz
16 3 2 13
5 10 11 8
A= 9 6 7 12
4 15 14 1
escribirı́amos:
A =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
A veces el número de elementos en cada fila es muy grande y es preferible introducir una fila en
cada lı́nea, lo único que hay que hacer es terminar la lı́nea con tres puntos: . . . y teclear retorno.
Por ejemplo
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 podrı́a haber introducido la matriz sin
asignársela de forma especı́fica a una variable. Por ejemplo, si escribimos
MATLAB responde:
ans =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
Matrices y Vectores 11
>> 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úsculas y minúsculas de forma que a y A son dos variables distintas.
Para saber las variables que tienes definidas puedes usar el comand who. Éstas también aparecen
en la ventana workspace. En el siguiente capı́tulo se explica cómo acceder a esta ventana y lo
que significa.
En el ejemplo anterior los elementos de la matriz eran números enteros, pero en realidad los
elementos de una matriz pueden ser cualquier expersión válida de MATLAB. Por ejemplo
produce
x =
-1.3000 1.7321 4.8000
>> helpwin
pi 3.14159265. . . √
i la unidad imaginaria, −1.
j lo mismo que i.
eps precisión relativa de los números en coma flotante, 2−52 = 2,204e − 16. Es decir distancia
de 1.0 al siguiente número más próximo en coma flotante.
realmin número en coma flotante más pequeño, 2−1022 .
realmax número en coma flotante más grande, (2 − eps)21023 .
inf infinito. Se produce al dividir un número distinto de cero por cero.
nan “Not-A-Number”. Se produce al evaluar expresiones como 0/0 o inf-inf.
En el ejemplo de más 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
MATLAB aplica un factor de escala general a las matrices cuando los elementos más grandes o
más pequeños son superiores o inferiores, respectivamente, a una determinada cantidad (103 y
10−3 ).
Matrices y Vectores 13
Las expresiones se pueden construir con números (reales o complejos) y utilizando los operadores
aritméticos y las reglas de precedencia habituales (en caso de duda siempre se pueden utilizar
paréntesis):
+ adición
− sustracción
∗ multiplicación
/ división por la derecha
\ división por la izquierda
ˆ potenciación
’ transposición
Estos mismos operadores se utilizan con matrices, por eso se incluye la transposición y la división
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úmeros. Ası́ 1/4 y 1 \ 4 producen el mismo
valor numérico: 0,25. De la misma forma A0 es la transpuesta de A y si a es un número a0 = a.
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 “división” (en el sentido de más arriba) habituales. Cuando estos operadores
están precedidos por un punto, la operación 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
>> 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
>> 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; sólo 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 potenciación ˆ en MATLAB.
Para evitar el uso de este sı́mbolo tenemos la siguiente alternativa:
A.^3=power(A,3) A^3=mpower(A,3)
Puesto que las unidades básicas de MATLAB son las matrices, dispone de varias formas de crear
vectores y matrices de forma casi automática, y de manipular los elementos de una matriz.
El operador dos puntos, : , es uno de los más importantes. Sirve para generar vectores y
matrices cuyos elementos están igualmente espaciados. Ası́
>> x=1:5
x =
1 2 3 4 5
Mientras que
>> y=0:pi/4:pi
y =
0 0.7854 1.5708 2.3562 3.1416
>> 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 especifica las com-
ponentes primera y última y el número de ellas:
>> k=linspace(-sqrt(3),pi,5)
k =
-1.7321 -0.5136 0.7048 1.9232 3.1416
El número de componentes por defecto es 100. Esto significa que una sentencia del tipo
>> k=linspace(-sqrt(3),pi);
√
asignarı́a a la variable k un vector de 100 componentes igualmente espaciadas entre − 3 y π
(hemos escrito ; al final del comando para que el resultado no sea mostrado).
Por otra parte, dada una matriz A, el elemento de la fila i y la columna j, se denota por A(i,j).
Ası́, con la matriz A de más arriba (que utilizaremos a lo largo de esta sección):
>> A(2,4)
ans =
8
Se puede modificar el elemento de cualquier posición sin más que cambiar su valor. La respuesta
de MATLAB es toda la matriz con el nuevo valor en dicha posición. Para seguir manteniendo,
para los siguientes ejemplos, la misma matriz A, primero almacenamos en c el elemento que
vamos a cambiar y a continuación recuperamos la matriz original::
Matrices y Vectores 16
Por otra parte, si pedimos el valor del elemento en la posición (4, 5), MATLAB nos devuelve un
mensaje de error porque el tamaño de A es 4 × 4:
>> A(4,5)
??? Index exceeds matrix dimensions.
Desde la versión 5 de MATLAB se puede usar end para indicar el último elemento de una matriz,
respecto de una dimensión 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 sólo se puede extraer cada elemento de una matriz sino cualquier submatriz. Para ello basta
expresar la submatriz deseada en notación vectorial. Ası́, para obtener el “subvector” de a
formado por los últimos 5 primeros elementos escribirı́amos:
>> a(1:5)
ans =
4 5 6 7 8
>> 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 filas 1 y 3 y las columnas 3 y 4 escribirı́amos:
Si queremos la submatriz formada por las dos primeras filas podemos utilizar el comando dos
puntos:
Podemos hacer uso de esta técnica para generar submatrices correspondientes a filas o columnas
igualmente espaciadas. Por ejemplo, si A fuera una matriz 10×15, el comando A(2:2:10,1:3:15)
nos devolverı́a la submatriz formada por las filas pares y las columnas 1,4,7,10 y 13.
Si a una matriz le especificamos un solo subı́ndice, 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 notación vectorial para los subı́ndices de una matriz puede utilizarse para permutar filas o
columnas de una matriz. Ası́ para obtener una matriz B con las filas primera y segunda, y las
columnas segunda y cuarta de A permutadas, harı́amos lo siguiente:
5 10 11 8
16 3 2 13
9 6 7 12
4 15 14 1
Dada una matriz A podemos añadirle filas y columnas sin más que especificar el vector con los
elementos que se quiere añadir. Por ejemplo, si a nuestra matriz A le queremos añadir la fila
[1 3 5 7] harı́amos lo siguiente:
Claro que también podrı́amos definir primero el vector fila que vamos a añadir y luego añadirlo:
Si lo que queremos es añadir una columna actuarı́amos por transposición (recordemos que r0 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 más pequeñas nos permite ir creando matrices
sobre la marcha empezando desde una “matriz vacı́a”. En efecto, la orden >> B=[] nos devuelve
una matriz sin elementos a la que podemos ir añadiéndole filas o columnas como hemos hecho
más 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 filas y/o columnas con ayuda de la “matriz vacı́a”. Simplemente
igualamos a [] la submatriz que queramos eliminar:
>> B2(:,2)=[]
B2 =
1 7
2 8
3 9
Hay un buen número de funciones de matrices predefinidas en MATLAB. Una relación de todas
ellas con la descripción 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 más elementales:
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
Hay otras formas de producir matrices. Comentamos a continuación cómo generar matrices a
partir de ficheros externos. Estos son ficheros 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 especı́fico donde almacenar estos y otros posibles ficheros. Hablaremos más ex-
tensamente sobre este tema y otros relacionados cuando estudiemos el entorno de trabajo de
MATLAB. Ahora comentamos sólo lo necesario para crear matrices a partir de ficheros externos.
Me referiré a matlabdir como el directorio donde se guardarán todos los ficheros de MATLAB
creados por nosotros mismos. El nombre real de este directorio para cada cuál puede ser diferente.
En primer lugar se debe crear. Para ello conviene comprobar primero en qué 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 órdenes correspondientes al sistema operativo que se
verán más adelante. También 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 ficheros allı́ depositados. Para
ello debemos añadirlo al “path” de MATLAB con el comando addpath. Por ejemplo: addpath
/ruta completa/matlabdir. Si ahora tecleamos path, en la primera lı́nea deberá aparecer la
ruta completa hasta nuestro directorio matlabdir.
Con el comando load. Este comando puede leer ficheros externos binarios, producidos por
sesiones anteriores de MATLAB, o de texto. Para obtener matrices de ficheros de texto
externos éstos deben estar organizados como una tabla rectangular de números, separados
Matrices y Vectores 23
por espacios en blanco, con una fila por lı́nea y con igual número de elementos en cada
fila. Por ejemplo, con un editor de texto (textedit en picasso o notepad en MSWindows)
podemos crear un fichero de texto que contenga estas cuatro lı́neas:
>> magico
magico =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
Creando un fichero M con el contenido de una o más matrices. Los ficheros M son parte
fundamental de MATLAB y los analizaremos posteriormente. Por ahora sólo necesitamos
saber que si con nuestro editor creamos un fichero de texto que contenga las siguientes 5
filas:
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 fichero como magico.m, entonces el comando magico en MATLAB lee el
fichero y crea la variable A que contiene la matriz del fichero. Por supuesto, el fichero debe
estar en el directorio matalbdir.
Capı́tulo 3
>> who
Your variables are:
A a b
>> whos
Name Size Bytes Class
24
El Entorno de Trabajo de MATLAB 25
menú 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 esté 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ú principal y
ver si está allı́ relacionada. Si no lo está se abre como se ha mencionado más arriba. Y si lo está y
no se ve es que está 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 aparecerá la ventana del espacio de trabajo con la información que
proporciona el comando whos(ver la figura 3.1)
Esta información puede ser interesante cuando se están 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 fin de no sobreescribir alguna que pueda ser importante.
Para cerrar la ventana del espacio de trabajo basta seleccionar, de nuevo, Workspace en el
menú Desktop (o View para versiones anteriores a la 7) o pinchar en el sı́mbolo .
Para borrar todas las variables del espacio de trabajo se utiliza el comando clear.
En muchas ocasiones puede resultar interesante interrumpir el trabajo con MATLAB y poderlo
recuperar más tarde en el mismo punto en el que se dejó (con las mismas variables definidas,
con los mismos resultados intermedios, etc.). Hay que tener en cuenta que al salir del programa
todo el contenido de la memoria se borra automáticamente. También 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ú File. Esta segunda forma
de hacerlo es muy intuitiva y no requiere comentarios. Los comandos save y load apenas los
usaremos en estas prácticas y se puede encontrar todo lo relativo a ellos usando helpwin →
El Entorno de Trabajo de MATLAB 26
matlab/general
Los comandos save y load crean ficheros binarios o ASCII con el estado de la sesión, 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 fichero de texto. Esto
se hace con el comando diary. El uso general es de la forma siguiente:
De esta forma se va escribiendo en el fichero filename.txt todo lo que aparece, lı́nea tras
lı́nea, en la ventana de comandos de MATLAB con posterioridad a la utilización del comando.
Esto significa 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 sesión. ¡Ojo! si se
quieren salvar distintas sesiones se deben guardar en archivos con nombres diferentes. Salvo que
se especifique el path completo en el que se quiere guardar el fichero, éste se salva (en Windows)
en el subdirectorio work del directorio principal de MATLAB (es decir, en la subcarpeta work
de la carpeta de instalación de MATLAB) y en un sistema UNIX en el directorio home de cada
usuario.
>> diary on
El simple comando diary pasa de on a off y viceversa. Para poder acceder al fichero file-
name.txt con un editor de texto es necesario que diary esté en off porque si no MATLAB
mantiene abierto el fichero y no es accesible desde el exterior.
No obstante, en la ventana Command History que se puede abrir desde el menú Desktop se
guardan las sesiones anteriores (hasta cierto punto) especificadas por el dı́a y la hora en que se
comenzaron.
Para MATLAB el carácter tanto por ciento ( %) indica comienzo de comentario. Cuando aparece
en una lı́nea de comandos, el programa supone que todo lo que va desde ese carácter hasta el
fin de la lı́nea es un comentario y por lo tanto no lo lee. Raramente se usan en la ventana de
comandos, pero son muy útiles cuando se escriben programas (ficheros M) tal y como veremos
más adelante.
El Entorno de Trabajo de MATLAB 27
El search path de MATLAB es una lista de directorios que se puede ver y modificar a partir
de la lı́nea de comandos. El comando path hace que se escriba el search path de MATLAB (el
resultado depende de en qué directorio está 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 cómo MATLAB utiliza el search path supóngase que se utiliza la palabra nombre1
en un comando. El proceso que sigue MATLAB para tratar de conocer qué es nombre1 es el
siguiente:
2. Comprueba si nombre1 es una función del usuario (hablaremos más adelante de las fun-
ciones en MATLAB).
Estos pasos se realizan en el orden indicado. En cuanto se encuentra lo que se está buscando se
detiene la búsqueda y se utiliza el fichero 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 definir la lista de directorios donde MATLAB debe
buscar los ficheros de comandos y las funciones, tanto del sistema como de usuario. Para abrir
el Path Browser se elige Set Path en el menú File. Una vez seleccionado se abre otra nueva
ventana en la que se muestra la lista de directorios en la que MATLAB buscará (MATLAB
search path) (ver Figura 3.2. Seleccionando Add Folder se pueden añadir nuevos directorios.
Se puede especificar, además que se incorporen al “search path” todos los subdirectorios del
directorio seleccionado. También se pueden quitar directorios con la opción Remove (es mejor
que ni lo intentes salvo que estés seguro/a de lo que haces). El nuevo directorio se puede añadir al
comienzo o final de la lista. Tal y como hemos mencionado, el orden de la lista es muy importante
porque refleja el orden de la búsqueda: si una función está en dos directorios, se utilizará 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 próxima vez
que se empieza una sesión de MATLAB las carpetas añadidas aparecerán en el path browser.
Este no es el caso en sistemas UNIX porque la posibilidad de escribir de forma permanente en
el directorio donde está instalado MATLAB es exclusiva del administrador del sistema. Para
añadir permanentemente unos directorios al “search path” en UNIX hay que hacerlo a través
del fichero startup.m del que hablaremos enseguida.
El fichero responsable de los parámetros con los que se inicia cada sesión de MATLAB es matla-
brc.m que se encuentra en el subdirectorio toolbox/local de la instalación de MATLAB (en
sistemas UNIX). En sistemas multiusuario, como picasso, sólo puede modificarlo el administra-
dor. En Windows puede hacerlo cualquiera, pero es altamente recomendable que no lo hagas.
Ahora bien, cada usuario puede escribir un fichero para que cada vez que se empiece una sesión
de MATLAB, éste se inicie con los parámetros que cada cual desee. Este fichero se debe llamar
startup.m y debe estar, en sistemas UNIX, en el subdirectorio home/izaballa/matlab del
correspondiente ususario. Bajo Windows este fichero se debe colocar en la subcarpeta work de
la carpeta donde está instalado MATLAB (posiblemente C:\matlabr14 o algo ası́). Por ejemplo,
un fichero startup.m que contenga las siguientes lı́neas:
El Entorno de Trabajo de MATLAB 29
cd \$HOME/matlab
format compact
addpath ’/usr/alu/julen/matlab/practicas’ -end
!texedit
disp(’Kaixo’)
hará lo siguiente cuando el usuario correspondiente (en este caso posiblemente Julen) empiece
una sesión de MATLAB en picasso:
cd c:\matlabr14\programas
format compact
addpath ’c:\matlabr14\programas’ -end
edit
disp(’Kaixo’)
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
Como en todos los sistemas operativos se pueden utilizar los caracteres comodı́n, pathnames y
nombres de los discos o directorios en la forma habitual. Ası́ los comandos
>> cd c:\matlab
>> delete *.dos
En un sistema UNIX los discos habitualmente no se designan con las letras a, c, etc..., sino que
todos los directorios “cuelgan” del directorio raı́z: /. 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 qué directorio nos encontramos trabajando.
El cierre de exclamación, !, indica que el resto de la lı́nea es un comando del sistema operativo.
Esto puede ser útil 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)
es una orden para abrir el editor de ficheros Text Editor que trae por defecto el sistema
Open windows de Solaris y cargar en él el fichero parabola.m. El sı́mbolo & 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 órdenes.
Capı́tulo 4
Programación en MATLAB
definir el vector t,
definir el vector x = t2 , y
En este caso tan simple, se pueden dar las tres órdenes en la misma lı́nea de comando (recuerda
las dificultades que hay para usar ˆ en picasso y que este operador se puede sustituir por
power):
31
Programación en MATLAB 32
o preferiblemente
Recuerda también que linspace(a,b) forma un vector de 100 componentes igualmente espa-
ciadas entre a y b. Si estos puntos no están muy alejados entre sı́, cada componente del vector
está muy próxima a la siguiente.
>> t=linspace(-2,2);
>> x=t.^2;
>> plot(t,x)
Y hay una tercera posibilidad que es la más interesante: escribir el conjunto de órdenes en un
fichero, mediante un editor. Ya se ha dicho más arriba cómo hacerlo tanto en picasso (mediante
!texedit) como en Windows (con edit) (ver Figura4.1 Esto es lo que se llama un “script”, un
programa (en este caso pequeño) con código ejecutable por MATLAB. La traducción de “script”
en castellano es algo ası́ como guión pero seguiremos utilizando el original en inglés.
Una vez escrito, se salvarı́a con el nombre que se desee, por ejemplo parabola.m (la extensión
.m es obligatoria, es la forma en que MATLAB sabe que es un fichero con código ejecutable).
Para ejecutar las órdenes contenidas en este fichero basta escribir su nombre en la ventana de
comandos; en este caso parabola:
>> parabola
El resultado es una nueva ventana, como la de la figura 4.2, que contiene la gráfica de la parábola.
Figura 4.2: Ventana gráfica con la parábola producida por el script parabola.m
puntos (1, a1 ), (2, a2 ), . . . . Si lo que se quiere es señalar con el sı́mbolo ∗ los puntos (x1 , y1 ),
(x2 , y2 ),. . . , (xn , yn ) pero sin unirlos a través de una poligonal basta crear los vectores x e y y
usar el comando plot(x,y,’*’).
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 programación. La idea es que cierta acción se realice dependiendo de si una condición
es verdadera o no. La verdad o falsedad de estas condiciones se suele evaluar comparando dos
expresiones. Para ello existen operadores relacionales y lógicos. MATLAB dispone de los
siguiente operadores relacionales:
En MATLAB los operadores relacionales pueden aplicarse a vectores y matrices, y eso hace que
tengan un significado especial. Por ejemplo, dada una matriz A la comparación abs(A)<eps
genera una matriz de 0’s y 1’s con el mismo tamaño de A. El elemento (i, j) de dicha matriz es
1 si |Aij | < eps, siendo eps el epsilon de la máquina (=2.204e-16).
>> B=(abs(A)<eps)
B =
0 0 1
1 0 0
0 0 1
>> any(B)
ans =
1 0 1
>> any(any(B))
ans =
1
Ası́ pues, la sentencia any(any(abs(A)<eps)) se puede utilizar como una condición. Será ver-
dadera si y sólo si algún elemento de A es, en módulo, más pequeño que eps. En caso contrario
es falsa.
Hay un operador lógico similar: all. Responde true si todos los elementos del vector son distintos
de cero; en caso contrario, responde false. Con la matriz A de más arriba:
>> all(A)
ans =
0 1 0
En efecto, la única 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 programación, si una comparación
se cumple el resultado es 1 (true), mientras que si no se cumple es 0 (false). Recı́procamente,
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ño,
la comparación se realiza elemento a elemento, y el resultado es otra matriz de unos y ceros del
mismo tamaño, que recoge el resultado de cada comparación entre elementos. Por ejemplo:
Programación en MATLAB 35
Para saber si dos matrices son iguales, se puede usar la expresión isequal(A,B)
>> isequal(A,B)
ans =
0
>> A
A =
1 2
0 3
>> isfinite(A)
Programación en MATLAB 36
ans =
1 1
1 1
>> isnumeric(A)
ans =
1
>> isreal(A)
ans =
1
>> isvector(A)
ans =
0
Además una condición puede constar de una o más operaciones relacionales. Éstas normalmente
están concatenadas con expresiones lógicas cuya verdad o falsedad sigue las leyes de la lógica
formal. Los operadores lógicos de MATLAB son los siguientes:
& y
| o
~ negación lógica
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
ans =
0
>>
Para terminar con los operadores lógicos estudiamos otro comando muy útil: find. Este comando
devuelve los ı́ndices (los lugares que ocupan) los elementos no nulos de un vector. Por ejemplo
>> x(f)
ans =
-3 1 -Inf
> x(find(isfinite(x)))
ans =
-3 1 0 0
>> x(find(x<0))=0
x =
0 1 0 0 0
Cuando find se aplica a una matriz se hace mirándola como un vector; es decir al vector A(:)
que se obtiene -recordemos- poniendo las columnas de A una debajo de otra. Por ejemplo
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 filas 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) están los elementos de A que son menores que
los de B.
Tal y como hemos dicho más arriba las bifurcaciones de MATLAB son while . . . end, if. . . end
y switch . . . case. Este último tipo de bifurcaciones no lo vamos a comentar; se puede consultar
la ayuda de MATLAB para saber como funciona. También se dispone de bucles for . . . end.
La forma más simple de una bifurcación del tipo if. . . end es la siguiente
if condicion
sentencias
end
Programación en MATLAB 39
Existe también la bifurcación múltiple, 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 % opción por defecto para cuando no se cumplan las condiciones 1,2,3
bloque4
end
donde la opción 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.
Exponemos un ejemplo a continuación. Recordemos que los operadores lógicos se pueden com-
binar con los relacionales para poder comprobar el cumplimiento de condiciones múltiples.
if n<0 | n==0
disp(’Introduce un número positivo’);
elseif rem(n,2)==0
a=n/2;
else
a=(n+1)/2
end
Naturalmente la condición n<0 | n==0 podrı́a sustituirse por la más compacta n<=0. Se ha
escrito de la forma expuesta para hacer uso de una condición con dos relaciones y un operador
lógico.
SENTENCIA WHILE.- La estructura del bucle while es muy similar a la de cualquier otro
lenguaje de programación. Su sintaxis es la siguiente:
while condicion
sentencias
end
Programación en MATLAB 40
donde condición puede ser una expresión vectorial o matricial. Las sentencias se siguen ejecu-
tando mientras haya elementos distintos de cero en condicion; es decir, mientras haya algún
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úmero n mientras éste 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 fin 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:
>> n=0;
>> for i=1:25
n=n+1/i;
end
>> n
n =
3.8160
Y por supuesto, se pueden encajar múltiples bucles for. . . end unos dentro de otros. El siguiente
código proporciona una matriz simétrica 5 × 5 con el elemento ji en la posición (i, j) para i ≥ j:
Si en MATLAB hacemos
>> v=1:5
v =
1 2 3 4 5
A veces, sin embargo se quiere disponer de un formato de salida un poco más estructurado. Por
ejemplo se quiere mostrar una tabla de los valores de sen(2πt) para 10 valores de t igualmente
espaciados en el intervalo [0,1].Con el comando disp lo podemos hacer fácilmente. Escribimos
un fichero con el siguiente contenido
t=linspace(0,1,10);
y=sin(2*pi*t);
disp(’ t sen(2*pi*t) ’)
disp(’--------------------------’)
disp([t’ y’])
>> 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
>> v=[1 2 3]
v =
1 2 3
Ası́, una frase entre acentos es un vector de caracteres. Por eso en el programa de más 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 más especiales se puede usar el comando sprintf. Su uso en
MATLAB es muy parecido al del comando homónimo en lenguaje C.
El nombre que se utiliza para los programas en MATLAB es el de M-files o ficheros M. Hay
dos tipos de ficheros M: los scripts y las funciones. Son el equivalente a programas, funciones,
subrutinas o procedimientos de otros lenguajes de programación como FORTRAN, C, Pascal o
Java. Los ficheros M son, por lo tanto, secuencias de comandos de MATLAB que se almacenan
en ficheros y que tienen algún propósito concreto. Un fichero M puede hacer referencia a otros
ficheros M e incluso a sı́ mismos (es decir, está permitida la autorecursividad). Los ficheros M
son especialmente apropiados para
Programación en MATLAB 43
experimentar con algoritmos escribiéndoles en un fichero sobre el que poder hacer correc-
ciones en vez de reescribir cada vez que se quiere experimentar una larga lista de comandos,
construir programas que pueden ser utilizados con posterioridad varias veces,
Funciones. Deben contener una primera lı́nea 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 función (salvo que sean declaradas como global)
Ya hemos visto en la sección anterior cómo hacer ficheros M de tipo “script”. Simplemente son
ficheros que ejecutan sucesivamente varios comandos de MATLAB con un objetivo especı́fico
y siempre que se ejecutan producen el mismo resultado. Volveremos sobre ellos más adelante
para recalcar su diferencia con el otro tipo de ficheros M, y que son los más importantes:
las funciones. Las funciones en MATLAB guardan una gran similitud con las funciones en
lenguaje C o Pascal. Lo que exponemos a continuación está inspirado en el primer capı́tulo del
libro Introduction to Scientific Computation de Charles F. van Loan.
function y= miexp1(x,n)
%
%Precondiciones: acepta dos valores x=número real y
Programación 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 lı́neas en un fichero de texto y salvarlo con
el nombre miexp1.m en un directorio (o carpeta) que esté en el path de MATLAB; por ejemplo,
en nuestro directorio de trabajo. Debe observarse que ahora el nombre del fichero sólo puede ser
el que hemos dado a la función. Debemos tener cuidado, además, con que el nombre de la función
no coincida con un nombre ya existente en el path de MATLAB. Como las distribuciones de
MATLAB incorporan infinidad de funciones debemos elegir nombres significativos para nosotros
pero no demasiado standard; por ejemplo, podemos empezar los nombres de nuestras funciones
con el prefijo mi. . . o escoger un nombre en euskera, etc.
Al escribir una función en MATLAB debes seguir unas pocas, simples e importantes reglas:
En algún sitio del cuerpo de la función se debe pasar a la variable de salida el valor deseado.
Los comentarios que definen completamente la función deben hacerse inmediatamente
después de la definición de la función. Esto es importante porque cuando en la ventana
de comandos se escriba help nombredelafuncion, MATLAB responderá escribiendo los
comentarios que ahı́ se escriban. Opcionalmente, y es recomendable hacerlo, se pueden
escribir comentarios en otros lugares del cuerpo de la función para clarificar el objetivo de
uno o varios de los comandos que se utilizan. Estos comentarios deben ir siempre precedidos
del sı́mbolo %.
Las variables de entrada y salida son parámetros formales (es decir, letras). Cuando se
llama a la función para que realice la acción que se desea, deben ser sustituı́dos por
parámetros reales (es decir, números, vectores, matrices,...). Por ejemplo, la función miexp1
debe ser llamada con dos números concretos. x=miexp1(0.1,3) devolverá en la variable x
el valor de la aproximación de Taylor de tercer orden en 0,1.
Programación en MATLAB 45
Las variables que se definan en el interior de la función (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ún problema.
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
función. Por ejemplo, si queremos las gráficas para cuatro valores de n = 4, 8, 16, 20 del error
relativo que se comete al aproximar ex por Tn (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 lı́neas en un fichero .m (por ejemplo, smiexp1.m) tenemos un “script” que al
ejecutarlo en MATLAB
>> smiexp1
nos produce cuatro gráficas (figura 4.3), cada una correspondiente a un valor de n, con el
error relativo de la aproximación. Obsérvese el efecto del comando subplot(n,m,p). Crea una
“matriz” de n×m figuras y asigna a la p-ésima el siguiente comando plot. Ası́ p=1 corresponde a
la figura en al posición (1, 1), p=2 a la figura en la posición (1, 2), etc. Todos los demás comandos
en el “script” ya son conocidos.
n= 4 −6 n= 8
x 10
0.02 7
6
0.015
5
4
0.01
3
2
0.005
1
0 0
−1 −0.5 0 0.5 1 −1 −0.5 0 0.5 1
6
6
5
4
4
3
2
2
1
0 0
−1 −0.5 0 0.5 1 −1 −0.5 0 0.5 1
function y= miexp2(x,n)
%
%Precondiciones: acepta dos valores x=vector de números 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
x=linspace(-1,1,100);
exacto=exp(x);
errorrel=abs(exacto-miexp2(x,n))./exacto
Ası́ pues las variables de entrada y de salida pueden ser cualquier tipo de variable soportada por
MATLAB. No sólo eso, pueden aparecer mezcladas. Por ejemplo las variables de entrada de la
función miexp2 son un vector y un número. También las variables de salida pueden ser varias
Programación en MATLAB 47
y de distintos tipos. Por ejemplo, la siguiente función calcula el tiempo que tarda MATLAB en
crear (no escribir en pantalla, sino poner en la memoria del ordenador) m matrices aleatorias de
tamaño n × n y nos proporciona la última matriz creada. Es un ejemplo un poco artificial pero
sirve para ilustrar las ideas que estamos comentando: la salida es un vector formado por dos
variables, la primera es un número 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 última matriz generada, A
Utilizamos aquı́ dos nuevos comandos (en realidad como todos los comandos de MATLAB, se
trata de funciones del propio sistema, bien sean precompiladas o definidas a partir de ficheros
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
Tn (x) para un determinado valor de n y para vectores x de distinto tamaño con componentes
en el intervalo [-1,1]:
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 sólo depende del código que se emplee sino, sobre todo, de las carac-
terı́sticas del propio ordenador (procesador, memoria, bus,. . . ). La salida debe parecerse a una
tabla con la siguiente forma
Una última observación. Se podrı́a querer tener tablas comparativas para diversos valores de n
y de la longitud de x. Para conseguirlo bastarı́a convertir el “script” anterior en una función:
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 aproximación de exp(x) mediante
% la aproximación 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.
%
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 más arriba. La ventaja es que ahora podemos probar con diversos
valores de k y n sin tener que modificar el “script” cada vez.
Debe notarse que no hay variable de salida. Esta función produce un resultado: una tabla con
la comparativa de tiempos pero no almacena esta salida en ninguna variable. El recı́proco, que
una función tenga variables de salida pero no de entrada, también es posible pero muy poco
frecuente.
Capı́tulo 5
MATLAB trabaja indistintamente con números reales o complejos, pero hay algunas propie-
dades especı́ficas de estos últimos que hay que tener en cuenta. Polinomios son vectores cuyas
componentes son los coeficientes del polinomio. Sumar polinomios es como sumar vectores, pero
también se puede multiplicar y dividir polinomios. MATLAB tiene una serie de funciones que
ayudan a trabajar con polinomios cómodamente.
El comando abs(a) devuelve el valor absoluto o el módulo del número a según que éste sea real
o complejo. De la misma forma abs(A) devuelve una matriz cuyos elementos son los módulos
o los valores absolutos de los elementos de A según que éstos sean números complejos o reales.
Además, como ya se dijo en el Capı́tulo 2, MATLAB no produce un error si se le pide la raı́z
cuadrada o el logaritmo de un número negativo sino que devuelve el correspondiente número
complejo. La unidad imaginaria es una constante predefinida en MATLAB. Las letras que la
designan son bien i, bien j.
Hay que tener cuidado con la trasposición. Si A es una matriz de números complejos entonces
A0 es la transpuesta conjugada de A (lo que nosotros solemos designar como A∗ ). Si queremos
la transpuesta de A debemos usar A.0 . Por ejemplo
A =
50
Números complejos y polinomio 51
>> Atc=A’
Atc =
>> At=A.’
At =
Finalmente, el comando plot cuando se emplea con números complejos tiene un significa-
do especial: Si y es un vector de números complejos la sentencia plot(y) es equivalente a
plot(real(y),imag(y)).
Tal y como hemos dicho Para MATLAB un polinomio es el vector de sus coeficientes. Por
ejemplo, el polinomio:
p(x) = x4 − 8x2 + 6x − 10
se puede representar mediante el vector
MATLAB puede realizar diversas operaciones sobre él, como por ejemplo evaluarlo para un
determinado valor de x (función polyval()) y calcular las raı́ces (función roots()):
1 0 -8 6 -10
>> roots(pol)
ans =
>> polyval(pol,1)
Números complejos y polinomio 52
ans =
-11
Hay una función similar a polyval pero para matrices: la función plyvalm. Dada una matriz
A y polinomio p(λ) = pol, la función polyvalm(pol,A) devuelve la matriz p(A). Ası́ con el
polinomio pol=[1 0 -8 6 -10] definido más arriba:
>> A=ceil(rand(3,3)*5-7)
A =
-2 -4 -4
-5 -2 -6
-3 -3 -2
>> polyvalm(pol,A)
ans =
Para calcular el producto de polinomios MATLAB utiliza una función llamada conv() (de
producto de convolución). En el siguiente ejemplo se va a ver cómo 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
>> pol3=conv(pol1,pol2)
pol3 =
1 -2 7 -10 20 -16
Para dividir polinomios existe otra función llamada deconv(). Las funciones orientadas al cálculo
con polinomios son las siguientes:
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 más de las que se relacionan.
Es decir, se explica su objetivo principal pero pueden hacer más cosas de las que se mencionan.
Por ejemplo, si v = [1 2 3 4] entonces
>> 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
Tanto para una explicación más 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 función lo más
54
Funciones incorporadas en MATLAB 55
Hay funciones matemáticas elementales que operan de modo escalar. Estas funciones, que com-
prenden las funciones matemáticas trascendentales y otras funciones básicas, actúan 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
continuación. Se debe entender que si el argumento o argumentos sobre los que actúa la función
son matrices o vectores entonces dicha función actúa término a término. Ası́, si x es una matriz,
sin(x) devuelve una matriz cuyos elementos son los senos de los elementos de la matriz x.
TRIGONOMÉTRICAS
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 ángulo entre −π/2 y +π/2)
atan2(x,y) arco tangente (devuelve un ángulo 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 hiperbólico
cosh(x) coseno hiperbólico
tanh(x) tangente hiperbólica
coth(x) cotangente hiperbólica
sech(x) secante hiperbólica
csch(x) cosecante hiperbólica
asinh(x) arco seno hiperbólico
acosh(x) arco coseno hiperbólico
atanh(x) arco tangente hiperbólica
acoth(x) arco cotangente hiperbólica
asech(x) arco secante hiperbólica
acsch(x) arco cosecante hiperbólica
Funciones incorporadas en MATLAB 56
EXPONENCIALES
COMPLEJAS
DE REDONDEO Y RESTO
Hay otras funciones escalares que pueden ser consultadas a través de la ayuda en el apartado
matlab/specfun.
Las siguientes funciones actúan sobre vectores. Aquı́ se presentan sólo algunas funciones. Una
relación completa de todas las funciones soportadas por MATLAB se puede obtener consultando
la ayuda: matlab/datafun.
En realidad estas funciones se pueden aplicar también 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 función a cada columna de la matriz considerada como vector. Si estas funciones se
quieren aplicar a las filas de la matriz basta aplicar dichas funciones a la matriz traspuesta.
Las siguientes funciones exigen que el/los argumento/s sean matrices. En este grupo aparecen
algunas de las funciones más útiles y potentes de MATLAB. No están todas las que soporta
MATLAB. La relación completa se puede consultar a través de la ayuda: matlab/elmat y
matlab/matfun principalmente. Se clasificarán en varios subgrupos:
Funciones incorporadas en MATLAB 58
Los comandos A.^n y A^ n son equivalentes a las funciones power(A,n) y powerm(A,n) respec-
tivamente.
Para transferir ficheros a picasso desde el aula de ordenadores sigue las siguientes instrucciones:
61
Consejos para el uso de Matlab en picasso 62
Las ventanas de la izquierda muestran el contenido del ordenador en el que estás actuando
(el cliente) y las de la derecha el de tu cuenta en picasso (servidor).
6. En picasso cambia al directorio matlab pinchando sobre él. Si todavı́a no lo has creado
procede de la siguiente forma: Pincha con el botón derecho del ratón en cualquiera de
las ventanas correspondientes a picasso. Te aparece un menú en el que puedes seleccionar
crear directorio. Una vez hecho, aparece una ventanita con el “path” completo del
directorio que se creará. Comprueba que es correcto y escribe el nombre del directorio; en
este caso, matlab (en minúsculas).
7. Para trasladar ficheros entre el cliente y el servidor muévete al directorio que contiene el
fichero que quieres transferir y al directorio de destino. Arrastra entonces el fichero de una
ventana a la otra. Comprueba que la transferencia ha sido correcta.
Este programa de transferencia segura de ficheros puedes obtenerlo de forma gratuita en la red.
Para ello busca e instala los programas putty y FileZilla.
La primera vez que vayas a usar MATLAB en el servidor del Departamento de Matemática
Aplicada y EIO, picasso, debes hacer lo siguiente:
6. Pincha en OK
Consejos para el uso de Matlab en picasso 63
La razón es que el editor que tiene por defecto MATLAB no funciona bien (en la versión instalada
en picasso) con el sistema operativo Solaris y hay que definir uno que sı́ lo haga. Hemos
elegido gedit como editor por defecto, pero si prefieres otro (hay varios posibles) basta sustituir
/usr/bin/gedit por el correspondiente comando.
Puedes automatizar el modo de abrir MATLAB añadiendo un icono al escritorio de modo que
al pinchar sobre él se lance MATLAB. El procedimiento es el siguiente:
1. Coloca el ratón en cualquier punto libre del escritorio y haz “click” con el botón derecho.
Aparece un menú.
2. Pincha sobre Create Launcher. Aparece un cuadro con recuadros para rellenar.
7. Pincha en el cuadro grande en el que pone No Icon. Se abrirá una ventana con posibles
dibujos a utilizar.
Aparecerá el icono de MATLAB en tu escritorio. Ahora pinchando (doble click) sobre él se
deberı́a abrir MATLAB. No olvides cambiar el editor.