Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Practicas de Analisis Matricial Aplicado y Ampliacion de Metodos Numericos Con MATLAB
Practicas de Analisis Matricial Aplicado y Ampliacion de Metodos Numericos Con MATLAB
lisis
Pra
Matricial Aplicado y
n de Me
todos
Ampliacio
ricos con MATLAB
Nume
Ion Zaballa
Indice general
1. Lo B
asico
1.1. Introducci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4. Edici
on en la Lnea de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. Matrices y Vectores
2.1. Generaci
on de matrices explcitamente . . . . . . . . . . . . . . . . . . . . . . . .
11
12
2.2. Manipulaci
on de vectores y matrices . . . . . . . . . . . . . . . . . . . . . . . . .
14
20
22
24
24
25
26
26
3.2. El Camino de b
usqueda (SEARCH PATH) de MATLAB . . . . . . . . . . . . . .
27
3.3. Manipulaci
on de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.3.1. Ejecuci
on de Programas Externos
. . . . . . . . . . . . . . . . . . . . . .
30
3
4. Programaci
on en MATLAB
31
31
33
38
4.1.3. Presentaci
on de los resultados . . . . . . . . . . . . . . . . . . . . . . . . .
41
42
5. N
umeros complejos y polinomio
50
5.1. N
umeros Complejos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
51
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
55
57
57
61
61
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 relaci
on con las asignaturas Analisis Matricial Aplicado y Ampliacion de
Metodos Numericos. Por lo tanto, aqu solo se cubriran aquellos aspectos de MATLAB que
tienen relaci
on con la materia discutida en dichas asignaturas. En otros documentos, que se
entregaran en clase, se plantear
an 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
recomendaci
on 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 u
ltimos a
nos ha evolucionado de forma que hoy se puede considerar
como un software de prop
osito 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. Existen muchos otros toolboxes que, sobre la base del n
ucleo de MATLAB, proporcionan funciones
especficas para el c
alculo numerico de ciertas partes concretas de la matematica, la ingeniera
y otras ciencias. Si se quiere informaci
on sobre los productos relacionados con MATLAB puede
visitarse la p
agina 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 refieren
a matrices.
Se puede ejecutar MATLAB sobre cualquier sistema operativo. Se presupone que las practicas se
realizaran en la sala de inform
atica del Departamento de Matematica Aplicada y EIO o en una
4
Lo Basico
de las aulas de ordenadores de la Facultad de Ciencias. En el primer caso, la sala esta compuesta
de una serie de terminales gr
aficos 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 versi
on 6 los interfaces graficos 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 u
ltimas versiones de MATLAB (desde Release
14MATLAB 7) corrigen algunas deficiencias de edicion con el teclado en castellano (como
la ubicacion del smbolo [ o el acento circunflejo ^) que tenan las versiones anteriores para los
sistemas UNIX. Esto significa que las explicaciones que damos en estas notas son, en su mayora,
de aplicacion para MATLAB bajo ambos sistemas.
1.2.
Lo Basico
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. Empezando por lo u
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 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 relaci
on de las carpetas de MATLAB que contienen ayuda y una
breve descripci
on 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 funci
on y helpwin) estan disponibles tanto en modo
grafico como en modo consola. Si se trabaja en modo grafico hay, ademas, una tercera posibilidad
de ayuda m
as general. Pinchando en Help en el menu principal de MATLAB y seleccionando
Product Help aparecer
a una nueva ventana como la de la Figura 1.2 con toda la ayuda de
Lo Basico
1.4.
Edici
on en la Lnea de Comandos
Si se comete alg
un error cuando se est
a introduciendo un comando de MATLAB, no es necesario
volver a reescribir todo de nuevo. Las teclas de flechas o la combinacion de la tecla ctrl y otra
pueden ayudarte:
ctrl-
ctrl-
Inicio
Fin
Esc
Supr
Backspace
ctrl-p
ctrl-n
ctrl-b
ctrl-f
ctrl-r
ctrl-l
ctrl-a
ctrl-e
ctrl-u
ctrl-d
ctrl-h
ctrl-k
No es necesario poner el cursor al final 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 u
ltimo
Lo Basico
comando que comenzaba con esos caracteres. Sucesivas pulsaciones de producen la aparici
on
de los anteriores comandos que empiezan por las letras o smbolos escritos.
Tambien se puede utilizar el cl
asico 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 predefinidas en MATLAB.
Cargando matrices desde un fichero de datos externo.
Creando matrices con funciones definidas por el usuario/a a traves de ficheros M.
En este captulo analizaremos cada una de estas formas de generar matrices y vectores.
2.1.
Generaci
on de matrices explcitamente
La forma m
as 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 fila a fila.
Los elementos de cada fila deben estar separados por comas o espacios en blanco.
Para indicar el final de una fila se debe escribir ;.
La lista de todos los elementos debe estar encerrada entre corchetes, [ ].
9
Matrices y Vectores
10
16 3 2 13
5 10 11 8
A=
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
5 10 11
9 6 7
4 15 14
13
8
12
1
A veces el n
umero de elementos en cada fila es muy grande y es preferible introducir una fila en
cada lnea, lo u
nico que hay que hacer es terminar la lnea con tres puntos: . . . y teclear retorno.
Por ejemplo
>> A=[16
5
9
4
3 2 13; ...
10 11 8;...
6 7 12;...
15 14 1 ]
13
8
12
1
Matrices y Vectores
11
285
301
309
261
261
309
301
285
269
285
261
341
>> ans*ans
ans =
341
285
261
301
285
309
269
261
261
309
301
285
269
285
261
341
Para saber las variables que tienes definidas 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 significa.
2.1.1.
Elementos de Matrices
sqrt(3) (1+2+3)*4/5]
produce
x =
-1.3000
1.7321
4.8000
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 m
as importantes de MATLAB.
Tambien hay una serie de constantes predefinidas:
pi
i
j
eps
realmin
realmax
inf
nan
2.1.2.
3.14159265. . .
la unidad imaginaria, 1.
lo mismo que i.
precisi
on relativa de los n
umeros en coma flotante, 252 = 2,204e 16. Es decir distancia
de 1.0 al siguiente n
umero mas proximo en coma flotante.
n
umero en coma flotante mas peque
no, 21022 .
n
umero en coma flotante mas grande, (2 eps)21023 .
infinito. Se produce al dividir un n
umero distinto de cero por cero.
Not-A-Number. Se produce al evaluar expresiones como 0/0 o inf-inf.
Formatos de Salida
En el ejemplo de m
as arriba hemos podido observar que aparentemente MATLAB siempre responde 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 comando format. Estos son los posible formatos
format
format
format
format
format
format
format
format
short
long
hex
bank
short e
short g
long e
loose
format compact
format rat
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 (103 y
103 ).
Matrices y Vectores
13
/
\
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 divisi
on
por la izquierda. Si A y B son matrices y A es invertible entonces A\B = A1 B y B/A = BA1 .
Ambas producen lo mismo cuando son aplicadas a n
umeros. As 1/4 y 1 \ 4 producen el mismo
0
valor numerico: 0,25. De la misma forma A es la transpuesta de A y si a es un n
umero a0 = 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:
.
./
.\
.
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
on (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 operaci
on 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.5000
1.0000
2.0000
Que responder
a 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; s
olo 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
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
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 componentes primera y u
ltima 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 significa que una sentencia del tipo
>> k=linspace(-sqrt(3),pi);
Matrices y Vectores
16
10
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 u
ltimos 5 primeros elementos escribiramos:
>> a(1:5)
ans =
4
10
Para obtener la submatriz formada por los elementos que ocupan las posiciones donde se interceptan las filas 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 filas podemos utilizar el comando dos
puntos:
>> A([1 2],:)
ans =
16
3
5
10
2
11
13
8
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 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, 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 filas:
>> B=A([2 1 3 4],:)
B =
Matrices y Vectores
5
16
9
4
10
3
6
15
11
2
7
14
19
8
13
12
1
13
8
12
1
7
Claro que tambien podramos definir primero el vector fila que vamos a a
nadir y luego a
nadirlo:
>> r=1:2:7; C=[A;r]
C =
16
3
2
5
10
11
9
6
7
4
15
14
1
3
5
13
8
12
1
7
Si lo que queremos es a
nadir una columna actuaramos por transposicion (recordemos que r0 es
la transpuesta de r):
>> [A r]
ans =
16
5
9
4
3
10
6
15
2
11
7
14
13
8
12
1
1
3
5
7
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 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.
Hay un buen n
umero de funciones de matrices predefinidas en MATLAB. Una relacion de todas
ellas con la descripci
on 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
as elementales:
zeros(m,n)
ones(m,n)
rand(m,n)
randn(m,n)
eye(m,n)
diag(v,k)
Matrices y Vectores
diag(A,k)
21
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.
Hay otras formas de producir matrices. Comentamos a continuacion como 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 especfico donde almacenar estos y otros posibles ficheros. Hablaremos mas extensamente sobre este tema y otros relacionados cuando estudiemos el entorno de trabajo de
MATLAB. Ahora comentamos s
olo lo necesario para crear matrices a partir de ficheros externos.
Me referire a matlabdir como el directorio donde se guardaran todos los ficheros 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 ficheros 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 ficheros externos:
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 estos deben estar organizados como una tabla rectangular de n
umeros, separados
Matrices y Vectores
23
por espacios en blanco, con una fila por lnea y con igual n
umero 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 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 fichero bajo el nombre de magico.dat en el directorio matlabdir. El comando
>> load magico.dat
lee el fichero y asigna a la variable magico la matriz contenida en el fichero.
>> magico
magico =
16
5
9
4
3
10
6
15
2
11
7
14
13
8
12
1
Creando un fichero M con el contenido de una o mas matrices. Los ficheros M son parte
fundamental de MATLAB y los analizaremos posteriormente. Por ahora solo 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.
Captulo 3
3.1.
El Espacio de Trabajo
3x4
1x7
1x100
Bytes
96
56
800
Class
double array
double array
double array
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 est
a se abre como se ha mencionado mas arriba. Y si lo esta y
no se ve es que est
a 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
a la ventana del espacio de trabajo con la informacion que
proporciona el comando whos(ver la figura 3.1)
3.1.1.
En muchas ocasiones puede resultar interesante interrumpir el trabajo con MATLAB y poderlo
recuperar m
as tarde en el mismo punto en el que se dejo (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 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 pr
acticas y se puede encontrar todo lo relativo a ellos usando helpwin
26
matlab/general
3.1.2.
El Comando diary
Los comandos save y load crean ficheros 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 fichero 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 fichero filename.txt todo lo que aparece, lnea tras
lnea, en la ventana de comandos de MATLAB con posterioridad a la utilizacion 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 sesion. 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, este se salva (en Windows)
en el subdirectorio work del directorio principal de MATLAB (es decir, en la subcarpeta work
de la carpeta de instalaci
on 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 fichero filename.txt con un editor de texto es necesario que diary este 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
u Desktop se
guardan las sesiones anteriores (hasta cierto punto) especificadas por el da y la hora en que se
comenzaron.
3.1.3.
Lneas de comentarios
3.2.
27
El Camino de b
usqueda (SEARCH PATH) de MATLAB
El search path de MATLAB es una lista de directorios que se puede ver y modificar 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 definida por el usuario.
2. Comprueba si nombre1 es una funcion del usuario (hablaremos mas adelante de las funciones en MATLAB).
3. Comprueba si nombre1 es una funcion interna o intrnseca de MATLAB.
4. Comprueba si hay un fichero llamado nombre1.mex o nombre1.m en el directorio actual
(de los ficheros M hablaremos m
as adelante, los ficheros .mex tienen un significado especial
para MATLAB del que no hablaremos aqu).
5. Comprueba si hay ficheros 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 fichero que se ha encontrado. Si no se encuentra en todo el
proceso MATLAB produce un error:
>> nombre1
??? Undefined function or variable nombre1.
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
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.
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:
Cambiar
a al directorio matlab, donde posiblemente se encuentren los trabajos de MATLAB
de Julen.
Utilizar
a 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 m
as compactas).
A
nadir
a el directorio /usr/alu/julen/matlab al final del search path.
Abrira el editor de openxt y
Escibir
a Kaixo como primera lnea en la ventana de comandos de MATLAB.
Bajo Windows el fichero que producira algo parecido sera
cd c:\matlabr14\programas
format compact
addpath c:\matlabr14\programas -end
edit
disp(Kaixo)
De forma an
aloga, al abandonar la ejecucion de MATLAB con el comando quit se ejecuta
automaticamente el fichero finish.m, siempre que se encuentre en alguno de los directorios del
search path. Este fichero se puede utilizar por ejemplo para guardar el espacio de trabajo de
MATLAB (recuerda el comando save).
3.3.
Manipulaci
on de ficheros
Los comandos dir, type, delete y cd implementan un conjunto de comandos del sistema operativo 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
dir
type
delete
cd
pwd
Windows
dir
type
del o erase
cd
UNIX
ls
cat
rm
cd
pwd
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 ficheros 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.
Ejecuci
on de Programas Externos
El cierre de exclamaci
on, !, indica que el resto de la lnea es un comando del sistema operativo.
Esto puede ser u
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)
>> !textedit
parabola.m &
es una orden para abrir el editor de ficheros Text Editor que trae por defecto el sistema
Open windows de Solaris y cargar en el el fichero 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
Programaci
on en MATLAB
4.1.
Programacion en MATLAB
32
Programacion en MATLAB
33
4.1.1.
Operadores relacionales y l
ogicos
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
on. La idea es que cierta accion se realice dependiendo de si una condici
on
es verdadera o no. La verdad o falsedad de estas condiciones se suele evaluar comparando dos
expresiones. Para ello existen operadores relacionales y l
ogicos. 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 significado 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 |Aij | < 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
En efecto, la u
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 programacion, si una comparaci
on
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 comparaci
on 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
Programacion en MATLAB
36
ans =
1
1
1
1
>> isnumeric(A)
ans =
1
>> isreal(A)
ans =
1
>> isvector(A)
ans =
0
y
o
negaci
on l
ogica
o excluyente
verdad si cualquiera de los elementos de un vector es no cero
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 l
ogicos estudiamos otro comando muy u
til: 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
>> f=find(x)
f =
1
2
4
-Inf
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
>> C(:)
ans =
1
0
1
0
0
1
>> find(A<B)
ans =
1
3
6
0
1
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) estan los elementos de A que son menores que
los de B.
4.1.2.
Bifurcaciones y Bucles
Programacion en MATLAB
39
SENTENCIA WHILE.- La estructura del bucle while es muy similar a la de cualquier otro
lenguaje de programaci
on. Su sintaxis es la siguiente:
while condicion
sentencias
end
Programacion en MATLAB
40
donde condici
on puede ser una expresion vectorial o matricial. Las sentencias se siguen ejecutando 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 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:
for variable= expresi
on
sentencias
end
Habitualmente la expresi
on es un vector de la forma i:s:j y las sentencias se ejecutan sucesivamente con la variable igual a cada elemento de la expresi
on. Por ejemplo, para sumar los 25
primeros terminos de la serie n1 :
>> n=0;
>> for i=1:25
n=n+1/i;
end
>> n
n =
3.8160
Otra forma de definir una expresi
on 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
4.1.3.
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
Presentaci
on de los resultados
Si en MATLAB hacemos
>> v=1:5
la respuesta es la exposici
on del resultado
v =
1
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 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])
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
4.2.
Scripts y Funciones
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 programacion 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
un prop
osito concreto. Un fichero M puede hacer referencia a otros
ficheros M e incluso a s mismos (es decir, esta permitida la autorecursividad). Los ficheros M
son especialmente apropiados para
Programacion en MATLAB
43
experimentar con algoritmos escribiendoles en un fichero sobre el que poder hacer correcciones 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 grafico,
construir programas que pueden ser utilizados con posterioridad varias veces,
o, simplemente, intercambiar con alg
un amigo o colega ficheros de mutuo interes.
En la pagina web de Mathworks mencionada en la Introduccion pueden encontrarse numerosos
ficheros M escritos con distintos prop
ositos, desde puramente computacionales a didacticos o
por puro placer.
Hay dos tipos de ficheros M:
Sripts o ficheros 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 graficos 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 funci
on (salvo que sean declaradas como global)
Ya hemos visto en la secci
on anterior como hacer ficheros M de tipo script. Simplemente son
ficheros que ejecutan sucesivamente varios comandos de MATLAB con un objetivo especfico
y siempre que se ejecutan producen el mismo resultado. Volveremos sobre ellos mas adelante
para recalcar su diferencia con el otro tipo de ficheros 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 Scientific Computation de Charles F. van Loan.
Sabemos de c
alculo elemental que la serie de Taylor
Tn (x) =
n
X
xk
k=0
k!
aproxima la funci
on exponencial, ex , cerca de x = 0. Nuestro objetivo es estudiar esta aproximacion. Es decir, cu
an cerca est
a Tn (x) de ex para los diversos valores de n? Teoricamente cuanto
mayor es n m
as cerca est
a Tn (x) de ex . Para que valores de n nuestro ordenador no distingue
x
entre Tn (x) y e ?. Para ello damos por bueno el calculo que hace MATLAB de la exponencial y
creamos una funci
on de MATLAB que nos devuelva el valor de Tn (x) en funcion de x y n. Esta
funcion sera la siguiente:
function y= miexp1(x,n)
%
%Precondiciones: acepta dos valores x=n
umero 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 fichero 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 fichero s
olo puede ser
el que hemos dado a la funci
on. Debemos tener cuidado, ademas, con que el nombre de la funci
on
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
on en MATLAB debes seguir unas pocas, simples e importantes reglas:
El fichero debe empezar con la palabra function y tiene la siguiente estructura
function variables de salida= Nombre de la funci
on(variables de entrada)
%
% Comentarios que definen completamente las variables que deben pasarse a la funci
on
% (variables de entrada) y el resultado que produce la funci
on (variables de salida)
%
cuerpo de la funci
on: 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 definen completamente la funcion deben hacerse inmediatamente
despues de la definici
on 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 clarificar 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 funci
on 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 aproximaci
on de Taylor de tercer orden en 0,1.
Programacion en MATLAB
45
Las variables que se definan 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 fichero que contiene la funci
on 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 graficas 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 lneas en un fichero .m (por ejemplo, smiexp1.m) tenemos un script que al
ejecutarlo en MATLAB
>> smiexp1
nos produce cuatro gr
aficas (figura 4.3), cada una correspondiente a un valor de n, con el
error relativo de la aproximaci
on. Observese el efecto del comando subplot(n,m,p). Crea una
matriz de nm figuras y asigna a la p-esima el siguiente comando plot. As p=1 corresponde a
la figura en al posici
on (1, 1), p=2 a la figura 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 funci
on exponencial obteniendo otro vector de 100 componentes que hemos llamado
exacto. Sin embargo, para calcular Tn (x) hemos tenido que hacerlo componente a componente.
Ello es debido a que la funci
on miexp1 solo acepta escalares y devuelve escalares. MATLAB
esta pensado para trabajar con vectores, y como veremos enseguida lo hace mas rapido. Conviene
que modifiquemos nuestra funci
on para que admita vectores y produzca vectores. La modificaci
on
es muy sencilla: hay que redefinir 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
6
n= 4
n= 8
x 10
0.02
7
6
0.015
5
4
0.01
3
2
0.005
1
0
1
0.5
15
0.5
0
1
16
n=16
x 10
0.5
0.5
0.5
n=20
x 10
7
6
5
4
4
3
2
1
0
1
0.5
0.5
0
1
0.5
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 u
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
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 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
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 s
olo depende del codigo que se emplee sino, sobre todo, de las caractersticas 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 u
ltima observaci
on. 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 aproximaci
on de exp(x) mediante
% la aproximaci
on 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 m
as 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 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
5.1.
N
umeros Complejos
2.0000 + 1.0000i
50
N
umeros complejos y polinomio
3.0000 + 1.0000i
51
0 + 1.0000i
>> Atc=A
Atc =
1.0000 + 1.0000i
2.0000 - 1.0000i
3.0000 - 1.0000i
0 - 1.0000i
>> At=A.
At =
1.0000 - 1.0000i
2.0000 + 1.0000i
3.0000 + 1.0000i
0 + 1.0000i
5.2.
C
alculo con Polinomios
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
>>[1, 0, -8, 6, -10].
MATLAB puede realizar diversas operaciones sobre el, como por ejemplo evaluarlo para un
determinado valor de x (funci
on polyval()) y calcular las races (funcion roots()):
>> pol=[1 0 -8 6 -10]
pol =
1
-8
-10
>> roots(pol)
ans =
-3.2800
>> polyval(pol,1)
2.6748
0.3026 + 1.0238i
0.3026 - 1.0238i
N
umeros complejos y polinomio
52
ans =
-11
Hay una funci
on similar a polyval pero para matrices: la funcion plyvalm. Dada una matriz
A y polinomio p() = pol, la funci
on polyvalm(pol,A) devuelve la matriz p(A). As con el
polinomio pol=[1 0 -8 6 -10] definido mas arriba:
>> A=ceil(rand(3,3)*5-7)
A =
-2
-5
-3
-4
-2
-3
-4
-6
-2
>> polyvalm(pol,A)
ans =
3130
3818
2568
2896
3526
2370
3688
4476
2998
Para calcular el producto de polinomios MATLAB utiliza una funcion llamada conv() (de
producto de convoluci
on). 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
>> pol3=conv(pol1,pol2)
pol3 =
1
-2
-10
20
-16
Para dividir polinomios existe otra funcion llamada deconv(). Las funciones orientadas al calculo
con polinomios son las siguientes:
poly(A)
N
umeros complejos y polinomio
poly(v)
roots(pol)
polyval(pol,x)
polyvalm(pol,A)
conv(p1,p2)
[c,r]=deconv(p,q)
residue(p1,p2)
polyder(pol)
polyder(p1,p2)
polyfit(x,y,n)
53
Ap
endice A
0
0
3
0
0
0
0
4
0
2
0
0
0
0
0
3
0
0
0
0
0
4
0
55
A.1.
TRIGONOMETRICAS
sin(x)
cos(x)
tan(x)
cot(x)
sec(x)
csc(x)
asin(x)
acos(x)
atan(x)
atan2(x,y)
acot(x)
asec(x)
acsc(x)
sinh(x)
cosh(x)
tanh(x)
coth(x)
sech(x)
csch(x)
asinh(x)
acosh(x)
atanh(x)
acoth(x)
asech(x)
acsch(x)
seno
coseno
tangente
cotangent
secante
cosecante
arco seno
arco coseno
arco tangente (devuelve un angulo entre /2 y +/2)
arco tangente (devuelve un angulo entre y +); se le
pasan 2 argumentos, proporcionales al seno y al coseno
arco cotangente
arco secante
arco cosecante
seno hiperb
olico
coseno hiperbolico
tangente hiperbolica
cotangente hiperbolica
secante hiperbolica
cosecante hiperbolica
arco seno hiperbolico
arco coseno hiperbolico
arco tangente hiperbolica
arco cotangente hiperbolica
arco secante hiperbolica
arco cosecante hiperbolica
funci
on exponencial
logaritmo natural (neperiano)
logaritmo decimal
logaritmo en base 2
raz cuadrada
potencia que da error si x no es real
logaritmo neperiano de n
umeros reales
raz cuadrada de n
umeros mayores o iguales a cero
COMPLEJAS
abs(x)
angle(x)
complex(x,y)
conj(x)
real(x)
imag(x)
isreal(x)
DE REDONDEO Y RESTO
sign(x)
rem(x,y)
mod(x,y)
round(x)
fix(x)
floor(x)
ceil(x)
gcd(x,y)
lcm(x,y)
56
57
Hay otras funciones escalares que pueden ser consultadas a traves de la ayuda en el apartado
matlab/specfun.
A.2.
mean(x)
std(x)
prod(x)
cumprod(x)
[y,i]=sort(x)
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 funci
on 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.
A.3.
Las siguientes funciones exigen que el/los argumento/s sean matrices. En este grupo aparecen
algunas de las funciones m
as u
tiles y potentes de MATLAB. No estan todas las que soporta
MATLAB. La relaci
on completa se puede consultar a traves de la ayuda: matlab/elmat y
matlab/matfun principalmente. Se clasificaran en varios subgrupos:
58
trace(A)
[m,n] = size(A)
numel(A)
Los comandos A.^n y A^ n son equivalentes a las funciones power(A,n) y powerm(A,n) respectivamente.
FUNCIONES PARA MANIPULAR MATRICES
cat(Dim,A,B)
reshape(A,m,n)
diag
blkdiag(A,B)
tril(A)
triu(A)
fliplr(A)
end(A)
FUNCIONES DE ANALISIS
MATRICIAL
n=norm(v)
n=normest(A)
r=rank(A)
d=det(A)
t=trace(A)
N=null(A)
Q=orth(A)
subspace1(A,B)
AyB
DE MATRICES Y
FUNCIONES DE FACTORIZACION
[Q,R]=qr(A)
d = det(A)
E = rref(A)
U = chol(A)
soluci
on de sistemas lineales (ver la ayuda help slash)
inversa de A
n
umero de condicion de A en la norma `2 . Hay una variante
para otras normas
descomposicion de Cholesky de una matriz definida positiva
descomposicion LU (con pivotamiento) de la matriz A. Es
decir, P A = LU , P una matriz de permutacion, L triangular
inferior con 1s en la diagonal y U una matriz triangular
superior.
descomposicion QR de A
Determinante de la matriz cuadrada A
reducci
on a forma de escalera por filas de una matriz rectangular A
descomposicion de Cholesky de una matriz definida positiva
59
H=hess(A)
[U,S]=schur(A)
[U,S]=rsf2csf(U,R)
[U,S]=cdf2rdf(U,R)
60
Ap
endice B
Para transferir ficheros a picasso desde el aula de ordenadores sigue las siguientes instrucciones:
1. Selecciona Programas ->FileZilla Ftp Client ->Filezilla . Veras el siguiente icono:
2. Aparecer
a la siguiente ventana
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 crear
a. Comprueba que es correcto y escribe el nombre del directorio; en
este caso, matlab (en min
usculas).
7. Para trasladar ficheros entre el cliente y el servidor muevete 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.
Una vez terminada la transferencia, sal de FileZilla.
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.
B.2.
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
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 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
nadiendo un icono al escritorio de modo que
al pinchar sobre el se lance MATLAB. El procedimiento es el siguiente:
1. Coloca el rat
on 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 dem
as 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.