SlideShare una empresa de Scribd logo
1 de 280
Descargar para leer sin conexión
Matlab en cinco lecciones de Num´erico
V´ıctor Dom´ınguez B´aguena Ma Luisa Rap´un Banzo
Febrero de 2006
Disponible en
http://www.unavarra.es/personal/victor dominguez/
Borrador
Prefacio
El origen de este libro es una asignatura de libre elecci´on que uno de los autores im-
parti´o durante los cursos 2004–2005 y 2005–2006 en la Universidad P´ublica de Navarra.
Nuestra intenci´on original era tratar temas algo avanzados de C´alculo Cient´ıfico y utilizar
Matlab como v´ıa para su aprendizaje. Los alumnos, obviamente, estaban m´as interesados
en aprender Matlab y ve´ıan el Num´erico como forma de probar y ensayar las diferentes
herramientas de Matlab que se iban exponiendo en clase. Desafortunadamente, la forma-
ci´on en Num´erico de nuestros alumnos nos oblig´o a relajar considerablemente el contenido
matem´atico del curso y a ser m´as modestos, desde el punto de vista te´orico, en nuestros
objetivos. El resultado final en su vertiente matem´atica se podr´ıa enmarcar sin problemas
en un curso introductorio de C´alculo Num´erico. En cuanto a Matlab, creemos que hemos
tratado todos sus aspectos fundamentales aunque en ocasiones sea de forma superficial.
Nuestro objetivo era conseguir no tanto un conocimiento muy profundo de Matlab como
el de colocar al alumno en una buena posici´on de arranque para un autoaprendizaje.
El enfoque y los temas tratados son consecuencia de diversos factores entre los que
conviene citar nuestro propio bagaje matem´atico1
, el uso que hemos tenido que hacer de
Matlab en nuestra carrera investigadora y, como ya hemos mencionado, los conocimientos
de partida que ten´ıan nuestros propios alumnos. Hemos insistido bastante en la manip-
ulaci´on de vectores y matrices y a la programaci´on en forma vectorizada. ´Esta es una
de las diferencias m´as acusadas con los lenguajes de programaci´on tradicionales y una
implementaci´on eficiente en Matlab pasa necesariamente por la vectorizaci´on.
Los apuntes est´an organizados en torno a temas o lecciones, cada cual dividido en dos
partes, la primera de Matlab y la segunda con un tema espec´ıfico de C´alculo Num´erico.
En la primera parte se presentan los aspectos instrumentales de Matlab que utilizaremos
en la implementaci´on de los algoritmos de la parte de Num´erico. La longitud de cada
parte es variable, y dependiente de la dificultad tratada ya sea en la parte instrumental
(Matlab) o en la parte matem´atica. De tanto en tanto nos hemos permitido hacer algo de
Matem´aticas tratando de presentarlas en la forma m´as simple posible.
A lo largo de estas p´aginas el lector podr´a encontrar ejercicios, algunos de ellos resuel-
tos, que tratan de ahondar en puntos espec´ıficos, matem´aticos e inform´aticos. Finalmente
se han introducido algunas notas hist´oricas que describen brevemente la evoluci´on que han
tenido las ideas a lo largo del tiempo. Con ello tratamos de combatir la idea gaussiana,
demasiado extendida, de las Matem´aticas como un mundo est´atico, monol´ıtico y perfecto
donde la teor´ıa se presenta cerrada y completa. Las Matem´aticas en general y el C´alculo
Cient´ıfico en particular recorren un largo trecho antes de llegar a este estado, durante
el cual brotan ideas constantemente, siempre prometedoras en un primer momento, que
1
modelado por nuestra formaci´on cient´ıfica, com´un en muchos aspectos.
i
Borrador
evolucionan con los a˜nos, con muchas de ellas desechadas finalmente e incluso algunas
rescatadas a˜nos despu´es de considerarse como v´ıas muertas.
Hemos adjuntado al final una bibliograf´ıa utilizada en este texto. Nos gustar´ıa resaltar
tres textos sobre los dem´as. En primer lugar, Numerical Computing with Matlab, de Cleve
Moler, que descubrimos cuando and´abamos en la redacci´on de la Lecci´on II. Su sencillez
y la buena elecci´on de ejemplos ha ejercido una influencia considerable en estas notas.
El segundo libro es ya un cl´asico entre los que aprendimos Matlab hace algunos a˜nos.
And´abamos entonces en la b´usqueda de recursos en la web cuando nos encontramos con
unos apuntes muy completos de libre divulgaci´on. Nos referimos al libro de Garc´ıa de
Jal´on y sus colaboradores, Aprenda Matlab ?.? como si estuviera en primero. Diferentes
versiones de estos apuntes llevan cubriendo de forma incansable la evoluci´on de Matlab
desde la versi´on 4.0.
Por ´ultimo, aunque no es un texto propiamente, la enciclopedia libre on line Wikipedia2
ha sido utilizada profusamente para obtener datos y fuentes utilizadas en la redacci´on de
este texto. Debemos se˜nalar que estas informaciones han sido debidamente contrastadas.
A pesar de algunos problemas iniciales, es seguro que la influencia de esta enciclopedia
libre crecer´a exponencialmente en el futuro.
Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayas
que se ofreci´o muy generosamente a revisar este libro. Sus numerosas y acertadas indica-
ciones y sugerencias han contribuido, y mucho, en la redacci´on final de este texto.
Pamplona, Febrero de 2006 V´ıctor Dom´ınguez B´aguena
Ma
Luisa Rap´un Banzo
2
http://www.wikipedia.org
ii
Borrador
A Javier
Amigo y maestro.
Borrador
Borrador
Cap´ıtulo 1
Introducci´on
... and the first lesson of all was the basic trust that he
could learn. It is shocking to find how many people do
not believe they can learn, and how many more believe
learning to be difficult.
Dune
Frank Herbert
1.1. ¿Qu´e es?
Matlab es un entorno de trabajo para el c´alculo cient´ıfico. Programado originalmente
por Cleve Moler a finales de los a˜nos 70, su finalidad original era proporcionar una forma
sencilla de acceder a las librer´ıas LINPACK y EISPACK donde est´an implementadas de una
forma altamente eficiente los algoritmos clave del an´alisis matricial1
. De hecho, Matlab es
una abreviatura de Matrix Laboratory
Su primera implementaci´on se hizo en Fortran que era, y en buena medida a´un sigue
si´endolo, el lenguaje est´andar en la implementaci´on de m´etodos num´ericos2
. Posterior-
mente se reimplement´o en C, que es como se encuentra en la actualidad.
Las aplicaciones de Matlab se fueron extendiendo a otras ramas del c´alculo cient´ıfico
y de las ciencias aplicadas en general, dot´andole de una gran popularidad en ambientes
cient´ıficos (especialmente en Ingenier´ıa). Dichas extensiones se consiguieron en gran parte
mediante la implementaci´on de toolboxes, librer´ıas escritas en el lenguaje de programaci´on
propio de Matlab y que ampliaban el rango de problemas que pod´ıan resolverse.
Sin miedo a equivocarse, se pueden enunciar las siguientes ´areas donde Matlab muestra
un gran potencial:
´algebra lineal num´erica;
procesamiento de se˜nales (an´alisis, compresi´on de datos,..);
1
por ejemplo, el m´etodo de Gauss, el c´alculo de las descomposiciones m´as habituales del ´algebra
matricial num´erica (LU, LL , QR), m´etodos iterativos,...
2
Fortran significa Formula translation. Desarrollado por IBM en 1954, es considerado como el primer
lenguaje de alto nivel. Las ´ultimas actualizaciones (Fortran 95 y Fortran 2003) han dado nuevo vigor a
este veterano lenguaje de programaci´on.
1
Borrador
dise˜no de sistemas de control;
salidas gr´aficas;
estad´ıstica;
simulaci´on de sistemas din´amicos.
La extensa gama de problemas que cubre hace de Matlab un lenguaje dif´ıcil de entender
y manejar en su completitud. Esto no quiere decir que sea inarbodable: el conocimiento
base que permite empezar a trabajar es muy sencillo. No obstante el elevado n´umero de
comandos que se encuentra a disposici´on del usuario3
provoca que en ocasiones existan
problemas no s´olo para encontrar los comandos adecuados sino tambi´en para tener una
idea de qu´e posibilidades exactamente ofrece Matlab en un problema o tarea en particular.
1.2. ¿C´omo trabaja?
El lenguaje de programaci´on de Matlab es bastante m´as flexible que el de los lenguajes
tradicionales. No es preciso la declaraci´on inicial de variables, ´estas se pueden introducir
en el momento que se necesiten, y por ejemplo, vectores y matrices pueden declararse
sin especificar sus dimensiones e incluso cambiar sus tama˜nos sobre la marcha. Ello per-
mite una programaci´on algo m´as desordenada, aunque debe tenerse bien claro que una
programaci´on cl´asica, m´as al uso, suele generar c´odigo m´as eficiente.
Por otro lado, una gran cantidad de m´etodos num´ericos se encuentran implementados
de una forma muy eficiente y son accesibles como simples comandos. De esta forma, Mat-
lab se puede utilizar como una caja negra: el usuario pregunta y el ordenador responde sin
que ´este tenga que preocuparse de qu´e tipo de operaciones se han efectuado por el camino.
De todas formas es conveniente tener una idea de qu´e m´etodos se est´an utilizando para
as´ı ser conscientes de en qu´e condiciones van a funcionar, cu´al es en cada caso el m´eto-
do adecuado, y especialmente el significado de los, posiblemente, numerosos argumentos
opcionales que controlan el funcionamiento del algoritmo.
A priori se pueden distinguir dos tipos de funciones en Matlab: funciones compiladas
(Built in functions) y funciones no compiladas. Las primeras est´an optimizadas, son pro-
gramas ya compilados y con el c´odigo no accesible para el usuario. Como ejemplos se
pueden citar
operaciones fundamentales +, *,. . . .
las funciones matem´aticas b´asicas (sin, cos, exp, log,. . . )
algoritmos b´asicos del ´Algebra Lineal (inv, det, lu, chol, qr,...)
s´alidas gr´aficas (plot, surf,...)
3
A modo de ejemplo, estos comandos cubren salidas gr´aficas: plot, line, ezplot, ezsurf, surf,
surfc, line, patch, plot3, contour, contourf, ezcontour, pcolor, trimesh, trisurf,...
2
Borrador
Las funciones no compiladas est´an escritas siguiendo el lenguaje de programaci´on
propio de Matlab. Estos comandos se guardan en ficheros *.m que es la extensi´on est´andar
de los ficheros de Matlab4
.
Originalmente, Matlab funcionaba como un interprete. Es decir, cada l´ınea de c´odigo
era traducido antes de su ejecuci´on. Ello hac´ıa que una programaci´on similar a lenguajes
cl´asicos de programaci´on diera lugar a c´odigo poco eficiente.
Este problema se puede subsanar en gran medida recurriendo a la programaci´on vec-
torizada. El siguiente ejemplo muestra las diferencias con una programaci´on est´andar
No vectorizada
y=zeros(1,1000);
h=2*pi/999;
for i=0:999
y(i+1)=sin(h*i);
end
Vectorizada
y=sin(linspace(0,2*pi,1000));
En la primera parte del c´odigo, encontramos una estructura t´ıpica en los lenguajes de
programaci´on: el comando for. Su significado es claro: las l´ıneas comprendidas entre el for
y end se repiten 1000 veces con la variable i tomando valores de 0 a 999. El resultado final
es el vector fila y que recoge el valor del seno en 1000 puntos uniformemente espaciados
en [0, 2π].
Por otro lado, el comando linspace devuelve un array que contiene 1000 puntos
equidistantes entre 0 y 2π. La funci´on seno es aplicada sobre todo el array devolviendo
un vector con estos valores que se guarda en y. La diferencia entre ambas formas de
programar es ahora patente. Mientras que en la primera realizamos 1000 llamadas a la
funci´on seno con un argumento por llamada, en la segunda hay una ´unica llamada donde
se requiere el c´alculo del seno en 1000 puntos, y el resultado se devuelve en un vector con
estos valores (y por tanto tambi´en de longitud 1000).
Desde el punto de vista de Matlab el segundo c´odigo es m´as eficiente. Habitualmente,
la vectorizaci´on lleva consigo una reducci´on del c´odigo a la vez que se incrementan las
necesidades de memoria.
Con Matlab 6.5 se inici´o un proyecto a m´as largo plazo consistente en la aceleraci´on
(Performance Acceleration) de las versiones no vectorizadas dirigida a estrechar las difer-
encias con los lenguajes cl´asicos de alto nivel como Fortran, C o Pascal5
. En cualquier caso,
la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en contraste
con operaciones elemento a elemento como en los lenguajes tradicionales, es algo que
conviene explotar por las importantes ventajas que proporciona.
4
Tambi´en est´a la extensi´on *.mat, propia de ficheros de datos.
5
De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecuci´on entre los dos c´odigos
expuestos.
3
Borrador
1.3. ¿C´omo aprenderemos?
Como ya hemos se˜nalado anteriormente, aprender a manejar Matlab en su totalidad
est´a fuera de los contenidos de un curso introductorio como ´este. No as´ı aprender los
fundamentos y preparar el terreno para un autoaprendizaje de las partes en las que cada
uno est´e interesado. Encontramos en este punto dos dificultades que salvar: saber de la
existencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primera
es la mayor dificultad. No obstante los comandos llevan siempre nombres nemot´ecnicos
para facilitar su memorizaci´on. Las funciones de ayuda tambi´en echan una mano.
Como a programar se aprende programando, comenzaremos escribiendo c´odigo desde
los primeros pasos. Los esquemas num´ericos que implementaremos se encuentran pr´acti-
camente en cualquier curso introductorio de An´alisis Num´erico. En cada lecci´on imple-
mentaremos dichos algoritmos, introduciendo ´ordenes, estructuras de decisi´on, datos,...
seg´un sea necesario.
En los apuntes se incluyen m´ultiples ejercicios cuya realizaci´on ayudar´a al aprendizaje
de la asignatura. Estos apuntes no deben tomarse como un manual en el estilo usual, sino
como una forma de aprender Matlab y repasar o aprender el An´alisis Num´erico b´asico.
Ya existen manuales extensos y concienzudos, en la bibliograf´ıa citamos algunos de ellos,
que pueden servir para ese fin.
4
Borrador
Lecci´on I
Primeros pasos en Matlab.
M´etodos directos para sistemas de ecuaciones
lineales
5
Borrador
Borrador
Introducci´on
When asked whether a programming language supports
matrices, many people will think of two-dimensional
arrays and respond, “Yes.” Yet matrices are more than
two-dimensional arrays -they are arrays with operations.
It is the operations that cause matrices to feature so
prominently in science and engineering
G.W. Stewart, Matrix Algorithms
Comenzaremos en la primera parte de esta lecci´on tratando nociones b´asicas de Matlab,
introduciendo el entorno de trabajo y las estructuras b´asicas de programaci´on. En segundo
lugar entraremos en uno de los detalles fuertes de Matlab, la manipulaci´on de vectores y
matrices.
En la parte matem´atica estudiaremos m´etodos directos para la resoluci´on de sis-
temas de ecuaciones lineales. En la implementaci´on de estos algoritmos repasaremos los
conocimientos de Matlab expuestos en la primera parte.
7
Borrador
Borrador
Cap´ıtulo 2
Matlab: Primeros pasos
2.1. Entorno de trabajo
En las primeras secciones comenzaremos explorando Matlab de la forma m´as simple, en
modo comando: el usuario pregunta y Matlab responde. El interfaz de Matlab es bastante
pobre, con un aspecto est´etico que en modo alguno es comparable al de programas como
Maple o Mathematica. El modo interactivo de trabajar es sencillo aunque algo inc´omodo. A
modo de ejemplo, requiere algo de esfuerzo editar instrucciones ejecutadas con anterioridad
y manejarse con bloques de comandos es muy engorroso. ´Este y otros problemas del modo
interactivo se subsanan en gran medida empaquetando instrucciones con ficheros script
y/o programando en funciones (subrutinas) que es la forma natural de trabajar en Matlab.
En un segundo paso, se puede implementar un interfaz gr´afica, las guides de Matlab, que
hacen m´as amigable la comunicaci´on con el usuario.
En la Figura 2.1 podemos ver el aspecto inicial de Matlab. Distinguimos las siguientes
ventanas
Command window: ventana donde podemos ejecutar los comandos;
Ventanas auxiliares: command history, workspace, current directory que informan
sobre (y permiten editar) los comandos insertados, las variables declaradas y el
directorio en el que estamos trabajando.
Ventana de ayuda: en una ventana independiente proporciona un acceso completo
a las funciones de ayuda de Matlab, incluyendo b´usquedas, demostraciones, etc.
´Estas son las caracter´ısticas b´asicas que debemos considerar:
El prompt de Matlab es >>. El usuario escribe a continuaci´on.
Para ejecutar se pulsa la tecla Enter.
Se pueden recuperar comandos anteriores navegando con las flechas ↑ y ↓.
Cuando se trabaje en Matlab, debemos tener muy en cuenta que:
Se distinguen may´usculas y min´usculas.
9
Borrador
2.1 Entorno de trabajo LECCI´ON I
Figura 2.1: Pantalla Principal.
Todos los comandos de Matlab se escriben en min´usculas y los argumentos se env´ıan
entre par´entesis separados por comas.
El car´acter % se utiliza para insertar comentarios. Todo lo que sigue (en la misma
l´ınea) es ignorado por Matlab.
Si se teclea al final de una instrucci´on ’;’ ´esta se ejecuta pero el resultado no se
visualiza por pantalla.
Dos comandos se pueden insertar en la misma l´ınea separados por “,” o por “;”. La
diferencia entre los dos es que con “,” se muestran los resultados de las operaciones
mientras que con “;” la operaci´on se ejecuta pero no se visualiza.
Ejercicio 2.1 Ejecuta las instrucciones
>> 4+4 % mi primera operacion
>> 3^4, 4/9
>> 3^4; 4/9
>> 3^4, 4/9;
>> 3^4; 4/9;
10
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
y observa la salida.
Haremos algunos comentarios sobre el ejercicio anterior. El circunflejo ^ es la poten-
ciaci´on:
>> 3^5
ans=
243
El t´ermino ans es la primera variable que vemos de Matlab. Concretamente, guarda la
´ultima salida dada por Matlab (answer):
>> 4+6
ans =
10
>> ans*2
ans =
20
>> ans*2
ans =
40
La ra´ız cuadrada se puede calcular bien elevando a 1/2 (^(1/2)) o bien utilizando sqrt.
Ejercicio 2.2 Comprueba la diferencia entre
4/4+6 4/(4+6) 3^5*2 3^(5*2)
Nota. La prioridad de ejecuci´on entre operaciones matem´aticas es la habitual: primero
se calcula la potenciaci´on ^, posteriormente los productos y divisiones *, / y en ´ultimo
lugar, las sumas y restas + y -. Este orden se puede cambiar utilizando los par´entesis.
La regla es sencilla: dada una expresi´on, lo primero que se calcula es lo que est´a dentro
de cada par´entesis. Esta regla es recursiva, es decir, si dentro de un par´entesis hay otros
par´entesis, para evaluar el primero se empezar´a con los par´entesis interiores.
Los n´umeros reales se pueden insertar tambi´en en notaci´on cient´ıfica, muy adecuada si
se trata de n´umeros grandes o muy peque˜nos (en valor absoluto). As´ı, se tiene la siguiente
regla de construcci´on:
m · 10r
m er
11
Borrador
2.1 Entorno de trabajo LECCI´ON I
Por ejemplo
0.005 5e − 3 115 · 1012
115e12
−1201200000 −1.2012e009 0.00031415 3.1415e − 004
Existen adem´as dos n´umeros especiales: inf y NaN. El primer signo representa la can-
tidad infinita (∞). El segundo es una abreviatura de “no es un n´umero” (Not a Number)
y es el resultado que se devuelve ante una operaci´on indefinida como 0/0. Este s´ımbolo
se puede utilizar en ´ambitos, en principio tan extra˜nos, como en el dibujo de superficies
(v´er la Lecci´on V).
En general los resultados num´ericos se presentan con cuatro cifras decimales correctas,
aunque todas las operaciones se ejecutan en doble precisi´on1
. Si se desean las salidas con
toda la precisi´on disponible se debe insertar la instrucci´on
>> format long
A partir de este punto, el resultado de cualquier operaci´on se mostrar´a con 16 cifras
significativas. La instrucci´on
>> format short
devuelve a la forma est´andar con cuatro cifras decimales. Existen m´as opciones con format.
Las siguiente l´ıneas muestran algunas de ellas:
>> pi % el numero pi
ans =
3.1416
>> format long % mayor precision
>> pi
ans =
3.14159265358979
>> format compact % compacto
>> pi
ans =
3.14159265358979
>> format bank %No fijo de cifras decimales
>> pi
ans =
3.14
1
Aproximadamente 16 cifras decimales correctas. En el momento de redactar estas l´ıneas, los proce-
sadores de 32 bits dominan todav´ıa el parqu´e de ordenadores. Las nuevas generaciones, con procesadores
con 64 bits, duplican la precisi´on de trabajo.
12
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
>> format rat %salidas en forma fraccionaria
>> pi
ans =
355/113
>> format loose % mas espaciada
>> pi
ans =
355/113
Observa la diferencia de espaciamiento que se obtiene con las opciones compact y loose.
N´umeros complejos
La aritm´etica compleja se encuentra tambi´en integrada en Matlab. La unidad imagi-
naria (
√
−1) se representa en Matlab con i ´o j:
>> clear i j % borramos posibles valores de i y j
>> i^2
ans=
-1
>> j^2
ans=
-1
El signo i suele ser habitual en Matem´aticas mientras que en diversas ramas de la F´ısica
y en Ingenier´ıa de Telecomunicaciones o El´ectrica se prefiere el s´ımbolo j (en este caso
para no confundir con la intensidad de corriente el´ectrica). De ah´ı que Matlab permita
ambas representaciones.
Todas las operaciones matem´aticas incluyen la aritm´etica compleja en el sentido usual
>> 1+i +5-6i % suma de dos numeros complejos
ans =
6.0000 - 5.0000i
>> (5+3i)*(5-3i), (1+2i)/(3-4i)
ans =
13
Borrador
2.2 Comandos de ayuda LECCI´ON I
34.00
ans =
-0.20
+
>> conj(3e-3+2e-4i) % conjugado
ans =
0.0030 - 0.0002i
>> abs(3+4i), angle(2i) % modulo y argumento
ans =
5
ans =
1.5708
2.2. Comandos de ayuda
La ayuda de Matlab es ciertamente muy clara y completa. Los comandos siempre
dispuestos a echarnos una mano son:
help: muestra una ayuda por pantalla, en la ventana de comandos, con la informa-
ci´on esencial sobre un comando concreto.
helpwin: similar a help pero despliega la ayuda en una ventana auxiliar, permitien-
do as´ı una navegaci´on, estilo web, muy c´omoda.
lookfor: permite buscar una cadena en la primera l´ınea de todos los ficheros de
ayuda.
Por ejemplo, si deseamos ayuda sobre la funci´on sin, podemos ejecutar
>> help sin
SIN Sine.
SIN(X) is the sine of the elements of X.
Overloaded methods
help sym/sin.m
14
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
Figura 2.2: Pantalla de ayuda.
o bien
>> helpwin sin
y obtener la pantalla que se muestra en la Figura 2.3. Adem´as, si aparece el enlace “Go to
online doc for ...”, ´este nos permite navegar entre una ayuda mucho m´as completa
donde se muestran ejemplos y detalles sobre la implementaci´on del comando (ver la Figura
2.42
).
Ejercicio 2.3 Utilizando las funciones de ayuda, obtener informaci´on de alguna de estas
funciones elementales de Matem´aticas
sin cos tan asin acos atan
sec csc cot asec acsc acot
sinh cosh tanh asinh acosh atanh
exp log log10 log2 sign
Mediante la instrucci´on
2
Para que esta opci´on est´e disponible es necesario que se haya instalado la ayuda completa de Matlab.
A partir de la versi´on 6.0 la instalaci´on consta de (al menos) dos CDs, el primero con el programa y las
librer´ıas habituales y el segundo con la documentaci´on de la ayuda.
15
Borrador
2.3 Variables LECCI´ON I
Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opci´on Go to online doc...
>> help +
se pueden adem´as visualizar las operaciones “elementales” seg´un Matlab.
2.3. Variables
Matlab no necesita la declaraci´on de variables como en un lenguaje tradicional. En prin-
cipio todas las variables son reales, y basta hacer uso de ellas para que queden declaradas:
>> a=1; b=2; c=3;
>> a-b
ans =
-1
>> a*b*c
ans =
16
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
Figura 2.4: Ayuda on line.
6
El comando who sirve para conocer los nombres de las variables declaradas, mientras
que con whos obtenemos una informaci´on m´as precisa:
>> who
Your variables are:
a b c
>> whos a
Name Size Bytes Class
a 1x1 8 double array
Grand total is 1 element using 8 bytes
Para borrar una variable se utiliza la instrucci´on clear, por ejemplo,
17
Borrador
2.3 Variables LECCI´ON I
>> a=4;
>> whos a
Name Size Bytes Class
a 1x1 8 double array
Grand total is 1 element using 8 bytes
>> clear a
>> whos a
>>
borra la variable (es decir, whos no devuelve nada). Con la orden
>> clear all
se borran todas las variables declaradas hasta el momento.
Nota. En Matlab es correcto declaraciones de este tipo
>> sin=1;
>> sin+1
ans=
2
De esta forma sin pasa a ser una variable que sobrescribe el valor original que ten´ıa como
funci´on seno. Para recuperar el valor original basta ejecutar
>> clear sin
Almacenamiento de variables en ficheros
Matlab ofrece la posibilidad de grabar las variables que deseemos en un fichero. De esta
forma, podemos recuperarlas m´as adelante, ya sea en la misma sesi´on o en otra diferente3
.
Por ejemplo
>> a=4+i;% numero complejo
>> b1=cos(2);
>> b2=sin(2);
>> save datos a b1 b2
graba dentro del directorio de trabajo, en un fichero de nombre datos.mat, las variables
indicadas. Para recuperar, basta ejecutar
>> load datos
3
Se entiende por sesi´on el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar el
programa, todas las variables locales se pierden.
18
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
2.4. Ficheros script y funciones
La forma m´as eficiente de empaquetar series de instrucciones simples y mec´anicas es
utilizando ficheros script. Tareas m´as elaboradas, con, por ejemplo, variables de entrada
y salida, requieren del uso de funciones.
2.4.1. Ficheros script
Un fichero script es un simple documento de texto que contiene una sucesi´on de co-
mandos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamente
en la ventana de comandos.
Describiremos el manejo de este tipo de ficheros mediante un sencillo ejemplo. Comen-
zamos creando un fichero tecleando en modo comando la orden4
>> edit prueba
Se despliega as´ı en una ventana aparte el editor de Matlab con el fichero prueba.m (“.m”es
la extensi´on est´andar de Matlab). Es importante saber cu´al es el directorio de trabajo5
,
pues es donde se guardar´a por defecto el fichero.
Tecleamos ahora en el editor
a=1+i; b=1-i;
disp(’a*b=’)
disp(a*b)
disp(’a/b=’)
disp(a/b)
disp(’sqrt(a)=’)
disp(sqrt(a))
El comando disp (de display) muestra vectores por pantalla de forma compacta. Dado que
para Matlab un cadena de caracteres es simplemente un vector de car´acteres, se consigue
con ello mostrar por pantalla mensajes de forma concisa.
Una vez que el documento est´a grabado, para ejecutar las ´ordenes que contiene basta
teclear el nombre del fichero en la ventana de comandos:
>> prueba
Se puede modificar las veces que se precise las variables a y b en el fichero script sin tener
que teclear de nuevo todas las instrucciones.
2.4.2. Funciones
En principio existen dos tipos de funciones: las funciones inline, que se insertan en
la l´ınea de comandos y las que se escriben en un documento de texto externo. Esta ´ultima
forma, que es la evoluci´on natural de los ficheros script, es m´as flexible y es en la que nos
centraremos a continuaci´on. Dejaremos pendiente para la Lecci´on III la descripci´on de las
funciones inline.
Como antes, para crear un fichero que contenga a una funci´on se puede teclear:
4
Tambi´en es posible crear este fichero a golpe de rat´on.
5
Por defecto es C:MATLAB6p5work.
19
Borrador
2.4 Ficheros script y funciones LECCI´ON I
>> edit mifuncion
En el editor puedes insertar este simple ejemplo:
01 % MIFUNCION
02 %
03 % Y=MIFUNCION(X) devuelve
04 %
05 % Y=X^2-COS(X)
06 %
07 function y=mifuncion(x)
08
09 y=x^2-cos(x);
10
11 return
La funci´on se declara con function, la variable de entrada es x y se declara como variable
de salida y. Se termina la ejecuci´on de la funci´on cuando se ejecuta un return o bien se
llega al final de la funci´on6
.
Ahora, para calcular el valor de π2
− cos(π) podemos ejecutar la orden:
>> mifuncion(pi)
ans =
10.8696
Nota. Los n´umeros correlativos situados a la izquierda no forman parte del c´odigo
de la funci´on. Han sido insertados con el fin de numerar las l´ıneas y as´ı facilitar los
comentarios que podamos hacer sobre el programa.
Una funci´on puede no tener salidas, por ejemplo,
01 % INFORMACION
02 %
03 % INFORMACION devuelve informacion sobre
04 % la precision de la maquina
05 %
06 function informacion
07
08 disp(’precision de la maquina’)
09 disp(eps)
10 disp (’mayor numero real’)
11 disp(realmax)
12 disp (’menor numero real’)
13 disp(realmin)
14 return
6
En este sentido, el return del ejemplo anterior es superfluo.
20
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
o bien devolver m´ultiples salidas:
01 % MIFUNCION2
02 %
03 % [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve
04 %
05 % Y1=X1+X2+X3;
06 % Y2=X1-X2+X3;
07 %
08 function [y1,y2]= mifuncion2(x1,x2,x3)
09
10 y1=x1+x2+x3;
11 y2=x1-x2+x3;
12
13 return
Observa c´omo se recogen los resultados
>> [z1,z2]=mifuncion2(1,2,3);
>> z1
ans=
6
>> z2
ans=
2
>> z=mifuncion2(1,2,3); % Ahora solo devuelve el primero
ans=
6
La cabecera que hemos introducido en el pre´ambulo de las funciones, es decir las l´ıneas
anteriores a la declaraci´on de la funci´on y precedidas con “%”, constituyen la ayuda de la
funci´on:
>> help mifuncion2
MIFUNCION2
[Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve
Y1=X1+X2+X3;
Y2=X1-X2+X3;
21
Borrador
2.5 Vectores y matrices LECCI´ON I
Aunque muy recomendables7
, su inclusi´on en una funci´on es opcional. La ayuda puede
estar antes o despu´es de la declaraci´on de la funci´on. En cualquiera de los dos casos,
Matlab despliega como ayuda todas las l´ıneas que esten precedidas con % hasta que se
encuentra con la primera l´ınea no comentada.
Nota. Para ser consecuentes, lo correcto es denominar de igual modo a la funci´on y
al archivo que la contiene. Sin embargo esto no es obligatorio, es decir, se pueden dar
nombres distintos, pero en este caso Matlab da preferencia al nombre del archivo.
Aunque Matlab distingue entre may´usculas y min´usculas en sus comandos, esto no es
extensible para funciones programadas en m-files, al menos en Windows. Es decir, para
ejecutar una funci´on en un archivo, digamos, operaciones, se puede utilizar OPERACIONES,
Operaciones y cualquier combinaci´on con may´usculas y min´usculas. Esto es debido a que
el sistema de archivos de Windows tampoco hace esa distinci´on8
. Versiones m´as avanzadas
de Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordancia
exacta min´usculas-may´usculas entre el nombre del fichero y el comando utilizado para
llamarlo.
Todas las variables se env´ıan por valor, no por referencia. Es decir, si una funci´on
modifica una variable de entrada, esta modificaci´on se pierde cuando finalice su ejecuci´on,
recuperando el valor original.
Por ´ultimo, en un fichero se pueden incluir varias funciones. En este caso s´olo la primera
funci´on es accesible desde el exterior (l´ınea de comandos, otras funciones,...) mientras que
el resto de funciones presentes en ese fichero son internas, es decir, utilizables ´unicamente
por las funciones presentes en el archivo. Esto es importante a la hora de realizar una
programaci´on modular. Si un conjunto de funciones son s´olo utilizadas por una funci´on
principal, se pueden insertar en el mismo fichero que ´esta. Evitamos as´ı llenar la carpeta
de trabajo, o de nuestro proyecto, con ficheros y m´as ficheros.
2.5. Vectores y matrices
Dado que principalmente trabajaremos s´olo con arrays de una y dos dimensiones
hablaremos en lo que sigue de los objetos matem´aticos correspondientes: vectores y ma-
trices. Todo lo que sigue se puede adaptar a arrays con m´as dimensiones, aunque por
simplificar, nos centraremos ahora en el manejo de vectores y matrices y dejaremos pen-
diente para la Lecci´on IV el uso de arrays multidimensionales (tensores).
2.5.1. Definici´on de matrices y vectores
Un vector o una matriz se puede definir dando sus elementos entre corchetes y sepa-
rando filas mediante “;”. Por ejemplo, las instrucciones
7
No hay que subestimar nunca la capacidad de olvido de uno mismo: el c´odigo claro y legible de hoy
es ilegible semanas despu´es. Las ayudas facilitan la edici´on de los programas no s´olo para un usuario
externo sino para el propio programador.
8
Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombre
Operaciones.m
22
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
>> a=[1 3 -1; 2 3 4; 4 5 1];
>> a2=[1 2 4; -1 0 1; 2 1 5];
>> b=[1; 3; 1]; b2=[-1 1 -2 2];
definen las matrices y vectores
a =


1 3 −1
2 3 4
4 5 1

 , a2 =


1 2 4
−1 0 1
2 1 5

 , b =


1
3
1

 , b2 = −1 1 −2 2 .
Matlab distingue entre vectores fila y columna por lo que habr´a que tenerlo en cuenta por
ejemplo cuando se desee hacer operaciones como sumas o productos.
Desde una vertiente pr´actica, si se va a trabajar con una matriz grande, por ejemplo
de tama˜no 20 × 10, y sus valores se van a introducir m´as adelante, se puede empezar con
>> a=zeros(20,10);
A partir de este instante se pueden insertar los elementos, accediendo a cada posici´on
mediante par´entesis
>> a(4,5)=9; a(2,1)=6; a(1,1)=-3.4;
>> a(4,5)
ans=
9
En cualquier caso, si tratamos de introducir un valor en una posici´on no definida de la
matriz, Matlab ir´a adaptando el tama˜no seg´un juzgue apropiado9
, y no dar´a ning´un
error. El siguiente ejemplo ilustra esta caracter´ıstica
>> clear c % c esta borrado
>> c(1,2)=4 % c es ahora 1 x 2
c =
0 4
>> c(3,3)=2 % c pasa a ser 3 x 3
c =
0 4 0
0 0 0
0 0 2
Esta habilidad, aunque permite una programaci´on muy flexible y descuidada, debe uti-
lizarse con mesura dado que puede provocar errores de ejecuci´on muy dif´ıciles de detectar.
9
Ello obliga a que haya que redimensionar constantemente la memoria otorgada a la variable a. Esto
supone un costo adicional, inapreciable con ejemplos peque˜nos, pero importante para grandes cantidades
de memoria. Por tanto es mejor declarar primero las dimensiones de la matriz e informar as´ı a Matlab de
cu´anta memoria tiene que reservar.
23
Borrador
2.5 Vectores y matrices LECCI´ON I
2.5.2. Operaciones
Todas las operaciones habituales entre matrices, tales como la suma, producto, poten-
ciaci´on, c´alculo de determinantes, inversas..., est´an ya implementadas en Matlab. No hay
por tanto necesidad de programarse estas tareas. Por ejemplo, si a y a2 son matrices de
tama˜nos compatibles, las instrucciones
a*a2 a^2 a+a2
devuelven el producto matricial de a y a2, el cuadrado de a (es decir, a*a) y la suma de
a y a2.
Es importante observar la diferencia con estas l´ıneas
a.*a2 a.^2
En el primer caso, se devuelve la matriz resultado de multiplicar elemento a elemento
a y a2 (por tanto deben tener el mismo tama˜no) y en el segundo, una matriz cuyas
entradas son el cuadrado de las de a. Esto es una constante en Matlab: el signo “.”
indica que la operaci´on (un producto, una potencia o una divisi´on) se hace elemento a
elemento, mientras que en caso contrario se calcula la operaci´on matem´atica, en este
caso el producto matricial.
Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tama˜no. Observa el resultado de
ejecutar
a+a2 a*a2 a.*a2
Define un vector b fila o columna y ejecuta
b.^3 b’
Comprueba si estas operaciones est´an bien definidas
a*2 a+1
¿Qu´e hacen exactamente? ¿Por qu´e crees que no es necesario “.” en la primera instrucci´on?.
Otros comandos importantes son
det inv /  /. .
Los dos primeros son el determinante y la inversa de una matriz cuadrada. Los operadores
“/” y “” (slash y backslash) son ciertamente especiales:
a/a2 es equivalente a a*inv(a2), aa2 es equivalente a inv(a)*a2
En cuanto a su relaci´on con ./ y . es la misma que ha surgido antes, esto es, aplicado
sobre matrices procede a realizar los cocientes elemento a elemento. Requiere por tanto
que ambas matrices tengan el mismo tama˜no.
Ejercicio 2.5 Ejecuta las instrucciones
>> 3/5
>> 35
y observa el resultado. ¿Tiene sentido desde el punto de vista anterior?.
Ejercicio 2.6 Dado b una matriz, ¿qu´e hace 1/b?.
24
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
Nota. El operador backslash “” se utiliza profusamente para resolver sistemas de ecua-
ciones lineales, bajo la idea de que
Ax = b ⇔ x = A−1
b.
As´ı, si b es n × 1 y a es n × n,
>> x=ab;
devuelve en x la soluci´on del sistema correspondiente.
El funcionamiento real de  dista mucho de ser tan simple. Esto es, no calcula la
inversa de a para multiplicarla por b, sino que resuelve el sistema de ecuaciones por
alguna variante del m´etodo de Gauss. Se puede utilizar helpwin mldivide (o helpwin
mrdivide para /) para leer en detalle c´omo procede este comando.
Las funciones propias de Matlab trabajan de forma natural sobre vectores y matrices.
El resultado final es equivalente a aplicar el comando elemento a elemento. Por ejemplo,
>> a=[0 pi/3; -pi/3 0];
>> cos(a)
ans =
1.0000 0.5000
0.5000 1.0000
es equivalente a
>> [cos(0) cos(pi/3); cos(-pi/3) cos(0)]
ans =
1.0000 0.5000
0.5000 1.0000
2.5.3. Detalles adicionales
C´omo obtener las dimensiones de vectores y matrices
Los comandos de Matlab size y length nos proporcionan esta informaci´on:
>> a3=[1 2; 3 6; 5 -1];
>> size(a3)
ans =
3 2
>> length(a3)
25
Borrador
2.5 Vectores y matrices LECCI´ON I
ans =
3
>> a3=a3’; % cambiamos la forma de a3
>> size(a3)
ans =
2 3
>> [m,n]=size(a3); % m son las filas y n las columnas
>> m
ans =
2
>> n
ans =
3
>> length(a3)
ans =
3
El comando size devuelve un vector de tama˜no 2×1 con el n´umero de filas y columnas
del vector/matriz. El resultado es diferente seg´un se aplique a vectores fila o columna. La
orden length devuelve la longitud de una matriz o vector. Su significado en el caso de un
vector est´a clara mientras que para matrices devuelve el m´aximo entre el n´umero de filas
y el n´umero de columnas.
Matrices especiales
Matlab dispone de una serie de comandos que permiten construir matrices con una
estructura particular. Cabe se˜nalar las siguientes ´ordenes:
eye(n) es la matriz identidad de orden n;
ones(m,n) es una matriz m x n de 1s;
zeros(m,n) es una matriz m x n de 0s, esto es, igual que ones pero con ceros;
y algunas m´as ex´oticas como hilb, invhilb, pascal, magic.
26
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
Existen dos formas de introducir vectores cuyos valores siguen una distribuci´on regular
a:b:c construye el vector de valores [a a+b a+2*b .... a+k*b] donde a+k*b es
el mayor n´umero natural que cumple a+k*b≤ c. La instrucci´on a:c toma b = 1.
linspace(a,b,n) devuelve una partici´on uniforme de [a, b] en n puntos.
Por ejemplo,
>> 0:10
ans=
0 1 2 3 4 5 6 7 8 9 10
>> 10:-1:0
ans=
10 9 8 7 6 5 4 3 2 1 0
>> 0.1:0.3:1.5
ans =
0.1000 0.4000 0.7000 1.0000 1.3000
>> linspace(0,2,4)
ans =
0 0.6667 1.3333 2.0000
>> linspace(2,0,4)
ans =
2.0000 1.3333 0.6667 0
Nota. Cuando Matlab tiene que devolver un vector y no se le especifica el formato,
devuelve una fila.
2.5.4. Acceso a partes de matrices
El manejo de partes de vectores y matrices, as´ı como la eliminaci´on de filas o columnas,
cambios de tama˜no, etc, se hace v´ıa instrucciones muy simples en Matlab. Aunque pueda
resultar algo extra˜no al principio, un poco de pr´actica es suficiente para que el usuario se
27
Borrador
2.5 Vectores y matrices LECCI´ON I
adapte a la nueva sintaxis, tan diferentes a la de un lenguaje tradicional, y pueda utilizarlo
en sus c´odigos.
Comencemos viendo un ejemplo:
>> a=[1 2 3; 4 5 6; 7 8 9; 10 11 12];
>> a(2,3) % elemento (2,3) de a
ans =
6
>>a(2,:) % fila 2 de a
ans =
4 5 6
>>a(:,1) % columna 1
ans =
1
4
7
10
>>a(:,2)=0 % columna 2 es ahora 0
a =
1 0 3
4 0 6
7 0 9
10 0 12
Podemos acceder a partes de una fila o columna:
>> a(1,2:3) % vector [a(1,2) a(1,3)]
ans =
0 3
>> a(2:4,3) % vector columna [a(2,3); a(3,3); a(4,3)]
ans =
28
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
6
9
12
>> a(1:2,2:3) % matriz [a(1,2) a(1,3); a(2,2) a(2,3)]
ans =
0 3
0 6
En general, si p es un vector de n´umeros enteros, v(p) devuelve [v(p(1)), v(p(2)),
..., v(p(n))]. Por ejemplo,
>> v=[0.1 0.2 0.3 0.4 0.5 0.6];
>> v(4:-1:2)
ans=
0.4000 0.300 0.2000
>> p=[5 1 2 3 3 3]; % no importa que esten repetidos
>> v(p)
ans=
0.5000 0.1000 0.2000 0.3000 0.3000 0.3000
Ejercicio 2.7 Ejecuta las siguientes l´ıneas
>> a=[1 2 3 4; 5 6 7 8; 9 10 11 12];
>> p=[1 3 2]; q=[1 2 1];
>> a(p,q)
¿Qu´e hacen exactamente?.
Igualmente es f´acil a˜nadir filas y columnas a una matriz:
>> a=[1 2 3 4; 5 6 7 8]
a =
1 2 3 4
5 6 7 8
>> a=[a; [1 -1 2 4]] % adosamos una fila nueva
a =
29
Borrador
2.6 Bucles y estructuras de decisi´on LECCI´ON I
1 2 3 4
5 6 7 8
1 -1 2 4
>> a=[a [0; 2; 4] ] % una nueva columna
a =
1 2 3 4 0
5 6 7 8 2
1 -1 2 4 4
Si se desea eliminar una fila o columna se puede utilizar el s´ımbolo vac´ıo []. Por
ejemplo,
>> a(:,2)=[] % suprime la segunda columna
a =
1 3 4 0
5 7 8 2
1 2 4 4
Ejercicio 2.8 Programa una funci´on cuyas entradas sean una matriz cuadrada y un t´ermino
independiente compatible y que devuelva la matriz ampliada del sistema de ecuaciones lineales.
Esto es, una matriz con la matriz original y una ´ultima columna con el t´ermino independiente.
2.6. Bucles y estructuras de decisi´on
Claves en cualquier lenguaje de programaci´on, Matlab dispone de varias de ellas entre
las que sobresalen for e if, un est´andar en el mundo de la inform´atica.
2.6.1. Bucles: el comando for
En Matlab, la estructura
for j=inicio:paso:final
.....
end
implementa un bucle donde las l´ıneas de c´odigo entre for y end son ejecutadas repetida-
mente con j tomando los valores del vector inicio:paso:final (v´ease la Secci´on 2.5.3)
Por ejemplo,
>> for j=1:3; disp(j); end
1
30
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
2
3
>> for j=6:-2:2; disp(j-2); end
4
2
0
En general, si v es un vector,
for j=v
.....
end
procede a ejecutar las l´ıneas internas con j tomando los valores del vector v. Por ejemplo,
>> v=[2 5 3 1];for j=v; disp(j); end
2
5
3
1
Asociados a for, y en general a cualquier bucle, encontramos los comandos break y
continue. El primero fuerza la salida inmediata del bucle mientras que el segundo reini-
cializa la iteraci´on con el siguiente valor del ´ındice.
Ejercicio 2.9 La matriz de Hilbert de orden n es
A =






1 1
2
· · · · · · 1
n
1
2
1
3
· · · · · · 1
n+1
...
...
...
...
...
1
n
1
2n−2
1
2n−1






Construye la matriz anterior mediante un fichero script y el uso de dos “for” anidados.
2.6.2. Operadores l´ogicos y estructuras de decisi´on
Los operadores l´ogicos m´as b´asicos en Matlab son
== igualdad, ~= desigualdad, > mayor, < menor,
>= mayor o igual, <= menor o igual, & “y” l´ogico, | “o” l´ogico
31
Borrador
2.6 Bucles y estructuras de decisi´on LECCI´ON I
El resultado de una comparaci´on es 1 si es verdadero, 0 si es falso:
>> a=1; b=2; c=3;
>> a>0
ans =
1
>> a>0 & b<3
ans =
1
>> a<0 | b<1
ans =
0
>> test= (a~=0)
ans =
1
>> whos test
Name Size Bytes Class
test 1x1 1 logical array
Grand total is 1 element using 1 bytes
Estos “0” y “1” no son valores num´ericos sino l´ogicos como se comprueba con la ´ultima
instrucci´on10
. Cuando se aplica a un vector, devuelve un vector de verdadero/falso de la
misma longitud que el vector original:
>> b=[1 2 -3 -1 2 -4]; p=(b>=1) % entradas de b>=1
p=
1 1 0 0 1 0
En el ejemplo anterior, p(i)==1 si b(i)≥1 y cero en caso contrario. Ahora, podemos
aislar los elementos mayores o iguales que 1 simplemente con
10
Ocupan un ´unico byte mientras que un n´umero real utiliza ocho bytes.
32
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
>> b(p)
1 2 2
Desde este punto de vista es correcta y recomendable utilizar la instrucci´on
>> b(b>=1) % elementos de b mayores o iguales que 1
1 2 2
que adem´as resulta muy natural (y f´acil de entender).
Nota. El comando logical puede utilizarse para construir vectores y estructuras l´ogicas
a partir de vectores de n´umeros enteros:
>> b=[2 4 6 8 10]; p=[1 0 0 1 1];
>> b(p) % Dara error
??? Subscript indices must either be real positive integers or logicals.
>> p=logical(p);
>> b(p)
ans =
2 8 10
La estructura de decisi´on, como en muchos otros lenguajes, es if. Su sintaxis es la
siguiente:
if simple: si la operaci´on l´ogica efectuada es verdadera, se ejecutan las l´ıneas de
c´odigo comprendidas entre if y end
if (x<-1 | x>1)
disp(’valor absoluto de x mayor que 1’)
end
if compuesto: como el anterior, pero un nuevo conjunto de l´ıneas, comprendidas
entre else y end son ejecutadas en caso de que la operaci´on l´ogica efectuada en el
if sea falsa:
if (x<0 & x>-10)
f=x^2; % x entre -10 y 0
else
f=sin(x^2); % x menor que -10 o mayor que 0
end
33
Borrador
2.6 Bucles y estructuras de decisi´on LECCI´ON I
if de decisi´on m´ultiple:
if (x<0)
f=x.^2;
disp(’x menor que cero’)
elseif (x<sqrt(pi))
f=sin(x^2);
disp(’x en [0,sqrt(pi))’)
elseif (x<2*sqrt(pi))
f=(x-sqrt(pi))^2;
disp(’x en [sqrt(pi),2*sqrt(pi))’)
else
f=pi*cos(x^2);
disp(’x en [2*pi,infinito)’)
end
Esta ´ultima instrucci´on es equivalente a anidar diferentes estructuras if, de la sigu-
iente forma
if (x<0)
f=x.^2;
disp(’x menor que cero’)
else
if (x<sqrt(pi))
f=sin(x^2);
disp(’x en [0,sqrt(pi))’)
else
if (x<2*sqrt(pi))
f=(x-sqrt(pi))^2;
disp(’x en [sqrt(pi),2*sqrt(pi))’)
else
f=pi*cos(x.^2);
disp(’x en [2*pi,infinito)’)
end
end
end
Obviamente, la primera forma es m´as clara y concisa.
Nota. Con la instrucci´on switch se puede implementar una estructura de decisi´on que
es esencialmente equivalente a un if anidado.
Est´a disponible tambi´en el bucle while que procede a ejecutar un bucle (que se cierra
tambi´en con un end) mientras una condici´on sea verdadera. Por tanto, es algo m´as flexible
que un for.
En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. El
uso de break y continue es exactamente el mismo.
34
Borrador
LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos
Por ´ultimo, y volviendo a end, este comando tiene una curiosa funcionalidad extra:
sirve para referenciar el ´ultimo elemento de una fila o columna de una matriz. Por ejemplo
b(4:end) selecciona todos los elementos de b desde la posici´on cuarta en adelante.
Ejercicio 2.10 ¿Qu´e hace el siguiente fragmento de c´odigo?
01 r=[]; aux=0;
02 while aux<0.8
03 aux=rand(1);
04 r=[r aux];
05 end
06 r(end)=[];
Ejercicio 2.11 Con la ayuda de Matlab, programa un par de ejemplos donde utilices switch
y while.
Ejercicio 2.12 (Un poco de todo) Implementa una funci´on de nombre findnonzeros
que dado un vector de entrada devuelva el n´umero de elementos no nulos y un vector que
contenga dichos elementos.
Soluci´on. Una implementaci´on posible es la siguiente
01 % FINDNONZEROS
02 %
03 % [N,P]=FINDNONZEROS(X) devuelve
04 %
05 % N el numero de elementos no nulos en el vector X
06 % P un vector con los elementos no nulos de X
07 %
08 function [n,p]=findnonzeros(x)
09
10 p=[]; % p es vacio
11 for i=1:length(x)
12 if (x(i)~=0) % si x(i) no es cero
13 p=[p x(i)]; % apuntamos i al vector p
14 end
15 end
16 n=length(p);
17 return
Observa como se recogen los resultados de la funci´on, n y p,
>> a=[0.1 0. 0.3 0.1 0.6 0 0.1 0.2 0.4]; % vector!!
>> [n,p]=findnonzeros(a)
n =
7
35
Borrador
2.6 Bucles y estructuras de decisi´on LECCI´ON I
p =
Columns 1 through 5
0.1000 0.3000 0.1000 0.6000 0.1000
Columns 6 through 7
0.2000 0.4000
Otra posible implementaci´on (mucho m´as elaborada y m´as propia de Matlab) es la sigu-
iente
01 % FINDNONZEROS
02 %
03 % [N,P]=FINDNONZEROS(X) devuelve
04 %
05 % N el numero de elementos no nulos en el vector X
06 % P un vector con los elementos no nulos de X
07 %
08 function [n,p]=findnonzeros(x)
09
10 p=x(x~=0);
11 n=length(p);
12 return
Haz un esfuerzo en entender bien los comandos anteriores. Tras la suficiente pr´actica,
esta versi´on se ve m´as clara y natural que la anterior. Observa c´omo se toman los elementos
no nulos del vector x (l´ınea 10).
36
Borrador
Cap´ıtulo 3
M´etodos directos para sistemas de
ecuaciones lineales
3.1. M´etodo de Gauss
El m´etodo de Gauss, tambi´en conocido como eliminaci´on gaussiana, es el algoritmo
m´as sencillo para la resoluci´on de sistemas de ecuaciones lineales. Consta de dos partes
bien diferenciadas:
i) Transformaci´on del sistema lineal en otro equivalente, es decir, con la misma solu-
ci´on, donde la matriz es triangular superior.
ii) Resoluci´on del sistema triangular por sustituci´on regresiva.
El paso i) se acomete v´ıa dos operaciones elementales:
(a) Sumar a una ecuaci´on otra multiplicada por un n´umero.
(b) Intercambiar dos ecuaciones.
Si s´olo utilizamos la operaci´on (a) hablaremos del m´etodo de Gauss sin pivotaje, y
con pivotaje parcial si tambi´en realizamos las operaciones (b)1
cuando la elecci´on de
las filas que se conmutan sea una muy particular.
Representando el sistema de ecuaciones en la forma matricial, todo lo anterior se
reescribe en t´erminos de operaciones matriciales (sumar a una fila otra fila e intercambiar
filas2
). En lo que sigue expresaremos el sistema en la forma
Ax = b, A ∈ Rn×n
, x, b ∈ Rn
,
donde A es la matriz de coeficientes, b el t´ermino independiente y x el vector de soluciones.
Los elementos de A se denotar´an por aij, y con bi los de b.
1
Existe una tercera operaci´on (c), que consiste simplemente en multiplicar filas por constantes no
nulas. Esta operaci´on recibe el nombre de reescalado (de filas) y en problemas pr´acticos se suele utilizar
con el fin de mejorar la estabilidad del sistema frente a errores de redondeo.
2
Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las inc´ognitas). En este
caso se habla de pivotaje total.
37
Borrador
3.1 M´etodo de Gauss LECCI´ON I
3.1.1. M´etodo de Gauss sin pivotaje
El pseudoc´odigo se expone a continuaci´on
M´etodo de Gauss
01 for i = 1 : n − 1
02 for k = i + 1 : n
03 ki = aki/aii
04 for j = i + 1 : n
05 akj = akj − kiaij
06 end
07 bk = bk − kibi
08 end
09 end
10
11 xn = bn/ann
12 for i = n − 1 : −1 : 1
13 xi = bi −
n
j=i+1
aijxj /aii
15 end
Las l´ıneas 01--09 se corresponden con la reducci´on a la forma triangular de la matriz
y las l´ıneas 11--15 con la resoluci´on del sistema triangular resultante. El elemento aii se
denomina pivote y debe ser distinto de cero para que el algoritmo funcione, dado que en
caso contrario la operaci´on en 03 est´a mal definida.
El algoritmo efect´ua O(n3
/3) productos3
y otras tantas sumas para la reducci´on a la
forma triangular y O(n2
/2) sumas y productos para la resoluci´on del sistema triangular.
Por tanto el costo se concentra en la primera fase del algoritmo y duplicar la dimensi´on
del sistema exige multiplicar por ocho el tiempo de c´alculo (y por cuatro el costo en
memoria).
Ejercicio 3.1 Implementa una funci´on cuyas entradas sean la matriz de coeficientes y el
t´ermino independiente y devuelva la soluci´on del sistema por el m´etodo de Gauss.
Soluci´on. El siguiente programa es una soluci´on del ejercicio
01 % GAUSS
02 %
03 %
04 % X=GAUSS(A,B) Solucion del sistema Ax=b con el metodo
05 % de Gauss sin pivotaje
3
es decir, el n´umero de multiplicaciones es n3
/3 + αn2
+ βn + γ, donde α, β y γ son constantes
adecuadas. Con n creciente, el primer t´ermino es el dominante.
38
Borrador
LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales
06
07 function x = gauss(a,b)
08 n=length(a);
09
10 % transformacion del sistema en uno triangular
11 for i=1:n-1
12 for k=i+1:n
13 l=a(k,i)/a(i,i);
14 for j=i+1:n
15 a(k,j)=a(k,j)-l*a(i,j);
16 end
17 b(k)=b(k)-l*b(i);
18 end
19 end
20
21 % resolucion del sistema triangular
22 x=zeros(n,1); % tambien vale x=b*0;
23 x(n)=b(n)/a(n,n);
24 for i=n-1:-1:1
25 s=0;
26 for j=i+1:n
27 s=s+a(i,j)*x(j); % sumatorio
28 end
29 x(i)=(b(i)-s)/a(i,i);
30 end
31 return
El c´odigo anterior es correcto y ciertamente recuerda a la sintaxis que usar´ıamos en una
programaci´on en un lenguaje tradicional como C o Pascal. Sin embargo desde el punto de
vista de Matlab es claramente redundante y muy mejorable. Los siguientes ejercicios
ahondan en estos aspectos por lo que resolverlos es muy recomendable.
Ejercicio 3.2 Reescribe el programa utilizando instrucciones y sintaxis propia de Matlab.
Soluci´on. Las filas 14-16 del programa (04--06 del algoritmo) se pueden implementar
como una diferencia de dos vectores, a(k,i+1:n) y a(i,i+1:n), con cualquiera de estas
dos instrucciones
a(k,i+1:n) =a(k,i+1:n) - l*a(i,i+1:n)
a(k,:) =a(k,:) - m*a(i,:)
La segunda es m´as c´omoda de utilizar pero multiplica por dos el n´umero de operaciones
en la ejecuci´on del m´etodo4
.
4
¿Por qu´e?.
39
Borrador
3.1 M´etodo de Gauss LECCI´ON I
De forma an´aloga, el sumatorio de las l´ıneas 25-29 del c´odigo (13 del algoritmo del
m´etodo de Gauss) es simplemente el producto escalar, y de hecho tambi´en matricial, de
dos vectores, el vector fila a(i,i+1:n) y el vector columna x(i+1:n). Esto es el c´odigo
de las l´ıneas 25--29 se puede sustituir por
x(i)=(b(i)- a(i,i+1:n)*x(i+1:n))/a(i,i);
Ejercicio 3.3 (Avanzado) Podemos avanzar a´un m´as hacia la consecuci´on de algoritmos
matriciales. Consideremos la partici´on de A
A =
a11 c1
d1 A11
, b =
b1
b1
donde c1, d1 son vectores (n − 1)×1 y A11 una matriz (n − 1)×(n − 1). Entonces, el primer
paso del m´etodo de Gauss se puede escribir
a11 c1
0 A11 − (a11)−1
c1 d1
, b =
b1
b1 − a−1
11 b1d1.
A(1)
b(1)
El segundo paso del m´etodo de Gauss se aplica ahora sobre la matriz A(1)
(de tama˜no (n−1)×
(n − 1)) y el vector b(1)
(de tama˜no (n − 1) × 1) y as´ı se procede sucesivamente. Implementa
esta resoluci´on alternativa del m´etodo de Gauss.
(Ayuda. Observa estas tres instrucciones
l=a(i+1:n,i)/a(i,i) a(i+1:n,i+1:n)-l*a(i,i+1:n) b(i+1:n)-l*b(i)
¿Qu´e hacen?)
Nota sobre la vectorizaci´on
La noci´on de vectorizaci´on, trabajar con vectores y matrices en lugar de elemento a ele-
mento, no es nueva ni en el An´alisis Num´erico ni en la computaci´on a alto nivel. El objetivo
que se persigue es que las todas las operaciones se reduzcan a operaciones matem´aticas
sencillas, como productos escalares, productos matriciales, b´usqueda de m´aximos y m´ıni-
mos en un vector/matriz, suma de vectores y matrices... cuya implementaci´on se opti-
miza tomando en consideraci´on el entorno en el que se trabaja, tanto en software como
en hardware. Este conjunto de instrucciones se conocen como BLAS (basic linear algebra
subprograms). Se distinguen tres niveles. El nivel uno est´a formada por operaciones entre
vectores, tales como la suma o el producto escalar de dos vectores, de O(n) operaciones, el
nivel dos se ocupa de operaciones matriz-vector con O(n2
) operaciones y el nivel tres son
operaciones entre matrices, O(n3
) operaciones. En m´aquinas con m´ultiples procesadores
estos subprogramas deben adaptarse a dividir la tarea entre los procesadores disponibles
de forma ´optima y a buscar algoritmos que soporten este tipo de trabajo5
.
5
Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareas
equiparables, y de forma que finalicen en tiempos similares puesto que basta con que una de las subtareas
se retrase respecto a las dem´as para que el conjunto de procesadores deba parar a esperar al rezagado
con la consiguiente p´erdida de tiempo (y dinero).
40
Borrador
LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales
Uno de los detalles m´as sencillos que hay que plantear es la estrategia de almace-
namiento de las matrices en memoria. Se puede optar por un almacenamiento por filas,
como hace C,
A =
a11 a12 a13
a21 a22 a23
⇒ a11 → a12 → a13 → a21 → a22 → a23
donde con la notaci´on anterior queremos decir que aij y aij+1 ocupan posiciones consec-
utivas en memoria.
Sin embargo Fortran o Matlab proceden por columnas
A =
a11 a12 a13
a21 a22 a23
⇒ a11 → a21 → a12 → a22 → a13 → a23.
Seg´un sea el caso se trata de primar algoritmos que accedan a la matriz por filas o por
columnas para que el procesador trabaje con posiciones consecutivas de memoria6
. En esta
din´amica, la resoluci´on del sistema triangular seg´un el algoritmo expuesto en el Ejercicio
3.3 est´a mejor adaptado a la arquitectura de Matlab puesto que todas las operaciones se
hacen sobre columnas de la matriz a.
3.1.2. M´etodo de Gauss con pivotaje parcial
Para evitar que el m´etodo de Gauss se colapse, es decir, que encuentre en un paso i
que el elemento aii es nulo (l´ınea 03 del algoritmo), se introduce la noci´on de pivotaje. La
idea es muy sencilla: en el caso de que en el i–´esimo paso el pivote sea nulo, se procede a
intercambiar la fila i por una fila k tal que aki = 0 para cierto k > i. Si esto no es posible,
el sistema no es compatible determinado, es decir, o no tiene soluci´on o tiene infinitas
soluciones.
Desde un punto de vista pr´actico, el m´etodo de Gauss con pivotaje procede a inter-
cambiar siempre filas de forma que en cada paso
|aki| = m´ax
=i,...,n
|a i|,
esto es, el pivote es el mayor posible. Ello dota al sistema de una mayor estabilidad frente
a los errores de redondeo. El algoritmo resultante es el siguiente (denotamos por a ↔ b el
intercambio de valores de a y b).
6
Cuando un procesador moderno lee algo en memoria, suele cargar a su memoria internar, la memoria
cach´e, posiciones adicionales y consecutivas de memoria bajo la convicci´on de que es probable que las
requiera en el siguiente paso.
41
Borrador
3.1 M´etodo de Gauss LECCI´ON I
M´etodo de Gauss con pivotaje parcial
01 for i = 1 : n − 1
02
03 Encontrar k ∈ {i, . . . , n} tal que |aki| = m´ax
j= ,...,n
|a i|
04 for j = i : n
05 aij ↔ akj %intercambio filas y termino independiente
08 end
07 bi ↔ bk
08
09 for k = i + 1 : n
10 ki = aki/aii
11 for j = i + 1 : n
12 akj = akj − kiaij
13 end
14 bk = bk − kibi
15 end
16 end
Ejercicio 3.4 Implementa una funci´on con el m´etodo de Gauss con pivotaje a partir de la
funci´on definida en el Ejercicio 3.2.
Para este fin la instrucci´on max te puede resultar ´util. Espec´ıficamente,
>> [m,i]=max(v)
devuelve en m el mayor valor del vector v y en i su posici´on, esto es, m = v(i). A˜nade tambi´en
un control sobre el tama˜no de a(i, i) de forma que si ´este es pr´oximo a cero7
se termine la
ejecuci´on y se devuelva un mensaje de error.
(Ayuda. La instrucci´on [m,r]=max(abs(a(i:n,i))) te devolver´a en r la posici´on del m´aximo
en el vector columna abs(a(i:n,i)). Por tanto, la fila en la matriz a con el mayor valor en la
columna i es i+r-1.)
El intercambio de filas de las l´ıneas 04--08 se puede implementar de varias formas.
La primera es simplemente con un bucle que recorra las filas y proceda a intercambiar los
valores elemento a elemento. En la segunda forma se hace de forma global mediante
aux=a(i,i:n); a(i,i:n)=a(k,i:n); a(k,i:n)=aux;
La tercera forma probablemente ser´a la que resulte m´as extra˜na pero vuelve a ser natural
en Matlab. Basta hacer
a([i,k],i:n)=a([k,i],i:n)
F´ıjate que tiene perfecto sentido sint´actico de acuerdo a las reglas de manipulaci´on de
vectores y matrices expuestas en la primera parte de esta lecci´on.
7
¿Cu´ando se decide que un n´umero es cero? En la pr´actica depende de los tama˜nos del resto de
elementos de la matriz.
42
Borrador
LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales
3.1.3. M´etodo de Gauss con pivotaje parcial ficticio
Desde un punto de vista pr´actico no hace falta intercambiar f´ısicamente las filas de la
matriz. En lugar de ello se puede utilizar un vector de ´ındices p de forma que p(i) sea la
posici´on f´ısica en memoria de la fila i.
Inicialmente, las filas est´an sin reordenar, es decir, se empieza declarando
p=1:n;
Intercambiar las filas i y k es equivalente a intercambiar los valores de p en las posiciones
i y k
p([i k])=p([k i])
y se procede a hacer ceros en las filas p(i+1),. . . , p(n). El acceso la fila i se consigue con
a(p(i),:)
y la b´usqueda del m´aximo valor para el intercambio de filas con
[m,r]=max(abs(a(p(i:n),i)));r=r+i-1;
La fila con el m´aximo elemento en valor absoluto es la p(r).
Para la resoluci´on del sistema triangular despejamos igual que en el m´etodo de Gauss,
desde la n-´esima inc´ognita a la primera, con
22 x(p(n))=b(p(n))/a(p(n),n);
23 for i=n-1:-1:1
24 x(p(i))=(b(p(i))-a(p(i),i+1:n)*x(i+1:n))/a(p(i),i);
25 end
Desde un punto de vista estrictamente matem´atico se trata de llevar la matriz a una
forma que, si bien no es triangular, una reordenaci´on adecuada de las filas la transforma
en triangular. El vector p recoge en qu´e orden se deben despejar las inc´ognitas a la hora
de resolver el sistema reducido. En concreto el orden viene dado por p(n), p(n-1),. . . ,
p(1). En cualquier caso, a(p,:) es una matriz triangular8
.
Ejercicio 3.5 Implementa el m´etodo de Gauss con pivotaje parcial ficticio.
Ejercicio 3.6 Las l´ıneas 22–25 proceden a resolver el sistema triangular accediendo a los
elementos por filas. Adapta el algoritmo para la resoluci´on de este sistema por columnas, tal
como se hizo en el Ejercicio 3.3.
Ejercicio 3.7 Sea A una matriz inversible de tama˜no n × n y A−1
su inversa. Si ai es la
columna i−´esima de A−1
, esto es,
A−1
= [a1|a2| · · · |an],
8
La importancia de estas t´ecnicas ha decrecido con las ´ultimas generaciones de ordenadores, donde la
manipulaci´on de enormes cantidades de memoria est´a muy optimizada.
43
Borrador
3.2 Descomposiciones matriciales LECCI´ON I
entonces
Aai = ei =







0
...
1
...
0







→ i.
Utilizando alguna de las diferentes versiones del m´etodo de Gauss, implementa el c´alculo de la
inversa mediante la resoluci´on de los n sistemas de ecuaciones. Observa que los n comparten
la misma matriz de coeficientes.
3.2. Descomposiciones matriciales
Uno de los aspectos que mejores resultados dio a lo largo del siglo XX, en los albores del
An´alisis Num´erica, fue la constataci´on de que numerosos algoritmos del ´Algebra Lineal,
pod´ıan reescribirse como factorizaciones de matrices en producto de otras matrices con
caracter´ısticas muy particulares. ´Este es el caso del algoritmo de Gram-Schmidt, la matriz
original escrita como el producto de una ortogonal por una triangular, o el caso que nos
ocupa, el m´etodo de Gauss, visto como la b´usqueda de la factorizaci´on de A como el
producto de una matriz triangular inferior por una superior.
La utilidad que se concedi´o a este tipo de factorizaciones fue en un primer momen-
to m´as bien te´orica pero r´apidamente se encontr´o aplicaciones pr´acticas y su uso en la
actualidad es profuso.
Estudiaremos en lo que sigue la factorizaci´on LU y variantes y dejaremos para m´as
adelante (Lecci´on IV) otro tipo de factorizaciones.
3.2.1. Descomposici´on LU
Supongamos que se dispone de una descomposici´on
A = LU
donde L y U son matrices triangulares inferior y superior respectivamente. En este caso, la
resoluci´on del sistema lineal Ax = b es equivalente a resolver dos sistemas de ecuaciones
triangulares
Ly = b, Ux = y.
el primero triangular superior y el segundo triangular inferior. Puesto que el costo de
resoluci´on de cada sistema es O(n2
) operaciones (total de sumas y productos) obtenemos
una ventaja decisiva en la resoluci´on del sistema.
Ejercicio 3.8 Implementa la resoluci´on de un sistema de ecuaciones Lx = b donde L es
triangular inferior con 1s en la diagonal.
Si abordamos directamente la resoluci´on de la ecuaci´on A = LU, nos encontramos
con un sistema no lineal con n2
+ n inc´ognitas (las entradas de L y U) y n2
ecuaciones
(una por cada elemento de a). Por tanto, el sistema resultante no deber´ıa admitir soluci´on
44
Borrador
LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales
´unica. Si exigimos que L tenga 1s sobre la diagonal, el n´umero de inc´ognitas pasa a ser
de n2
y por tanto tenemos ya un sistema cuadrado (aunque no lineal). Se trata entonces
de estudiar el siguiente problema: dada una matriz A de tama˜no n × n, encontrar L y U
de la forma
L =





1
21 1
...
...
...
n1 n2 · · · 1





, U =





u11 u12 · · · u1n
u22 · · · u2n
...
...
unn





,
y tales que A = LU.
El c´alculo de esta descomposici´on se puede llevar a cabo sin m´as que exigir que el
producto LU sea igual al de A. As´ı empezamos despejando la primera fila de U (que es
igual que la de A por ser 11 = 1). Una vez conocida esa fila, se puede despejar la primera
columna de L, utilizando que el producto de L por la primera columna de U (que consta
de un ´unico elemento no nulo y ya es conocido del paso anterior) da la primera columna de
A. Procedemos sucesivamente de esta forma, construyendo U por filas y L por columnas.
Descomposici´on LU (M´etodo de Doolittle)
01 for k = 1 : n
02 for j = k : n
03 ukj = akj −
k−1
p=1
kpupj
04 end
05 kk = 1
06 for i = k + 1:n
07 ik = aik −
k−1
p=1
ipupk /ukk
08 end
09 end
El n´umero de operaciones del algoritmo resulta ser igual al del m´etodo de Gauss,
con lo cual no hemos conseguido una ventaja significativa. Sin embargo, disponer de esta
descomposici´on es especialmente ´util si se requiere resolver varios sistemas de ecuaciones
lineales con la misma matriz pero con t´erminos independientes diferentes. Las operaciones
que conllevan un mayor coste son las correspondientes al c´alculo de las matrices L y
U, pero ´unicamente hay que realizar esta descomposici´on una vez para posteriormente
resolver en cada caso dos sistemas triangulares.
Ejercicio 3.9 Implementar la descomposici´on LU en Matlab mediante una funci´on cuya
entrada sea una matriz cuadrada y su salida sean las matrices L y U correspondientes.
(Ayuda: la funci´on por tanto devuelve dos valores.)
45
Borrador
3.2 Descomposiciones matriciales LECCI´ON I
Al observar el algoritmo del m´etodo, las operaciones recuerdan a las efectuadas por el
m´etodo de Gauss. Esto no es tan sorprendente cuando se analizan con detenimiento los
calculados realizados. Se puede ver entonces que en el c´alculo de la descomposici´on LU se
est´an haciendo exactamente las mismas operaciones que al aplicar el m´etodo de Gauss.
En efecto, definamos
a
(1)
ij = aij i, j = 1, . . . , n
a
(k+1)
ij = a
(k)
ij − ika
(k)
kj , k ≥ 1, 1 ≤ i, j ≤ n − k
donde ki viene dada por el algoritmo de Doolitle (l´ınea 07).
Entonces, de acuerdo con el algoritmo de la factorizaci´on LU, los elementos de la
primera fila de U y de la primera columna de L vienen dados por
u1j = a
(1)
1j , i1 =
a
(1)
i1
a
(1)
11
.
En el siguiente paso, se observa que
u2j = a2j − 21u1j = a
(1)
2j − 21a
(1)
1j = a
(2)
2j
i2 =
ai2 − i1u12
u22
=
a
(1)
i2 − i1a
(1)
12
a
(2)
22
=
a
(2)
i2
a
(2)
22
.
Reiterando el mismo razonamiento concluimos que
uij = a
(i)
ij , i ≤ j, ij =
a
(j)
ij
a
(j)
jj
, i > j.
Por tanto U es de hecho la matriz triangular que queda al aplicar el m´etodo de Gauss
mientras que L est´a formada por los elementos que se han utilizado para hacer ceros en
el proceso. Esto es, el elemento i, j de L, denotado por ij, coincide con la constante ij
calculado en la l´ınea 03 del m´etodo de Gauss y por tanto no hay una contradicci´on de
notaciones.
En particular, la propiedad anterior propone una forma alternativa de calcular la de-
scomposici´on LU de una matriz es la siguiente modificaci´on del programa del Ejercicio 3.1:
11 for i=1:n-1}
12 a(i,i+1:n)=0; %hacemos cero la columna i
13 for k=i+1:n}
14 l(k,i)=a(k,i)/a(i,i);
15 a(k,i+1:n)=a(k,i+1:n)-l(k,i)*a(i,i+1:n);
16 end
17 end
La matriz U estar´ıa entonces almacenada en a.
Ejercicio 3.10 Una forma compacta de devolver la descomposici´on LU es insertar L en la
parte triangular inferior de a. De esta forma, tras aplicar el m´etodo, a tiene en la parte superior
la matriz U, mientras que por debajo de la diagonal encontramos L (exceptuando su diagonal
de 1s). Implementa esta modificaci´on.
46
Borrador
LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales
3.2.2. Casos particulares
M´etodo de Cholesky
En una gran variedad de problemas pr´acticos aparecen matrices sim´etricas definidas
positivas. Este tipo de matrices puede descomponerse en la forma
A = LL
donde
L =





11
21 22
...
...
...
n1 n2 · · · nn





.
Gracias a la simetr´ıa de la matriz, tanto el n´umero de operaciones como de posiciones
de memoria requeridos pueden reducirse a la mitad. El algoritmo resultante es conocido
como el m´etodo de Cholesky.
M´etodo de Cholesky
01 for k = 1:n
02 kk = akk −
k−1
r=1
2
kr
03 for j = k + 1:n
04 jk = ajk −
k−1
r=1
jr kr / kk
05 end
06 end
Ejercicio 3.11 Implementa una funci´on que tenga como entrada una matriz A y devuelva
la matriz L correspondiente. Debe avisar si la descomposici´on no ha podido llevarse a cabo.
Implementa tambi´en una segunda funci´on que tenga como entradas la matriz L triangular
y un t´ermino independiente b y que devuelva la soluci´on del sistema
(LL )x = b.
Para ello se requiere la resoluci´on de los sistemas triangulares
Ly = b, L x = y.
LU con permutaci´on
El m´etodo de Gauss con pivotaje parcial es equivalente a la decomposici´on
PA = LU
47
Borrador
3.2 Descomposiciones matriciales LECCI´ON I
donde P es el resultado de permutar las filas (o columnas) de la identidad. Alternativa-
mente, equivale a una descomposici´on de la forma
A = LU
donde L = P−1
L, de forma que L es una permutaci´on de la matriz triangular inferior9
.
La siguiente subrutina devuelve esa descomposici´on.
01 % LUPERMUTACION
02 %
03 % [L,U]=LUPERMUTACION(A)
04 %
05 % devuelve U triangular superior, L permutacion
06 % por filas de una matriz triangular inferior con
07 % 1s en la diagonal de forma que A=L*U
08
09 function [l,u]= LUPermutacion(a)
10 n=length(a);
11 p=1:n;
12
13 for i=1:n-1
14 [maximo,r]=max(abs(a(p(i:n),i)));r=r+i-1;
15 p([i r])=p([r i]);
16 for k=i+1:n
17 l(p(k),i)=a(p(k),i)/a(p(i),i);
18 a(p(k),i:n)=a(p(k),i:n)-l(p(k),i)*a(p(i),i:n);
19 end
20 end
21 for i=1:n
22 l(p(i),i)=1;
23 end
24 u=a(p,:);
25 return
3.2.3. Comandos correspondientes en Matlab
Todas las factorizaciones vistas con anterioridad est´an, por supuesto, implementadas
en Matlab. Algunos de los comandos relacionados son
9
Esto es, es el resultado de reordenar las filas de L.
48
Borrador
LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales
[l,u]=lu(a) devuelve u triangular superior, l permutaci´on de una triangular inferior
con 1s en la diagonal de forma que a=l*u.
[l,u,p]=lu(a) devuelve u triangular superior, l triangular inferior con 1s en la diagonal
y p matriz de permutaci´on de forma que p*a=l*u.
r=chol(a) devuelve r triangular superior de forma que a=r’*r. Observa que con
las notaciones introducidas r es precisamente la traspuesta de la matriz
L, expuesta en nuestro algoritmo. El comando asume que la matriz es
sim´etrica por lo que s´olo trabaja con la parte superior de la matriz.
Otra descomposici´on habitual10
es la denominada QR que devuelve Q ortogonal (es decir,
Q Q = In) y R triangular superior de forma que A = QR. El comando encargado de esta
tarea es qr.
Con estas instrucciones la soluci´on de un sistema utilizando la descomposici´on LU se
ejecuta con las siguientes l´ıneas
[l,u]=lu(a); x=u(lb);
La colocaci´on de los par´entesis es esencial. Con ulb se calcula (u−1
l)−1
b que obvia-
mente no tiene nada que ver con la soluci´on del sistema. No hay que preocuparse por el
hecho de que las matrices sean triangulares (o permutaci´on de una triangular). Matlab, y
en concreto la instrucci´on  detecta esto y resolver´a el sistema por sustituci´on progresiva
(o regresiva), sin intentar realizar la eliminaci´on gaussiana.
Nota hist´orica11
Ideas similares a la eliminaci´on gaussiana pueden encontrarse muchos siglos atr´as, con
referencias que se remontan a las matem´aticas babil´onicas y chinas. Carl Friedreich Gauss
introdujo el m´etodo que lleva su nombre entorno a 1800 cuando trataba de resolver un
problema de ajuste por m´ınimos cuadrados relacionado con el c´alculo de la ´orbita del
asteroide Palas. Parece ser que Joseph Louis Lagrange hab´ıa utilizado ideas similares 50
a˜nos antes para dilucidar si una forma cuadr´atica (hoy dir´ıamos matriz) era definida pos-
itiva. El matem´atico alem´an Carl Gustav Jacob Jacobi extendi´o la idea de la eliminaci´on
gaussiana a matrices arbitrarias.
Es rese˜nable que la noci´on de matriz tal como la conocemos ahora era desconocida
para Gauss y Lagrange. El concepto de matriz, y el ´algebra asociada (esto es, las opera-
ciones) habr´ıan de esperar a los trabajos de James J. Sylvester (que en 1848 introdujo el
t´ermino matriz) y de Arthur Cayley (que siete a˜nos despu´es defini´o el producto matricial
identific´andolo con el c´alculo de la composici´on de aplicaciones lineales y defini´o la in-
versa de una matriz). Importantes fueron tambi´en las contribuciones del f´ısico Hermann
10
Veremos dos algoritmos para obtener esta descomposici´on en la Lecci´on IV. Aunque para la resoluci´on
de sistemas de ecuaciones lineales la descomposici´on QR es m´as estable num´ericamente que la LU, se
suele optar por esta ´ultima por tener un menor coste computacional (aproximadamente la mitad).
11
Las principales referencias utilizadas para esta nota han sido “Very Early Days of Matrix Compu-
tations”, Beresford Parlett en SIAM News, 3, no 9; “Matrix Algorithms”, G.W. Stewart; “Computer
solutions of large system of equations”, G. Merant y “An introduction to Numerical Analysis”, E. S¨uli y
D. Mayers. Estas referencias est´an completamente detalladas en la bibliograf´ıa.
49
Borrador
3.2 Descomposiciones matriciales LECCI´ON I
Grassmann (introdujo la primera ´algebra vectorial no conmutativa, basada en el producto
vectorial de dos vectores; consider´o tambi´en el producto de un vector fila por un vector
columna que daba lugar a una matriz de rango uno), Willard Gibbs y Paul A. Dirac.
La equivalencia entre la descomposici´on LU y la eliminaci´on gaussiana parece que fue
probada por primera vez por Paul S. Dwyer en 1944. Curiosamente, la descomposici´on
de Cholesky es anterior. Publicado p´ostumamente en 1924 en una revista de Geodesia
(Andr´e-Louis Cholesky muri´o en 1918). El trabajo original trataba sobre la resoluci´on
de un problema de ajuste por m´ınimos cuadrados y pas´o desapercibido hasta que fue
rescatado por John Todd a finales de los a˜nos 1940.
Los primeros an´alisis sobre la estabilidad num´erica de la eliminaci´on gaussiana, es
decir la viabilidad de su programaci´on, se remontan a los trabajos de Harold Hotelling,
Alan Turing12
, John von Neumann y Herman Heine Goldstine. Los resultados iniciales
eran descorazonadores. Harold Hotelling prob´o en torno a 1940 que el error de redondeo
podr´ıa crecer como 4n
donde n era el orden de la matriz. Este resultado colocaba al m´etodo
de Gauss como un m´etodo inviable para la resoluci´on de grandes sistemas lineales. Turing
lleg´o a resultados similares de manera informal. El an´alisis de Neumann y Goldstine ya
probaba que el m´etodo era estable para matrices definidas positivas13
. James H. Wilkinson,
reconocido universalmente como el padre del an´alisis moderno de estabilidad (frente a los
errores de redondeo), extendi´o el an´alisis a matrices generales y mostr´o que el pivotaje
mejoraba enormemente la estabilidad del m´etodo. Lo m´as curioso es que el an´alisis inicial
estaba enfocado m´as hacia el c´alculo de la inversa de la matriz que al m´etodo de Gauss.
Como curiosidad final, Cleve Moler, programador original de Matlab, cita14
a Wilkinson
y Todd entre las personas que tuvieron una gran influencia en su formaci´on y por ende
en los or´ıgenes de Matlab.
12
La vida de Alan Turing es una de las m´as tr´agicas en historia de las matem´aticas. Dotado de una in-
teligencia precoz, realiz´o contribuciones importantes en l´ogica y computaci´on. Trabaj´o durante la segunda
guerra mundial en Bletchley Park en el descifrado de los c´odigos alemanes encriptados con la m´aquina
Enigma mediante la utilizaci´on del primer ordenador electr´onico en el mundo (Colossus). El papel que
este trabajo an´onimo tuvo en la victoria aliada, los alemanes siempre estuvieron seguros de que su c´odigo
era indescifrable, s´olo ha empezado a reconocerse en fechas recientes. La presi´on y aislamiento a la que
Turing fue sometido por su homosexualidad, llegando incluso a ser detenido por ello, le llev´o al suicidio
en 1954 despu´es de haberse sometido a un tratamiento con bromuro para curarle de su enfermedad.
13
En los primeros a˜nos se sugiri´o incluso resoluci´on de un sistema Ax = b mediante las ecuaciones
normales A Ax = A b (A A es sim´etrica y definida positiva).
14
http://www.mathworks.com/company/newsletters/news notes/clevescorner/dec04.html
50
Borrador
Lecci´on II
Programaci´on avanzada en Matlab.
M´etodos iterativos para sistemas de
ecuaciones lineales
51
Borrador
Borrador
Introducci´on
Homer: Marge? Since I’m not talking to Lisa, would you
please ask her to pass me the syrup?
Marge: Dear, please pass your father the syrup, Lisa.
Lisa: Bart, tell Dad I will only pass the syrup if it won’t be
used on any meat product.
Bart: You dunkin’ your sausages in that syrup homeboy?
Homer: Marge, tell Bart I just want to drink a nice glass of
syrup like I do every morning.
Marge: Tell him yourself, you’re ignoring Lisa, not Bart.
Homer: Bart, thank your mother for pointing that out.
Marge: Homer, you’re not not-talking to me and secondly I
heard what you said.
Homer: Lisa, tell your mother to get off my case.
Bart: Uhhh, dad, Lisa’s the one you’re not talking to.
Homer: Bart, go to your room.
The Simpsons, Episodio 5, temporada 5, Lisa the Vegetarian
En el primer apartado entraremos en aspectos m´as avanzados en el tratamiento de
vectores y matrices en Matlab, haciendo hincapi´e especial en la manipulaci´on de matrices
sparse. Veremos tambi´en c´omo se pueden implementar funciones donde el n´umero de
argumentos de entrada y salida son variables.
En la parte matem´atica, tocaremos la teor´ıa b´asica de m´etodos iterativos para sistemas
de ecuaciones lineales. Empezaremos con los m´etodos cl´asicos: Jacobi, Gauss–Seidel y
relajaci´on de Young, para pasar luego a m´etodos m´as modernos y elaborados: el m´etodo
del Gradiente y especialmente, el m´etodo del Gradiente Conjugado.
En esta lecci´on nos permitiremos hacer algo de Matem´aticas. Animamos a que el lector
no se asuste por ello y a que trate de entender los enunciados y las demostraciones que se
ofrecen. Para ello se asumen unos conocimientos m´ınimos en ´Algebra Lineal.
53
Borrador
Borrador
Cap´ıtulo 4
Matlab: programaci´on avanzada
4.1. Retorno a las matrices
A estas alturas el lector ya deber´ıa estar convencido sobre las capacidades de Matlab
en lo que se refiere al manejo de enormes cantidades de memoria. En esta secci´on expon-
dremos algunos comandos adicionales y entraremos con cierto detalle en la manipulaci´on
de matrices sparse1
.
4.1.1. Acceso a partes estructuradas de una matriz
En ocasiones es importante tomar partes precisas de una matriz que no son necesaria-
mente partes de filas, columnas o simplemente submatrices (estas acciones ya se trataron
en la primera lecci´on). Para este fin nos pueden servir las siguientes instrucciones
diag triu tril
La primera toma la diagonal de una matriz mientras que la segunda y tercera toman
la parte triangular superior (upper) e inferior (lower) respectivamente. Adem´as estos co-
mandos son algo m´as flexibles de lo que pueda parecer a simple vista como veremos a
continuaci´on.
Empecemos introduciendo una matriz
>> a=[11 12 13; 21 22 23; 31 32 33];
El resultado de los siguientes comandos es, a la luz de lo anterior, esperable
>> diag(a)
ans =
11
22
33
1
Aceptaremos este anglicismo en lo que sigue. En ocasiones este vocablo se traduce por matrices huecas
o matrices dispersas.
55
Borrador
4.1 Retorno a las matrices LECCI´ON II
>> triu(a)
ans =
11 12 13
0 22 23
0 0 33
>> tril(a)
ans =
11 0 0
21 22 0
31 32 33
El usuario puede especificar qu´e diagonal se escoge, o a partir de qu´e diagonal se toma
la matriz triangular. La diagonal principal es la cero y las subdiagonales inferiores (respec-
tivamente superiores) est´an numeradas consecutivamente con n´umeros enteros negativos
(respectivamente positivos). El siguiente ejemplo ilustra estas caracter´ısticas.
>> diag(a,-1)
ans =
21
32
>> tril(a,-1)
ans =
0 0 0
21 0 0
31 32 0
>> triu(a,0)
ans =
11 12 13
0 22 23
0 0 33
Ejercicio 4.1 Programa una funci´on que dada una matriz a devuelva un vector d con los
elementos de la diagonal, una matriz triangular superior u con todos los elementos de a situados
56
Borrador
LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada
encima de la diagonal superior y l una matriz triangular inferior con todas las entradas de
debajo de la diagonal principal.
Ejercicio 4.2 ¿Qu´e sucede si aplicamos los comandos anteriores a matrices rectangulares?.
Con diag podemos tambi´en construir a partir de un vector una matriz diagonal
>> diag([1 2]) % es lo mismo que diag([1 2],0)
ans =
1 0
0 2
>> diag([1 2],1)
ans =
0 1 0
0 0 2
0 0 0
Ejercicio 4.3 ¿C´omo utilizar´ıas el comando diag para generar una matriz con la diagonal
de una dada?.
Nota. El comando blkdiag permite construir matrices diagonales por bloques:
>> blkdiag(1,[1 2; 3 4], 5)
ans=
1 0 0 0
0 1 2 0
0 3 4 0
0 0 0 5
Trasposici´on de matrices
Dada una matriz A, la matriz traspuesta A es la matriz resultante de intercambiar
las filas con las columnas de A. Esto es, las filas de A pasan a ser las columnas de A .
Esta operaci´on se denota en Matlab con “ ’ ” :
>> a=[1 2 3; 0 2 4];
>> a’
ans =
57
Borrador
4.1 Retorno a las matrices LECCI´ON II
1 0
2 2
3 4
Obviamente, tambi´en se aplica sobre vectores:
>> b=[1;2;3]; % vector COLUMNA con tres elementos
>> b’ % vemos ahora un vector FILA
ans =
1 2 3
De nuevo nos encontramos con esta propiedad sobre la que ya hemos incidido: Matlab
distingue entre vectores filas y columnas, y esta diferencia se hace especialmente palpable
(y en ocasiones molesta) a la hora de realizar operaciones como productos matriz-vector.
Nota. En Matlab existe tambi´en el operador “.’”. Sobre matrices reales funciona exac-
tamente igual que el comando anterior, pero no as´ı sobre n´umeros complejos. Adem´as de
trasponer, “’”, conjuga todas las entradas. Es decir, cambia el signo a la parte imaginaria
de cada elemento. Matem´aticamente hablando, ´este es el operador de trasposici´on o con-
jugaci´on, denotado habitualmente en matem´aticas con “A∗
”. Por contra, “.’” se limita a
intercambiar filas por columnas en la matriz:
>> clear i % i es ahora la unidad imaginaria
>> a=[i 1-2i; 1 0.3+4i];
>> a.’
ans =
0 + 1.0000i 1.0000
1.0000 - 2.0000i 0.3000 + 4.0000i
>> a’
ans =
0 - 1.0000i 1.0000
1.0000 + 2.0000i 0.3000 - 4.0000i
Dada una matriz a, si ejecutamos a(:), obtenemos el vector columna que se con-
struye concatenando las columnas de a. T´ecnicamente hablando, nos est´a mostrando la
matriz tal como se guarda en memoria. Por ejemplo,
58
Borrador
LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada
>> a=[1 2 3; 0 2 4];
>> a(:)
ans =
1
0
2
2
3
4
>> a=a’; %trasponemos a
>> a(:)
ans =
1
2
3
0
2
4
Esto puede utilizarse para hacer un par de trucos:
En ocasiones la entrada de una funci´on es un vector, sin importar si ´este es fila o
columna.
La instrucci´on
>> b=b(:);
har´a de b un vector columna, sea cual sea su formato inicial. Si lo que se desea es
un vector fila, basta con trasponer
>> b=b(:)’; % b=b(:).’ mejor por si b es complejo
Se puede utilizar para introducir las entradas de una matriz por columnas. A modo
de ejemplo,
>> a=zeros(4,3);
>> a(:)=[1 2 3 4 5 6 7 8 9 10 11 12]
a =
59
Borrador
4.1 Retorno a las matrices LECCI´ON II
1 5 9
2 6 10
3 7 11
4 8 12
>> a2=zeros(2,6);
>> a2(:)=a(:)
a2=
1 3 5 7 9 11
2 4 6 8 10 12
Nota. El comando reshape permite modificar las dimensiones de una matriz (o array
en general). Es m´as flexible que el comando “:”.
4.1.2. M´as operaciones sobre matrices
Hasta ahora las operaciones matriciales que han centrado nuestra atenci´on son las fun-
damentales: suma y producto. En Matlab est´an tambi´en implementadas otras operaciones
comunes en el ´Algebra Lineal. Entre todas ellas destacamos
dot: Calcula el producto escalar de dos vectores:
>> dot([1 2 3],[4 5 6])
ans =
32
Devuelve el produto 1·4+2·5+3·6 = 32. Este comando no distingue entre vectores
filas y columnas, y es aplicable siempre que tengan la misma longitud.
La funci´on se puede aplicar a matrices bien por columnas, ´esta es la forma est´andar2
,
o por filas.
>> a=[1 2 3; 4 5 6]; a2=[1 1 1; 1 1 1];
>> dot(a,a2) % producto por columnas
ans =
5 7 9
2
Recuerda la predilecci´on de Matlab por las columnas.
60
Borrador
LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada
>> dot(a,a2,2) % producto por filas
ans =
6
15
sum: calcula la suma de las entradas un vector. Es aplicable tambi´en a matrices, en el
sentido del comando anterior
>> v=[1 2 3]; a=[1 2 3; 4 5 6];
>> sum(v)
ans =
6
>> sum(a) % suma por columnas
ans =
5 7 9
>> sum(a,2) % suma por filas
ans =
6
15
prod: Como sum pero con el producto.
max: Calcula el m´aximo en un vector. Puede devolver su posici´on en el vector. Aplicado
sobre matrices funciona de la misma forma que dot o sum. Esto es, devuelve el
m´aximo de cada columna por defecto, o de cada fila si as´ı se le indica
>> v=[-2 -5 -3]; a=[2 3 8; -4 2 9];
>> max(v)
ans=
-2
>> [p,m]=max(abs(v)); [p,m]
61
Borrador
4.1 Retorno a las matrices LECCI´ON II
ans =
5 2
>> max(a)
ans =
2 3 9
>> max(a,[],2) % busqueda por filas
ans =
8
9
>> [m,p]=max(a,[],2); p % posicion del maximo
ans=
1
1
La raz´on por la que se utiliza [] en la l´ınea anterior es que esta instrucci´on tambi´en
se puede utilizar para comparar dos arrays del mismo tama˜no
>> a1=[3 1 2; 5 3 2]; a2=[4 2 1; 1 2 3];
>> max(a1,a2)
ans =
4 2 2
5 3 3
Al insertar el vac´ıo indicamos a Matlab que no existe un segundo vector y que debe
proceder a buscar el m´aximo de a en su segunda dimensi´on, esto es, el m´aximo por
filas.
min: Calcula el m´ınimo procediendo exactamente igual que max.
norm: norma de una matriz o vector. Se puede escoger entre varias normas.
>> v=[1 2 3];a=[1 2; 3 4];
>> [norm(v) norm(v,1) norm(v,inf)] % norma 2, 1 e infinito de v
ans =
62
Borrador
LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada
3.7417 6.0000 3.0000
>> [norm(a) norm(a,1) norm(a,inf)] % normas matriciales
ans =
5.4650 6.0000 7.0000
En la Secci´on 5.2.3 comentaremos brevemente la definici´on de estas normas.
rank: rango num´erico de una matriz. Esto es, el n´umero m´aximo de filas o columnas
linealmente independientes3
.
cond: Calcula norm(a)*norm(inv(a)), el condicionamiento de una matriz4
. El condi-
cionamiento da una medida de la sensibilidad del sistema a perturbaciones en el
t´ermino independiente.
rcond: estimador del inverso del condicionamiento de una matriz. Es sensiblemente m´as
econ´omico de calcular que cond.
Nota. Cuando el comando dot se aplica a dos vectores complejos, procede siempre a
conjugar el primer vector. Es decir, matem´aticamente
dot(u, v)
n
i=1
uivi.
As´ı,
>> u=[1+i 2+2i]; v=[2 1];
>> dot(u,v)
ans =
4.0000 - 4.0000i
>> dot(v,u)
ans =
4.0000 + 4.0000i
Ejercicio 4.4 ¿C´omo sumar´ıas los elementos de una matriz?. ¿C´omo encontrar´ıas el m´ınimo
y el m´aximo?. ¿Y su posici´on?
3
Una matriz tiene, en general, rango m´aximo por los errores de precisi´on de la m´aquina. Este comando
hace una estimaci´on del rango, eliminando este factor.
4
En realidad no construye la inversa de la matriz por ser costoso.
63
Borrador
4.1 Retorno a las matrices LECCI´ON II
4.1.3. Matrices sparse
Las matrices sparse son una importante clase de matrices que surge en diferentes
´ambitos del An´alisis Num´erico y de las Matem´aticas y ciencias en general (elementos
finitos, teor´ıa de grafos,...).
En la Figura 4.1 se puede ver un ejemplo de una matriz sparse sim´etrica donde los
puntos indican las entradas diferentes de cero. Desde una ´optica puramente computacional
hace falta desarrollar sistemas de almacenamiento especiales dado que la inmensa mayor´ıa
de las entradas no deben ser almacenadas porque son nulas.
Figura 4.1: Diagrama de un matriz sparse 400 × 400 con 2690 elementos no nulos.
Matlab provee de forma muy sencilla ese almacenamiento. Con
>>a=sparse(100,100); b=sparse(100,1);
declaramos a como una matriz sparse 100×100 y un vector columna b de 100 elemen-
tos. Todas las entradas son inicialmente ceros, pero se guarda la estructura b´asica para
introducir los elementos no nulos
>> a=sparse(100,100)
a =
All zero sparse: 100-by-100
>> a(4,4)=1; a(8,9)=-4; a(80,45)=-1; a(99,100)=4;
>> a
a =
64
Borrador
LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada
(4,4) 1
(8,9) -4
(80,45) -1
(99,100) 4
Para transformar una matriz llena (convencional) en una matriz sparse podemos utilizar
tambi´en este comando
>> a=diag([1 2 3 4 5]);
>> a=sparse(a)
a =
(1,1) 1
(2,2) 2
(3,3) 3
(4,4) 4
(5,5) 5
Con full realizamos la operaci´on inversa: transforma una matriz sparse en una matriz
llena,
>> a=full(a)
a =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
La instrucci´on spalloc tiene un funcionamiento muy similar a sparse. Es ´util si se sabe
el n´umero de elementos no nulos que tendr´a dicha matriz. Concretamente
>> a=spalloc(8,7,12)
declara una matriz 8 × 7 con a lo sumo 12 elementos no nulos. Al informar de cu´antos
elementos no nulos se esperan Matlab hace una gesti´on m´as eficiente de la memoria.
El comando nnz (Non zeros) nos informa del n´umero de elementos no nulos de una
matriz, mientras que su esquema (pattern), como el que aparece en la Figura 4.1, se obtiene
con spy:
>> a=sparse(10,10);
>> a(1,4)=1; a(2,8)=-4; a(3,9)=1; a(7,8)=5;
>> nnz(a)
ans=
65
Borrador
4.2 Argumentos de funciones LECCI´ON II
4
>> spy(a)
La gr´afica se despliega en una ventana separada.
Todas las operaciones que hemos visto est´an adaptadas al nuevo entorno. As´ı, los
operadores
: triu tril diag
devuelven vectores/matrices sparse. Las operaciones
* + .* dot ’
est´an asimismo optimizadas. El problema de generar c´odigo eficiente no es tan simple
como pudiera parecer. Por ejemplo, si se aplica la funci´on dot a dos vectores sparse es
preciso saber antes qu´e entradas hay que multiplicar. De otra forma podr´ıamos estar
dedicando un alto porcentaje de nuestro esfuerzo en simplemente calcular productos por
cero. Afortunadamente, Matlab hace ese trabajo por nosotros.
Por otro lado, aparecen una nueva serie de comandos, que devuelven matrices sparse,
entre los que merece la pena destacar
spdiags maneja las diagonales de una matriz de forma an´aloga a diag;
speye devuelve una matriz diagonal con unos, o similar (an´aloga a eye);
spones matriz de 1s, similar a ones;
sprand, sprandn construyen una matriz sparse con entradas aleatorias (similar a
rand);
Ejercicio 4.5 Con la ayuda de Matlab averigua la sintaxis concreta de los comandos ante-
riores y comprueba con alg´un ejemplo c´omo funcionan.
4.2. Argumentos de funciones
Veremos a continuaci´on c´omo se pueden programar funciones en las que tanto el
n´umero de argumentos de entrada como de salida sean variables. Esta caracter´ıstica dota
de una mayor flexibilidad a la programaci´on en Matlab.
Los comandos esenciales que precisamos son
varargin nargin varargout nargout
La instrucciones nargin y nargout informan respectivamente sobre el n´umero de variables
de entrada y el n´umero de variables de salida (number of input arguments y number of
output arguments).
Una funci´on puede aceptar una serie de argumentos fijos, al estilo de las funciones que
programamos en la lecci´on anterior, y un conjunto de argumentos opcionales, que pueden
66
Borrador
LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada
ser o no especificados por el usuario. Para su acceso se utilizan respectivamente varargin
(variable input argument) y varargout (variable output argument) mediante llaves ({})5
.
Mostramos a continuaci´on un ejemplo de utilizaci´on conjunta de estas nuevas instruc-
ciones. En la cabecera se informa de qu´e hace la funci´on, dependiendo de los argumentos
de entrada y salida.
01 % DESCOMPOSICIONLU
02 %
03 % [L,U] = DESCOMPOSICIONLU(A)
04 % Devuelve U triang superior, L permutacion de una
05 % triang inferior con 1s en la diagonal tal que A=LU
06 %
07 % [L,U,X] = DESCOMPOSICIONLU(A,B)
08 % Devuelve U triang superior, L permutacion de una
09 % triang. inferior con 1s en la diagonal tal
10 % que A=LU y la solucion del sistema AX=B
11
12 function varargout=DescomposicionLU(a,varargin)
13
14 [l,u]=lu(a); % descomposicion LU
15
16 if nargin==1 & nargout==2
17 varargout{1}=l;
18 varargout{2}=u;
19 elseif nargin==2 & nargout==3
20 b=varargin{1}; % leemos el primer argumento opcional...
21 varargout{1}=l; varargout{2}=u;
22 varargout{3}=u(lb); % solucion del sistema
23 end
Como puede comprobarse, la funci´on precisa de un argumento obligatorio, la matriz
a, uno opcional, el t´ermino independiente, y devuelve dos o tres argumentos seg´un se
requiera. Observa los resultados que se han obtenido para varios ejemplos:
>> a=[1 3; 2 4];
>> [l,u]=DescomposicionLU(a)
l =
0.5000 1.0000
1.0000 0
u =
5
Las variables varargin y varargout son de un tipo especial denominado cell array. En la Lecci´on
IV estudiaremos su funcionamiento con m´as detalle.
67
Borrador
4.2 Argumentos de funciones LECCI´ON II
2 4
0 1
>> [l,u,x]=DescomposicionLU(a,[1 2].’)
l =
0.5000 1.0000
1.0000 0
u =
2 4
0 1
x =
1
0
>> [l,u]=DescomposicionLU(a,[1 2]) %falta un arg. de salida
??? Error using ==> DescomposicionLU
Too many output arguments.
>> [l,u,x]=DescomposicionLU(a) %faltan arg. de entrada
??? Error using ==> DescomposicionLU
Too many output arguments.
Ejercicio 4.6 A partir de la funci´on anterior implementa una funci´on que opere seg´un la
“siguiente cabecera”
% DESCOMPOSICIONLU2
%
% R = DESCOMPOSICIONLU2(A)
% Si A es simetrica definida positiva devuelve
% R triang superior tal que A=R’R
% [R,X] = DESCOMPOSICIONLU2(A,B)
% Si A es simetrica definida positiva devuelve
% R triang superior tal que A=R’R y la solucion
% del sistema AX=B
% [L,U] = DESCOMPOSICIONLU2(A)
% Devuelve U triang superior, L permutacion de
% una triang. inferior con 1s en la diagonal
% tal que A=LU
% [L,U,X]= DESCOMPOSICIONLU2(A,B)
% Devuelve U triang superior, L permutacion de
68
Borrador
LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada
% una triang. inferior con 1s en la diagonal
% tal que A=LU y la solucion del sistema AX=B
Nota: Realizar la comparaci´on A’==A para testar si la matriz es sim´etrica. ¿Qu´e devuelve esta
comparaci´on? ¿C´omo se puede utilizar para comprobar si efectivamente la matriz es sim´etrica?
¿Y para ver que es definida positiva?.
69
Borrador
4.2 Argumentos de funciones LECCI´ON II
70
Borrador
Cap´ıtulo 5
Matrices sparse en Matem´aticas.
M´etodos iterativos para sistemas de
ecuaciones lineales
5.1. M´etodo de Gauss para matrices sparse
Esta secci´on se centra en el estudio del m´etodo de Gauss para matrices sparse. Mostraremos
los problemas que presenta la aplicaci´on de este algoritmo a este tipo de matrices, espe-
cialmente el efecto relleno y algunas estrategias de reordenamiento que mitigan estos
efectos adversos. Sirve asimismo para ahondar en la problem´atica de los m´etodos directos
y allanar y fundamentar los m´etodos iterativos que se tratan en las siguientes secciones.
Recordemos que en Matlab la resoluci´on de sistemas de ecuaciones utilizando
>> x=ab;
se basa en el m´etodo de Gauss (o alguna de sus variantes). Puede plantearse la cuesti´on de
si es adecuado utilizar “” para matrices con formas especiales como por ejemplo matrices
triangulares o permutaciones de ´estas, para las que la eliminaci´on gaussiana no es nece-
saria puesto que las variables se pueden despejar de forma progresiva. Afortunadamente
Matlab detecta estas estructuras b´asicas y resuelve de una manera ´optima el sistema. Si
se consulta la ayuda para este comando se puede leer que se reconoce si una matriz es,
por ejemplo, sparse o llena, sim´etrica o no sim´etrica, triangular o permutaci´on de ´esta,
bandeada (los elementos concentrados en torno a la diagonal), de Hessenberg1
(con todos
los elementos por debajo de la subdiagonal principal nulos), etc., y aplica el m´etodo di-
recto m´as conveniente en cada caso. Testar si una matriz pertenece a uno de estos tipos
se puede realizar en un n´umero de operaciones despreciable respecto a las del m´etodo de
Gauss.
Hemos visto al final de la Lecci´on I que el m´etodo de Gauss es matem´aticamente
equivalente a calcular dos matrices L y U triangular inferior y superior respectivamente
con 1s en la diagonal de L de forma que
A = LU.
1
Ver Lecci´on IV
71
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb
Libro matlabweb

Más contenido relacionado

Similar a Libro matlabweb (20)

Libro matlabweb
Libro matlabwebLibro matlabweb
Libro matlabweb
 
Matlab y su lista de comandos
Matlab y su lista de comandosMatlab y su lista de comandos
Matlab y su lista de comandos
 
Informe matlab
Informe matlabInforme matlab
Informe matlab
 
Informe matlab
Informe matlabInforme matlab
Informe matlab
 
Guia para usar matlab
Guia para usar matlabGuia para usar matlab
Guia para usar matlab
 
LIDIA
LIDIALIDIA
LIDIA
 
matlab (2).pptx
matlab (2).pptxmatlab (2).pptx
matlab (2).pptx
 
Matlab guia introductoria_2001_09_10
Matlab guia introductoria_2001_09_10Matlab guia introductoria_2001_09_10
Matlab guia introductoria_2001_09_10
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Tutorial de matlab [101 paginas en español]
Tutorial de matlab [101 paginas   en español]Tutorial de matlab [101 paginas   en español]
Tutorial de matlab [101 paginas en español]
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Matlab
MatlabMatlab
Matlab
 
1.4 software numerico
1.4 software numerico1.4 software numerico
1.4 software numerico
 
trabajo analisis.pptx
trabajo analisis.pptxtrabajo analisis.pptx
trabajo analisis.pptx
 
Manual de-java
Manual de-javaManual de-java
Manual de-java
 

Último

Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxEduardoSnchezHernnde5
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxClaudiaPerez86192
 
CLASE - 01 de construcción 1 ingeniería civil
CLASE - 01 de construcción 1 ingeniería civilCLASE - 01 de construcción 1 ingeniería civil
CLASE - 01 de construcción 1 ingeniería civilDissneredwinPaivahua
 
Introducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptIntroducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptEduardoCorado
 
Falla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integralFalla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integralsantirangelcor
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxbingoscarlet
 
Unidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptxUnidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptxEverardoRuiz8
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdfvictoralejandroayala2
 
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdfCurso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdfcesar17lavictoria
 
Curso intensivo de soldadura electrónica en pdf
Curso intensivo de soldadura electrónica  en pdfCurso intensivo de soldadura electrónica  en pdf
Curso intensivo de soldadura electrónica en pdfFernandaGarca788912
 
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfTAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfAntonioGonzalezIzqui
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...RichardRivas28
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)ssuser563c56
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdfevin1703e
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdfAnthonyTiclia
 
nom-028-stps-2012-nom-028-stps-2012-.pdf
nom-028-stps-2012-nom-028-stps-2012-.pdfnom-028-stps-2012-nom-028-stps-2012-.pdf
nom-028-stps-2012-nom-028-stps-2012-.pdfDiegoMadrigal21
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfKEVINYOICIAQUINOSORI
 
Reporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacaReporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacajeremiasnifla
 
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfReporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfMikkaelNicolae
 

Último (20)

Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptx
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptx
 
CLASE - 01 de construcción 1 ingeniería civil
CLASE - 01 de construcción 1 ingeniería civilCLASE - 01 de construcción 1 ingeniería civil
CLASE - 01 de construcción 1 ingeniería civil
 
Introducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptIntroducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.ppt
 
Falla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integralFalla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integral
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptx
 
Unidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptxUnidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptx
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdf
 
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdfCurso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
 
Curso intensivo de soldadura electrónica en pdf
Curso intensivo de soldadura electrónica  en pdfCurso intensivo de soldadura electrónica  en pdf
Curso intensivo de soldadura electrónica en pdf
 
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfTAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdf
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
 
nom-028-stps-2012-nom-028-stps-2012-.pdf
nom-028-stps-2012-nom-028-stps-2012-.pdfnom-028-stps-2012-nom-028-stps-2012-.pdf
nom-028-stps-2012-nom-028-stps-2012-.pdf
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdf
 
Reporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacaReporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpaca
 
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfReporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
 

Libro matlabweb

  • 1. Matlab en cinco lecciones de Num´erico V´ıctor Dom´ınguez B´aguena Ma Luisa Rap´un Banzo Febrero de 2006 Disponible en http://www.unavarra.es/personal/victor dominguez/
  • 2.
  • 3. Borrador Prefacio El origen de este libro es una asignatura de libre elecci´on que uno de los autores im- parti´o durante los cursos 2004–2005 y 2005–2006 en la Universidad P´ublica de Navarra. Nuestra intenci´on original era tratar temas algo avanzados de C´alculo Cient´ıfico y utilizar Matlab como v´ıa para su aprendizaje. Los alumnos, obviamente, estaban m´as interesados en aprender Matlab y ve´ıan el Num´erico como forma de probar y ensayar las diferentes herramientas de Matlab que se iban exponiendo en clase. Desafortunadamente, la forma- ci´on en Num´erico de nuestros alumnos nos oblig´o a relajar considerablemente el contenido matem´atico del curso y a ser m´as modestos, desde el punto de vista te´orico, en nuestros objetivos. El resultado final en su vertiente matem´atica se podr´ıa enmarcar sin problemas en un curso introductorio de C´alculo Num´erico. En cuanto a Matlab, creemos que hemos tratado todos sus aspectos fundamentales aunque en ocasiones sea de forma superficial. Nuestro objetivo era conseguir no tanto un conocimiento muy profundo de Matlab como el de colocar al alumno en una buena posici´on de arranque para un autoaprendizaje. El enfoque y los temas tratados son consecuencia de diversos factores entre los que conviene citar nuestro propio bagaje matem´atico1 , el uso que hemos tenido que hacer de Matlab en nuestra carrera investigadora y, como ya hemos mencionado, los conocimientos de partida que ten´ıan nuestros propios alumnos. Hemos insistido bastante en la manip- ulaci´on de vectores y matrices y a la programaci´on en forma vectorizada. ´Esta es una de las diferencias m´as acusadas con los lenguajes de programaci´on tradicionales y una implementaci´on eficiente en Matlab pasa necesariamente por la vectorizaci´on. Los apuntes est´an organizados en torno a temas o lecciones, cada cual dividido en dos partes, la primera de Matlab y la segunda con un tema espec´ıfico de C´alculo Num´erico. En la primera parte se presentan los aspectos instrumentales de Matlab que utilizaremos en la implementaci´on de los algoritmos de la parte de Num´erico. La longitud de cada parte es variable, y dependiente de la dificultad tratada ya sea en la parte instrumental (Matlab) o en la parte matem´atica. De tanto en tanto nos hemos permitido hacer algo de Matem´aticas tratando de presentarlas en la forma m´as simple posible. A lo largo de estas p´aginas el lector podr´a encontrar ejercicios, algunos de ellos resuel- tos, que tratan de ahondar en puntos espec´ıficos, matem´aticos e inform´aticos. Finalmente se han introducido algunas notas hist´oricas que describen brevemente la evoluci´on que han tenido las ideas a lo largo del tiempo. Con ello tratamos de combatir la idea gaussiana, demasiado extendida, de las Matem´aticas como un mundo est´atico, monol´ıtico y perfecto donde la teor´ıa se presenta cerrada y completa. Las Matem´aticas en general y el C´alculo Cient´ıfico en particular recorren un largo trecho antes de llegar a este estado, durante el cual brotan ideas constantemente, siempre prometedoras en un primer momento, que 1 modelado por nuestra formaci´on cient´ıfica, com´un en muchos aspectos. i
  • 4. Borrador evolucionan con los a˜nos, con muchas de ellas desechadas finalmente e incluso algunas rescatadas a˜nos despu´es de considerarse como v´ıas muertas. Hemos adjuntado al final una bibliograf´ıa utilizada en este texto. Nos gustar´ıa resaltar tres textos sobre los dem´as. En primer lugar, Numerical Computing with Matlab, de Cleve Moler, que descubrimos cuando and´abamos en la redacci´on de la Lecci´on II. Su sencillez y la buena elecci´on de ejemplos ha ejercido una influencia considerable en estas notas. El segundo libro es ya un cl´asico entre los que aprendimos Matlab hace algunos a˜nos. And´abamos entonces en la b´usqueda de recursos en la web cuando nos encontramos con unos apuntes muy completos de libre divulgaci´on. Nos referimos al libro de Garc´ıa de Jal´on y sus colaboradores, Aprenda Matlab ?.? como si estuviera en primero. Diferentes versiones de estos apuntes llevan cubriendo de forma incansable la evoluci´on de Matlab desde la versi´on 4.0. Por ´ultimo, aunque no es un texto propiamente, la enciclopedia libre on line Wikipedia2 ha sido utilizada profusamente para obtener datos y fuentes utilizadas en la redacci´on de este texto. Debemos se˜nalar que estas informaciones han sido debidamente contrastadas. A pesar de algunos problemas iniciales, es seguro que la influencia de esta enciclopedia libre crecer´a exponencialmente en el futuro. Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayas que se ofreci´o muy generosamente a revisar este libro. Sus numerosas y acertadas indica- ciones y sugerencias han contribuido, y mucho, en la redacci´on final de este texto. Pamplona, Febrero de 2006 V´ıctor Dom´ınguez B´aguena Ma Luisa Rap´un Banzo 2 http://www.wikipedia.org ii
  • 7. Borrador Cap´ıtulo 1 Introducci´on ... and the first lesson of all was the basic trust that he could learn. It is shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult. Dune Frank Herbert 1.1. ¿Qu´e es? Matlab es un entorno de trabajo para el c´alculo cient´ıfico. Programado originalmente por Cleve Moler a finales de los a˜nos 70, su finalidad original era proporcionar una forma sencilla de acceder a las librer´ıas LINPACK y EISPACK donde est´an implementadas de una forma altamente eficiente los algoritmos clave del an´alisis matricial1 . De hecho, Matlab es una abreviatura de Matrix Laboratory Su primera implementaci´on se hizo en Fortran que era, y en buena medida a´un sigue si´endolo, el lenguaje est´andar en la implementaci´on de m´etodos num´ericos2 . Posterior- mente se reimplement´o en C, que es como se encuentra en la actualidad. Las aplicaciones de Matlab se fueron extendiendo a otras ramas del c´alculo cient´ıfico y de las ciencias aplicadas en general, dot´andole de una gran popularidad en ambientes cient´ıficos (especialmente en Ingenier´ıa). Dichas extensiones se consiguieron en gran parte mediante la implementaci´on de toolboxes, librer´ıas escritas en el lenguaje de programaci´on propio de Matlab y que ampliaban el rango de problemas que pod´ıan resolverse. Sin miedo a equivocarse, se pueden enunciar las siguientes ´areas donde Matlab muestra un gran potencial: ´algebra lineal num´erica; procesamiento de se˜nales (an´alisis, compresi´on de datos,..); 1 por ejemplo, el m´etodo de Gauss, el c´alculo de las descomposiciones m´as habituales del ´algebra matricial num´erica (LU, LL , QR), m´etodos iterativos,... 2 Fortran significa Formula translation. Desarrollado por IBM en 1954, es considerado como el primer lenguaje de alto nivel. Las ´ultimas actualizaciones (Fortran 95 y Fortran 2003) han dado nuevo vigor a este veterano lenguaje de programaci´on. 1
  • 8. Borrador dise˜no de sistemas de control; salidas gr´aficas; estad´ıstica; simulaci´on de sistemas din´amicos. La extensa gama de problemas que cubre hace de Matlab un lenguaje dif´ıcil de entender y manejar en su completitud. Esto no quiere decir que sea inarbodable: el conocimiento base que permite empezar a trabajar es muy sencillo. No obstante el elevado n´umero de comandos que se encuentra a disposici´on del usuario3 provoca que en ocasiones existan problemas no s´olo para encontrar los comandos adecuados sino tambi´en para tener una idea de qu´e posibilidades exactamente ofrece Matlab en un problema o tarea en particular. 1.2. ¿C´omo trabaja? El lenguaje de programaci´on de Matlab es bastante m´as flexible que el de los lenguajes tradicionales. No es preciso la declaraci´on inicial de variables, ´estas se pueden introducir en el momento que se necesiten, y por ejemplo, vectores y matrices pueden declararse sin especificar sus dimensiones e incluso cambiar sus tama˜nos sobre la marcha. Ello per- mite una programaci´on algo m´as desordenada, aunque debe tenerse bien claro que una programaci´on cl´asica, m´as al uso, suele generar c´odigo m´as eficiente. Por otro lado, una gran cantidad de m´etodos num´ericos se encuentran implementados de una forma muy eficiente y son accesibles como simples comandos. De esta forma, Mat- lab se puede utilizar como una caja negra: el usuario pregunta y el ordenador responde sin que ´este tenga que preocuparse de qu´e tipo de operaciones se han efectuado por el camino. De todas formas es conveniente tener una idea de qu´e m´etodos se est´an utilizando para as´ı ser conscientes de en qu´e condiciones van a funcionar, cu´al es en cada caso el m´eto- do adecuado, y especialmente el significado de los, posiblemente, numerosos argumentos opcionales que controlan el funcionamiento del algoritmo. A priori se pueden distinguir dos tipos de funciones en Matlab: funciones compiladas (Built in functions) y funciones no compiladas. Las primeras est´an optimizadas, son pro- gramas ya compilados y con el c´odigo no accesible para el usuario. Como ejemplos se pueden citar operaciones fundamentales +, *,. . . . las funciones matem´aticas b´asicas (sin, cos, exp, log,. . . ) algoritmos b´asicos del ´Algebra Lineal (inv, det, lu, chol, qr,...) s´alidas gr´aficas (plot, surf,...) 3 A modo de ejemplo, estos comandos cubren salidas gr´aficas: plot, line, ezplot, ezsurf, surf, surfc, line, patch, plot3, contour, contourf, ezcontour, pcolor, trimesh, trisurf,... 2
  • 9. Borrador Las funciones no compiladas est´an escritas siguiendo el lenguaje de programaci´on propio de Matlab. Estos comandos se guardan en ficheros *.m que es la extensi´on est´andar de los ficheros de Matlab4 . Originalmente, Matlab funcionaba como un interprete. Es decir, cada l´ınea de c´odigo era traducido antes de su ejecuci´on. Ello hac´ıa que una programaci´on similar a lenguajes cl´asicos de programaci´on diera lugar a c´odigo poco eficiente. Este problema se puede subsanar en gran medida recurriendo a la programaci´on vec- torizada. El siguiente ejemplo muestra las diferencias con una programaci´on est´andar No vectorizada y=zeros(1,1000); h=2*pi/999; for i=0:999 y(i+1)=sin(h*i); end Vectorizada y=sin(linspace(0,2*pi,1000)); En la primera parte del c´odigo, encontramos una estructura t´ıpica en los lenguajes de programaci´on: el comando for. Su significado es claro: las l´ıneas comprendidas entre el for y end se repiten 1000 veces con la variable i tomando valores de 0 a 999. El resultado final es el vector fila y que recoge el valor del seno en 1000 puntos uniformemente espaciados en [0, 2π]. Por otro lado, el comando linspace devuelve un array que contiene 1000 puntos equidistantes entre 0 y 2π. La funci´on seno es aplicada sobre todo el array devolviendo un vector con estos valores que se guarda en y. La diferencia entre ambas formas de programar es ahora patente. Mientras que en la primera realizamos 1000 llamadas a la funci´on seno con un argumento por llamada, en la segunda hay una ´unica llamada donde se requiere el c´alculo del seno en 1000 puntos, y el resultado se devuelve en un vector con estos valores (y por tanto tambi´en de longitud 1000). Desde el punto de vista de Matlab el segundo c´odigo es m´as eficiente. Habitualmente, la vectorizaci´on lleva consigo una reducci´on del c´odigo a la vez que se incrementan las necesidades de memoria. Con Matlab 6.5 se inici´o un proyecto a m´as largo plazo consistente en la aceleraci´on (Performance Acceleration) de las versiones no vectorizadas dirigida a estrechar las difer- encias con los lenguajes cl´asicos de alto nivel como Fortran, C o Pascal5 . En cualquier caso, la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en contraste con operaciones elemento a elemento como en los lenguajes tradicionales, es algo que conviene explotar por las importantes ventajas que proporciona. 4 Tambi´en est´a la extensi´on *.mat, propia de ficheros de datos. 5 De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecuci´on entre los dos c´odigos expuestos. 3
  • 10. Borrador 1.3. ¿C´omo aprenderemos? Como ya hemos se˜nalado anteriormente, aprender a manejar Matlab en su totalidad est´a fuera de los contenidos de un curso introductorio como ´este. No as´ı aprender los fundamentos y preparar el terreno para un autoaprendizaje de las partes en las que cada uno est´e interesado. Encontramos en este punto dos dificultades que salvar: saber de la existencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primera es la mayor dificultad. No obstante los comandos llevan siempre nombres nemot´ecnicos para facilitar su memorizaci´on. Las funciones de ayuda tambi´en echan una mano. Como a programar se aprende programando, comenzaremos escribiendo c´odigo desde los primeros pasos. Los esquemas num´ericos que implementaremos se encuentran pr´acti- camente en cualquier curso introductorio de An´alisis Num´erico. En cada lecci´on imple- mentaremos dichos algoritmos, introduciendo ´ordenes, estructuras de decisi´on, datos,... seg´un sea necesario. En los apuntes se incluyen m´ultiples ejercicios cuya realizaci´on ayudar´a al aprendizaje de la asignatura. Estos apuntes no deben tomarse como un manual en el estilo usual, sino como una forma de aprender Matlab y repasar o aprender el An´alisis Num´erico b´asico. Ya existen manuales extensos y concienzudos, en la bibliograf´ıa citamos algunos de ellos, que pueden servir para ese fin. 4
  • 11. Borrador Lecci´on I Primeros pasos en Matlab. M´etodos directos para sistemas de ecuaciones lineales 5
  • 13. Borrador Introducci´on When asked whether a programming language supports matrices, many people will think of two-dimensional arrays and respond, “Yes.” Yet matrices are more than two-dimensional arrays -they are arrays with operations. It is the operations that cause matrices to feature so prominently in science and engineering G.W. Stewart, Matrix Algorithms Comenzaremos en la primera parte de esta lecci´on tratando nociones b´asicas de Matlab, introduciendo el entorno de trabajo y las estructuras b´asicas de programaci´on. En segundo lugar entraremos en uno de los detalles fuertes de Matlab, la manipulaci´on de vectores y matrices. En la parte matem´atica estudiaremos m´etodos directos para la resoluci´on de sis- temas de ecuaciones lineales. En la implementaci´on de estos algoritmos repasaremos los conocimientos de Matlab expuestos en la primera parte. 7
  • 15. Borrador Cap´ıtulo 2 Matlab: Primeros pasos 2.1. Entorno de trabajo En las primeras secciones comenzaremos explorando Matlab de la forma m´as simple, en modo comando: el usuario pregunta y Matlab responde. El interfaz de Matlab es bastante pobre, con un aspecto est´etico que en modo alguno es comparable al de programas como Maple o Mathematica. El modo interactivo de trabajar es sencillo aunque algo inc´omodo. A modo de ejemplo, requiere algo de esfuerzo editar instrucciones ejecutadas con anterioridad y manejarse con bloques de comandos es muy engorroso. ´Este y otros problemas del modo interactivo se subsanan en gran medida empaquetando instrucciones con ficheros script y/o programando en funciones (subrutinas) que es la forma natural de trabajar en Matlab. En un segundo paso, se puede implementar un interfaz gr´afica, las guides de Matlab, que hacen m´as amigable la comunicaci´on con el usuario. En la Figura 2.1 podemos ver el aspecto inicial de Matlab. Distinguimos las siguientes ventanas Command window: ventana donde podemos ejecutar los comandos; Ventanas auxiliares: command history, workspace, current directory que informan sobre (y permiten editar) los comandos insertados, las variables declaradas y el directorio en el que estamos trabajando. Ventana de ayuda: en una ventana independiente proporciona un acceso completo a las funciones de ayuda de Matlab, incluyendo b´usquedas, demostraciones, etc. ´Estas son las caracter´ısticas b´asicas que debemos considerar: El prompt de Matlab es >>. El usuario escribe a continuaci´on. Para ejecutar se pulsa la tecla Enter. Se pueden recuperar comandos anteriores navegando con las flechas ↑ y ↓. Cuando se trabaje en Matlab, debemos tener muy en cuenta que: Se distinguen may´usculas y min´usculas. 9
  • 16. Borrador 2.1 Entorno de trabajo LECCI´ON I Figura 2.1: Pantalla Principal. Todos los comandos de Matlab se escriben en min´usculas y los argumentos se env´ıan entre par´entesis separados por comas. El car´acter % se utiliza para insertar comentarios. Todo lo que sigue (en la misma l´ınea) es ignorado por Matlab. Si se teclea al final de una instrucci´on ’;’ ´esta se ejecuta pero el resultado no se visualiza por pantalla. Dos comandos se pueden insertar en la misma l´ınea separados por “,” o por “;”. La diferencia entre los dos es que con “,” se muestran los resultados de las operaciones mientras que con “;” la operaci´on se ejecuta pero no se visualiza. Ejercicio 2.1 Ejecuta las instrucciones >> 4+4 % mi primera operacion >> 3^4, 4/9 >> 3^4; 4/9 >> 3^4, 4/9; >> 3^4; 4/9; 10
  • 17. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos y observa la salida. Haremos algunos comentarios sobre el ejercicio anterior. El circunflejo ^ es la poten- ciaci´on: >> 3^5 ans= 243 El t´ermino ans es la primera variable que vemos de Matlab. Concretamente, guarda la ´ultima salida dada por Matlab (answer): >> 4+6 ans = 10 >> ans*2 ans = 20 >> ans*2 ans = 40 La ra´ız cuadrada se puede calcular bien elevando a 1/2 (^(1/2)) o bien utilizando sqrt. Ejercicio 2.2 Comprueba la diferencia entre 4/4+6 4/(4+6) 3^5*2 3^(5*2) Nota. La prioridad de ejecuci´on entre operaciones matem´aticas es la habitual: primero se calcula la potenciaci´on ^, posteriormente los productos y divisiones *, / y en ´ultimo lugar, las sumas y restas + y -. Este orden se puede cambiar utilizando los par´entesis. La regla es sencilla: dada una expresi´on, lo primero que se calcula es lo que est´a dentro de cada par´entesis. Esta regla es recursiva, es decir, si dentro de un par´entesis hay otros par´entesis, para evaluar el primero se empezar´a con los par´entesis interiores. Los n´umeros reales se pueden insertar tambi´en en notaci´on cient´ıfica, muy adecuada si se trata de n´umeros grandes o muy peque˜nos (en valor absoluto). As´ı, se tiene la siguiente regla de construcci´on: m · 10r m er 11
  • 18. Borrador 2.1 Entorno de trabajo LECCI´ON I Por ejemplo 0.005 5e − 3 115 · 1012 115e12 −1201200000 −1.2012e009 0.00031415 3.1415e − 004 Existen adem´as dos n´umeros especiales: inf y NaN. El primer signo representa la can- tidad infinita (∞). El segundo es una abreviatura de “no es un n´umero” (Not a Number) y es el resultado que se devuelve ante una operaci´on indefinida como 0/0. Este s´ımbolo se puede utilizar en ´ambitos, en principio tan extra˜nos, como en el dibujo de superficies (v´er la Lecci´on V). En general los resultados num´ericos se presentan con cuatro cifras decimales correctas, aunque todas las operaciones se ejecutan en doble precisi´on1 . Si se desean las salidas con toda la precisi´on disponible se debe insertar la instrucci´on >> format long A partir de este punto, el resultado de cualquier operaci´on se mostrar´a con 16 cifras significativas. La instrucci´on >> format short devuelve a la forma est´andar con cuatro cifras decimales. Existen m´as opciones con format. Las siguiente l´ıneas muestran algunas de ellas: >> pi % el numero pi ans = 3.1416 >> format long % mayor precision >> pi ans = 3.14159265358979 >> format compact % compacto >> pi ans = 3.14159265358979 >> format bank %No fijo de cifras decimales >> pi ans = 3.14 1 Aproximadamente 16 cifras decimales correctas. En el momento de redactar estas l´ıneas, los proce- sadores de 32 bits dominan todav´ıa el parqu´e de ordenadores. Las nuevas generaciones, con procesadores con 64 bits, duplican la precisi´on de trabajo. 12
  • 19. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos >> format rat %salidas en forma fraccionaria >> pi ans = 355/113 >> format loose % mas espaciada >> pi ans = 355/113 Observa la diferencia de espaciamiento que se obtiene con las opciones compact y loose. N´umeros complejos La aritm´etica compleja se encuentra tambi´en integrada en Matlab. La unidad imagi- naria ( √ −1) se representa en Matlab con i ´o j: >> clear i j % borramos posibles valores de i y j >> i^2 ans= -1 >> j^2 ans= -1 El signo i suele ser habitual en Matem´aticas mientras que en diversas ramas de la F´ısica y en Ingenier´ıa de Telecomunicaciones o El´ectrica se prefiere el s´ımbolo j (en este caso para no confundir con la intensidad de corriente el´ectrica). De ah´ı que Matlab permita ambas representaciones. Todas las operaciones matem´aticas incluyen la aritm´etica compleja en el sentido usual >> 1+i +5-6i % suma de dos numeros complejos ans = 6.0000 - 5.0000i >> (5+3i)*(5-3i), (1+2i)/(3-4i) ans = 13
  • 20. Borrador 2.2 Comandos de ayuda LECCI´ON I 34.00 ans = -0.20 + >> conj(3e-3+2e-4i) % conjugado ans = 0.0030 - 0.0002i >> abs(3+4i), angle(2i) % modulo y argumento ans = 5 ans = 1.5708 2.2. Comandos de ayuda La ayuda de Matlab es ciertamente muy clara y completa. Los comandos siempre dispuestos a echarnos una mano son: help: muestra una ayuda por pantalla, en la ventana de comandos, con la informa- ci´on esencial sobre un comando concreto. helpwin: similar a help pero despliega la ayuda en una ventana auxiliar, permitien- do as´ı una navegaci´on, estilo web, muy c´omoda. lookfor: permite buscar una cadena en la primera l´ınea de todos los ficheros de ayuda. Por ejemplo, si deseamos ayuda sobre la funci´on sin, podemos ejecutar >> help sin SIN Sine. SIN(X) is the sine of the elements of X. Overloaded methods help sym/sin.m 14
  • 21. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos Figura 2.2: Pantalla de ayuda. o bien >> helpwin sin y obtener la pantalla que se muestra en la Figura 2.3. Adem´as, si aparece el enlace “Go to online doc for ...”, ´este nos permite navegar entre una ayuda mucho m´as completa donde se muestran ejemplos y detalles sobre la implementaci´on del comando (ver la Figura 2.42 ). Ejercicio 2.3 Utilizando las funciones de ayuda, obtener informaci´on de alguna de estas funciones elementales de Matem´aticas sin cos tan asin acos atan sec csc cot asec acsc acot sinh cosh tanh asinh acosh atanh exp log log10 log2 sign Mediante la instrucci´on 2 Para que esta opci´on est´e disponible es necesario que se haya instalado la ayuda completa de Matlab. A partir de la versi´on 6.0 la instalaci´on consta de (al menos) dos CDs, el primero con el programa y las librer´ıas habituales y el segundo con la documentaci´on de la ayuda. 15
  • 22. Borrador 2.3 Variables LECCI´ON I Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opci´on Go to online doc... >> help + se pueden adem´as visualizar las operaciones “elementales” seg´un Matlab. 2.3. Variables Matlab no necesita la declaraci´on de variables como en un lenguaje tradicional. En prin- cipio todas las variables son reales, y basta hacer uso de ellas para que queden declaradas: >> a=1; b=2; c=3; >> a-b ans = -1 >> a*b*c ans = 16
  • 23. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos Figura 2.4: Ayuda on line. 6 El comando who sirve para conocer los nombres de las variables declaradas, mientras que con whos obtenemos una informaci´on m´as precisa: >> who Your variables are: a b c >> whos a Name Size Bytes Class a 1x1 8 double array Grand total is 1 element using 8 bytes Para borrar una variable se utiliza la instrucci´on clear, por ejemplo, 17
  • 24. Borrador 2.3 Variables LECCI´ON I >> a=4; >> whos a Name Size Bytes Class a 1x1 8 double array Grand total is 1 element using 8 bytes >> clear a >> whos a >> borra la variable (es decir, whos no devuelve nada). Con la orden >> clear all se borran todas las variables declaradas hasta el momento. Nota. En Matlab es correcto declaraciones de este tipo >> sin=1; >> sin+1 ans= 2 De esta forma sin pasa a ser una variable que sobrescribe el valor original que ten´ıa como funci´on seno. Para recuperar el valor original basta ejecutar >> clear sin Almacenamiento de variables en ficheros Matlab ofrece la posibilidad de grabar las variables que deseemos en un fichero. De esta forma, podemos recuperarlas m´as adelante, ya sea en la misma sesi´on o en otra diferente3 . Por ejemplo >> a=4+i;% numero complejo >> b1=cos(2); >> b2=sin(2); >> save datos a b1 b2 graba dentro del directorio de trabajo, en un fichero de nombre datos.mat, las variables indicadas. Para recuperar, basta ejecutar >> load datos 3 Se entiende por sesi´on el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar el programa, todas las variables locales se pierden. 18
  • 25. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos 2.4. Ficheros script y funciones La forma m´as eficiente de empaquetar series de instrucciones simples y mec´anicas es utilizando ficheros script. Tareas m´as elaboradas, con, por ejemplo, variables de entrada y salida, requieren del uso de funciones. 2.4.1. Ficheros script Un fichero script es un simple documento de texto que contiene una sucesi´on de co- mandos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamente en la ventana de comandos. Describiremos el manejo de este tipo de ficheros mediante un sencillo ejemplo. Comen- zamos creando un fichero tecleando en modo comando la orden4 >> edit prueba Se despliega as´ı en una ventana aparte el editor de Matlab con el fichero prueba.m (“.m”es la extensi´on est´andar de Matlab). Es importante saber cu´al es el directorio de trabajo5 , pues es donde se guardar´a por defecto el fichero. Tecleamos ahora en el editor a=1+i; b=1-i; disp(’a*b=’) disp(a*b) disp(’a/b=’) disp(a/b) disp(’sqrt(a)=’) disp(sqrt(a)) El comando disp (de display) muestra vectores por pantalla de forma compacta. Dado que para Matlab un cadena de caracteres es simplemente un vector de car´acteres, se consigue con ello mostrar por pantalla mensajes de forma concisa. Una vez que el documento est´a grabado, para ejecutar las ´ordenes que contiene basta teclear el nombre del fichero en la ventana de comandos: >> prueba Se puede modificar las veces que se precise las variables a y b en el fichero script sin tener que teclear de nuevo todas las instrucciones. 2.4.2. Funciones En principio existen dos tipos de funciones: las funciones inline, que se insertan en la l´ınea de comandos y las que se escriben en un documento de texto externo. Esta ´ultima forma, que es la evoluci´on natural de los ficheros script, es m´as flexible y es en la que nos centraremos a continuaci´on. Dejaremos pendiente para la Lecci´on III la descripci´on de las funciones inline. Como antes, para crear un fichero que contenga a una funci´on se puede teclear: 4 Tambi´en es posible crear este fichero a golpe de rat´on. 5 Por defecto es C:MATLAB6p5work. 19
  • 26. Borrador 2.4 Ficheros script y funciones LECCI´ON I >> edit mifuncion En el editor puedes insertar este simple ejemplo: 01 % MIFUNCION 02 % 03 % Y=MIFUNCION(X) devuelve 04 % 05 % Y=X^2-COS(X) 06 % 07 function y=mifuncion(x) 08 09 y=x^2-cos(x); 10 11 return La funci´on se declara con function, la variable de entrada es x y se declara como variable de salida y. Se termina la ejecuci´on de la funci´on cuando se ejecuta un return o bien se llega al final de la funci´on6 . Ahora, para calcular el valor de π2 − cos(π) podemos ejecutar la orden: >> mifuncion(pi) ans = 10.8696 Nota. Los n´umeros correlativos situados a la izquierda no forman parte del c´odigo de la funci´on. Han sido insertados con el fin de numerar las l´ıneas y as´ı facilitar los comentarios que podamos hacer sobre el programa. Una funci´on puede no tener salidas, por ejemplo, 01 % INFORMACION 02 % 03 % INFORMACION devuelve informacion sobre 04 % la precision de la maquina 05 % 06 function informacion 07 08 disp(’precision de la maquina’) 09 disp(eps) 10 disp (’mayor numero real’) 11 disp(realmax) 12 disp (’menor numero real’) 13 disp(realmin) 14 return 6 En este sentido, el return del ejemplo anterior es superfluo. 20
  • 27. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos o bien devolver m´ultiples salidas: 01 % MIFUNCION2 02 % 03 % [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve 04 % 05 % Y1=X1+X2+X3; 06 % Y2=X1-X2+X3; 07 % 08 function [y1,y2]= mifuncion2(x1,x2,x3) 09 10 y1=x1+x2+x3; 11 y2=x1-x2+x3; 12 13 return Observa c´omo se recogen los resultados >> [z1,z2]=mifuncion2(1,2,3); >> z1 ans= 6 >> z2 ans= 2 >> z=mifuncion2(1,2,3); % Ahora solo devuelve el primero ans= 6 La cabecera que hemos introducido en el pre´ambulo de las funciones, es decir las l´ıneas anteriores a la declaraci´on de la funci´on y precedidas con “%”, constituyen la ayuda de la funci´on: >> help mifuncion2 MIFUNCION2 [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve Y1=X1+X2+X3; Y2=X1-X2+X3; 21
  • 28. Borrador 2.5 Vectores y matrices LECCI´ON I Aunque muy recomendables7 , su inclusi´on en una funci´on es opcional. La ayuda puede estar antes o despu´es de la declaraci´on de la funci´on. En cualquiera de los dos casos, Matlab despliega como ayuda todas las l´ıneas que esten precedidas con % hasta que se encuentra con la primera l´ınea no comentada. Nota. Para ser consecuentes, lo correcto es denominar de igual modo a la funci´on y al archivo que la contiene. Sin embargo esto no es obligatorio, es decir, se pueden dar nombres distintos, pero en este caso Matlab da preferencia al nombre del archivo. Aunque Matlab distingue entre may´usculas y min´usculas en sus comandos, esto no es extensible para funciones programadas en m-files, al menos en Windows. Es decir, para ejecutar una funci´on en un archivo, digamos, operaciones, se puede utilizar OPERACIONES, Operaciones y cualquier combinaci´on con may´usculas y min´usculas. Esto es debido a que el sistema de archivos de Windows tampoco hace esa distinci´on8 . Versiones m´as avanzadas de Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordancia exacta min´usculas-may´usculas entre el nombre del fichero y el comando utilizado para llamarlo. Todas las variables se env´ıan por valor, no por referencia. Es decir, si una funci´on modifica una variable de entrada, esta modificaci´on se pierde cuando finalice su ejecuci´on, recuperando el valor original. Por ´ultimo, en un fichero se pueden incluir varias funciones. En este caso s´olo la primera funci´on es accesible desde el exterior (l´ınea de comandos, otras funciones,...) mientras que el resto de funciones presentes en ese fichero son internas, es decir, utilizables ´unicamente por las funciones presentes en el archivo. Esto es importante a la hora de realizar una programaci´on modular. Si un conjunto de funciones son s´olo utilizadas por una funci´on principal, se pueden insertar en el mismo fichero que ´esta. Evitamos as´ı llenar la carpeta de trabajo, o de nuestro proyecto, con ficheros y m´as ficheros. 2.5. Vectores y matrices Dado que principalmente trabajaremos s´olo con arrays de una y dos dimensiones hablaremos en lo que sigue de los objetos matem´aticos correspondientes: vectores y ma- trices. Todo lo que sigue se puede adaptar a arrays con m´as dimensiones, aunque por simplificar, nos centraremos ahora en el manejo de vectores y matrices y dejaremos pen- diente para la Lecci´on IV el uso de arrays multidimensionales (tensores). 2.5.1. Definici´on de matrices y vectores Un vector o una matriz se puede definir dando sus elementos entre corchetes y sepa- rando filas mediante “;”. Por ejemplo, las instrucciones 7 No hay que subestimar nunca la capacidad de olvido de uno mismo: el c´odigo claro y legible de hoy es ilegible semanas despu´es. Las ayudas facilitan la edici´on de los programas no s´olo para un usuario externo sino para el propio programador. 8 Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombre Operaciones.m 22
  • 29. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos >> a=[1 3 -1; 2 3 4; 4 5 1]; >> a2=[1 2 4; -1 0 1; 2 1 5]; >> b=[1; 3; 1]; b2=[-1 1 -2 2]; definen las matrices y vectores a =   1 3 −1 2 3 4 4 5 1   , a2 =   1 2 4 −1 0 1 2 1 5   , b =   1 3 1   , b2 = −1 1 −2 2 . Matlab distingue entre vectores fila y columna por lo que habr´a que tenerlo en cuenta por ejemplo cuando se desee hacer operaciones como sumas o productos. Desde una vertiente pr´actica, si se va a trabajar con una matriz grande, por ejemplo de tama˜no 20 × 10, y sus valores se van a introducir m´as adelante, se puede empezar con >> a=zeros(20,10); A partir de este instante se pueden insertar los elementos, accediendo a cada posici´on mediante par´entesis >> a(4,5)=9; a(2,1)=6; a(1,1)=-3.4; >> a(4,5) ans= 9 En cualquier caso, si tratamos de introducir un valor en una posici´on no definida de la matriz, Matlab ir´a adaptando el tama˜no seg´un juzgue apropiado9 , y no dar´a ning´un error. El siguiente ejemplo ilustra esta caracter´ıstica >> clear c % c esta borrado >> c(1,2)=4 % c es ahora 1 x 2 c = 0 4 >> c(3,3)=2 % c pasa a ser 3 x 3 c = 0 4 0 0 0 0 0 0 2 Esta habilidad, aunque permite una programaci´on muy flexible y descuidada, debe uti- lizarse con mesura dado que puede provocar errores de ejecuci´on muy dif´ıciles de detectar. 9 Ello obliga a que haya que redimensionar constantemente la memoria otorgada a la variable a. Esto supone un costo adicional, inapreciable con ejemplos peque˜nos, pero importante para grandes cantidades de memoria. Por tanto es mejor declarar primero las dimensiones de la matriz e informar as´ı a Matlab de cu´anta memoria tiene que reservar. 23
  • 30. Borrador 2.5 Vectores y matrices LECCI´ON I 2.5.2. Operaciones Todas las operaciones habituales entre matrices, tales como la suma, producto, poten- ciaci´on, c´alculo de determinantes, inversas..., est´an ya implementadas en Matlab. No hay por tanto necesidad de programarse estas tareas. Por ejemplo, si a y a2 son matrices de tama˜nos compatibles, las instrucciones a*a2 a^2 a+a2 devuelven el producto matricial de a y a2, el cuadrado de a (es decir, a*a) y la suma de a y a2. Es importante observar la diferencia con estas l´ıneas a.*a2 a.^2 En el primer caso, se devuelve la matriz resultado de multiplicar elemento a elemento a y a2 (por tanto deben tener el mismo tama˜no) y en el segundo, una matriz cuyas entradas son el cuadrado de las de a. Esto es una constante en Matlab: el signo “.” indica que la operaci´on (un producto, una potencia o una divisi´on) se hace elemento a elemento, mientras que en caso contrario se calcula la operaci´on matem´atica, en este caso el producto matricial. Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tama˜no. Observa el resultado de ejecutar a+a2 a*a2 a.*a2 Define un vector b fila o columna y ejecuta b.^3 b’ Comprueba si estas operaciones est´an bien definidas a*2 a+1 ¿Qu´e hacen exactamente? ¿Por qu´e crees que no es necesario “.” en la primera instrucci´on?. Otros comandos importantes son det inv / /. . Los dos primeros son el determinante y la inversa de una matriz cuadrada. Los operadores “/” y “” (slash y backslash) son ciertamente especiales: a/a2 es equivalente a a*inv(a2), aa2 es equivalente a inv(a)*a2 En cuanto a su relaci´on con ./ y . es la misma que ha surgido antes, esto es, aplicado sobre matrices procede a realizar los cocientes elemento a elemento. Requiere por tanto que ambas matrices tengan el mismo tama˜no. Ejercicio 2.5 Ejecuta las instrucciones >> 3/5 >> 35 y observa el resultado. ¿Tiene sentido desde el punto de vista anterior?. Ejercicio 2.6 Dado b una matriz, ¿qu´e hace 1/b?. 24
  • 31. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos Nota. El operador backslash “” se utiliza profusamente para resolver sistemas de ecua- ciones lineales, bajo la idea de que Ax = b ⇔ x = A−1 b. As´ı, si b es n × 1 y a es n × n, >> x=ab; devuelve en x la soluci´on del sistema correspondiente. El funcionamiento real de dista mucho de ser tan simple. Esto es, no calcula la inversa de a para multiplicarla por b, sino que resuelve el sistema de ecuaciones por alguna variante del m´etodo de Gauss. Se puede utilizar helpwin mldivide (o helpwin mrdivide para /) para leer en detalle c´omo procede este comando. Las funciones propias de Matlab trabajan de forma natural sobre vectores y matrices. El resultado final es equivalente a aplicar el comando elemento a elemento. Por ejemplo, >> a=[0 pi/3; -pi/3 0]; >> cos(a) ans = 1.0000 0.5000 0.5000 1.0000 es equivalente a >> [cos(0) cos(pi/3); cos(-pi/3) cos(0)] ans = 1.0000 0.5000 0.5000 1.0000 2.5.3. Detalles adicionales C´omo obtener las dimensiones de vectores y matrices Los comandos de Matlab size y length nos proporcionan esta informaci´on: >> a3=[1 2; 3 6; 5 -1]; >> size(a3) ans = 3 2 >> length(a3) 25
  • 32. Borrador 2.5 Vectores y matrices LECCI´ON I ans = 3 >> a3=a3’; % cambiamos la forma de a3 >> size(a3) ans = 2 3 >> [m,n]=size(a3); % m son las filas y n las columnas >> m ans = 2 >> n ans = 3 >> length(a3) ans = 3 El comando size devuelve un vector de tama˜no 2×1 con el n´umero de filas y columnas del vector/matriz. El resultado es diferente seg´un se aplique a vectores fila o columna. La orden length devuelve la longitud de una matriz o vector. Su significado en el caso de un vector est´a clara mientras que para matrices devuelve el m´aximo entre el n´umero de filas y el n´umero de columnas. Matrices especiales Matlab dispone de una serie de comandos que permiten construir matrices con una estructura particular. Cabe se˜nalar las siguientes ´ordenes: eye(n) es la matriz identidad de orden n; ones(m,n) es una matriz m x n de 1s; zeros(m,n) es una matriz m x n de 0s, esto es, igual que ones pero con ceros; y algunas m´as ex´oticas como hilb, invhilb, pascal, magic. 26
  • 33. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos Existen dos formas de introducir vectores cuyos valores siguen una distribuci´on regular a:b:c construye el vector de valores [a a+b a+2*b .... a+k*b] donde a+k*b es el mayor n´umero natural que cumple a+k*b≤ c. La instrucci´on a:c toma b = 1. linspace(a,b,n) devuelve una partici´on uniforme de [a, b] en n puntos. Por ejemplo, >> 0:10 ans= 0 1 2 3 4 5 6 7 8 9 10 >> 10:-1:0 ans= 10 9 8 7 6 5 4 3 2 1 0 >> 0.1:0.3:1.5 ans = 0.1000 0.4000 0.7000 1.0000 1.3000 >> linspace(0,2,4) ans = 0 0.6667 1.3333 2.0000 >> linspace(2,0,4) ans = 2.0000 1.3333 0.6667 0 Nota. Cuando Matlab tiene que devolver un vector y no se le especifica el formato, devuelve una fila. 2.5.4. Acceso a partes de matrices El manejo de partes de vectores y matrices, as´ı como la eliminaci´on de filas o columnas, cambios de tama˜no, etc, se hace v´ıa instrucciones muy simples en Matlab. Aunque pueda resultar algo extra˜no al principio, un poco de pr´actica es suficiente para que el usuario se 27
  • 34. Borrador 2.5 Vectores y matrices LECCI´ON I adapte a la nueva sintaxis, tan diferentes a la de un lenguaje tradicional, y pueda utilizarlo en sus c´odigos. Comencemos viendo un ejemplo: >> a=[1 2 3; 4 5 6; 7 8 9; 10 11 12]; >> a(2,3) % elemento (2,3) de a ans = 6 >>a(2,:) % fila 2 de a ans = 4 5 6 >>a(:,1) % columna 1 ans = 1 4 7 10 >>a(:,2)=0 % columna 2 es ahora 0 a = 1 0 3 4 0 6 7 0 9 10 0 12 Podemos acceder a partes de una fila o columna: >> a(1,2:3) % vector [a(1,2) a(1,3)] ans = 0 3 >> a(2:4,3) % vector columna [a(2,3); a(3,3); a(4,3)] ans = 28
  • 35. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos 6 9 12 >> a(1:2,2:3) % matriz [a(1,2) a(1,3); a(2,2) a(2,3)] ans = 0 3 0 6 En general, si p es un vector de n´umeros enteros, v(p) devuelve [v(p(1)), v(p(2)), ..., v(p(n))]. Por ejemplo, >> v=[0.1 0.2 0.3 0.4 0.5 0.6]; >> v(4:-1:2) ans= 0.4000 0.300 0.2000 >> p=[5 1 2 3 3 3]; % no importa que esten repetidos >> v(p) ans= 0.5000 0.1000 0.2000 0.3000 0.3000 0.3000 Ejercicio 2.7 Ejecuta las siguientes l´ıneas >> a=[1 2 3 4; 5 6 7 8; 9 10 11 12]; >> p=[1 3 2]; q=[1 2 1]; >> a(p,q) ¿Qu´e hacen exactamente?. Igualmente es f´acil a˜nadir filas y columnas a una matriz: >> a=[1 2 3 4; 5 6 7 8] a = 1 2 3 4 5 6 7 8 >> a=[a; [1 -1 2 4]] % adosamos una fila nueva a = 29
  • 36. Borrador 2.6 Bucles y estructuras de decisi´on LECCI´ON I 1 2 3 4 5 6 7 8 1 -1 2 4 >> a=[a [0; 2; 4] ] % una nueva columna a = 1 2 3 4 0 5 6 7 8 2 1 -1 2 4 4 Si se desea eliminar una fila o columna se puede utilizar el s´ımbolo vac´ıo []. Por ejemplo, >> a(:,2)=[] % suprime la segunda columna a = 1 3 4 0 5 7 8 2 1 2 4 4 Ejercicio 2.8 Programa una funci´on cuyas entradas sean una matriz cuadrada y un t´ermino independiente compatible y que devuelva la matriz ampliada del sistema de ecuaciones lineales. Esto es, una matriz con la matriz original y una ´ultima columna con el t´ermino independiente. 2.6. Bucles y estructuras de decisi´on Claves en cualquier lenguaje de programaci´on, Matlab dispone de varias de ellas entre las que sobresalen for e if, un est´andar en el mundo de la inform´atica. 2.6.1. Bucles: el comando for En Matlab, la estructura for j=inicio:paso:final ..... end implementa un bucle donde las l´ıneas de c´odigo entre for y end son ejecutadas repetida- mente con j tomando los valores del vector inicio:paso:final (v´ease la Secci´on 2.5.3) Por ejemplo, >> for j=1:3; disp(j); end 1 30
  • 37. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos 2 3 >> for j=6:-2:2; disp(j-2); end 4 2 0 En general, si v es un vector, for j=v ..... end procede a ejecutar las l´ıneas internas con j tomando los valores del vector v. Por ejemplo, >> v=[2 5 3 1];for j=v; disp(j); end 2 5 3 1 Asociados a for, y en general a cualquier bucle, encontramos los comandos break y continue. El primero fuerza la salida inmediata del bucle mientras que el segundo reini- cializa la iteraci´on con el siguiente valor del ´ındice. Ejercicio 2.9 La matriz de Hilbert de orden n es A =       1 1 2 · · · · · · 1 n 1 2 1 3 · · · · · · 1 n+1 ... ... ... ... ... 1 n 1 2n−2 1 2n−1       Construye la matriz anterior mediante un fichero script y el uso de dos “for” anidados. 2.6.2. Operadores l´ogicos y estructuras de decisi´on Los operadores l´ogicos m´as b´asicos en Matlab son == igualdad, ~= desigualdad, > mayor, < menor, >= mayor o igual, <= menor o igual, & “y” l´ogico, | “o” l´ogico 31
  • 38. Borrador 2.6 Bucles y estructuras de decisi´on LECCI´ON I El resultado de una comparaci´on es 1 si es verdadero, 0 si es falso: >> a=1; b=2; c=3; >> a>0 ans = 1 >> a>0 & b<3 ans = 1 >> a<0 | b<1 ans = 0 >> test= (a~=0) ans = 1 >> whos test Name Size Bytes Class test 1x1 1 logical array Grand total is 1 element using 1 bytes Estos “0” y “1” no son valores num´ericos sino l´ogicos como se comprueba con la ´ultima instrucci´on10 . Cuando se aplica a un vector, devuelve un vector de verdadero/falso de la misma longitud que el vector original: >> b=[1 2 -3 -1 2 -4]; p=(b>=1) % entradas de b>=1 p= 1 1 0 0 1 0 En el ejemplo anterior, p(i)==1 si b(i)≥1 y cero en caso contrario. Ahora, podemos aislar los elementos mayores o iguales que 1 simplemente con 10 Ocupan un ´unico byte mientras que un n´umero real utiliza ocho bytes. 32
  • 39. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos >> b(p) 1 2 2 Desde este punto de vista es correcta y recomendable utilizar la instrucci´on >> b(b>=1) % elementos de b mayores o iguales que 1 1 2 2 que adem´as resulta muy natural (y f´acil de entender). Nota. El comando logical puede utilizarse para construir vectores y estructuras l´ogicas a partir de vectores de n´umeros enteros: >> b=[2 4 6 8 10]; p=[1 0 0 1 1]; >> b(p) % Dara error ??? Subscript indices must either be real positive integers or logicals. >> p=logical(p); >> b(p) ans = 2 8 10 La estructura de decisi´on, como en muchos otros lenguajes, es if. Su sintaxis es la siguiente: if simple: si la operaci´on l´ogica efectuada es verdadera, se ejecutan las l´ıneas de c´odigo comprendidas entre if y end if (x<-1 | x>1) disp(’valor absoluto de x mayor que 1’) end if compuesto: como el anterior, pero un nuevo conjunto de l´ıneas, comprendidas entre else y end son ejecutadas en caso de que la operaci´on l´ogica efectuada en el if sea falsa: if (x<0 & x>-10) f=x^2; % x entre -10 y 0 else f=sin(x^2); % x menor que -10 o mayor que 0 end 33
  • 40. Borrador 2.6 Bucles y estructuras de decisi´on LECCI´ON I if de decisi´on m´ultiple: if (x<0) f=x.^2; disp(’x menor que cero’) elseif (x<sqrt(pi)) f=sin(x^2); disp(’x en [0,sqrt(pi))’) elseif (x<2*sqrt(pi)) f=(x-sqrt(pi))^2; disp(’x en [sqrt(pi),2*sqrt(pi))’) else f=pi*cos(x^2); disp(’x en [2*pi,infinito)’) end Esta ´ultima instrucci´on es equivalente a anidar diferentes estructuras if, de la sigu- iente forma if (x<0) f=x.^2; disp(’x menor que cero’) else if (x<sqrt(pi)) f=sin(x^2); disp(’x en [0,sqrt(pi))’) else if (x<2*sqrt(pi)) f=(x-sqrt(pi))^2; disp(’x en [sqrt(pi),2*sqrt(pi))’) else f=pi*cos(x.^2); disp(’x en [2*pi,infinito)’) end end end Obviamente, la primera forma es m´as clara y concisa. Nota. Con la instrucci´on switch se puede implementar una estructura de decisi´on que es esencialmente equivalente a un if anidado. Est´a disponible tambi´en el bucle while que procede a ejecutar un bucle (que se cierra tambi´en con un end) mientras una condici´on sea verdadera. Por tanto, es algo m´as flexible que un for. En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. El uso de break y continue es exactamente el mismo. 34
  • 41. Borrador LECCI´ON I Cap´ıtulo 2. Matlab: Primeros pasos Por ´ultimo, y volviendo a end, este comando tiene una curiosa funcionalidad extra: sirve para referenciar el ´ultimo elemento de una fila o columna de una matriz. Por ejemplo b(4:end) selecciona todos los elementos de b desde la posici´on cuarta en adelante. Ejercicio 2.10 ¿Qu´e hace el siguiente fragmento de c´odigo? 01 r=[]; aux=0; 02 while aux<0.8 03 aux=rand(1); 04 r=[r aux]; 05 end 06 r(end)=[]; Ejercicio 2.11 Con la ayuda de Matlab, programa un par de ejemplos donde utilices switch y while. Ejercicio 2.12 (Un poco de todo) Implementa una funci´on de nombre findnonzeros que dado un vector de entrada devuelva el n´umero de elementos no nulos y un vector que contenga dichos elementos. Soluci´on. Una implementaci´on posible es la siguiente 01 % FINDNONZEROS 02 % 03 % [N,P]=FINDNONZEROS(X) devuelve 04 % 05 % N el numero de elementos no nulos en el vector X 06 % P un vector con los elementos no nulos de X 07 % 08 function [n,p]=findnonzeros(x) 09 10 p=[]; % p es vacio 11 for i=1:length(x) 12 if (x(i)~=0) % si x(i) no es cero 13 p=[p x(i)]; % apuntamos i al vector p 14 end 15 end 16 n=length(p); 17 return Observa como se recogen los resultados de la funci´on, n y p, >> a=[0.1 0. 0.3 0.1 0.6 0 0.1 0.2 0.4]; % vector!! >> [n,p]=findnonzeros(a) n = 7 35
  • 42. Borrador 2.6 Bucles y estructuras de decisi´on LECCI´ON I p = Columns 1 through 5 0.1000 0.3000 0.1000 0.6000 0.1000 Columns 6 through 7 0.2000 0.4000 Otra posible implementaci´on (mucho m´as elaborada y m´as propia de Matlab) es la sigu- iente 01 % FINDNONZEROS 02 % 03 % [N,P]=FINDNONZEROS(X) devuelve 04 % 05 % N el numero de elementos no nulos en el vector X 06 % P un vector con los elementos no nulos de X 07 % 08 function [n,p]=findnonzeros(x) 09 10 p=x(x~=0); 11 n=length(p); 12 return Haz un esfuerzo en entender bien los comandos anteriores. Tras la suficiente pr´actica, esta versi´on se ve m´as clara y natural que la anterior. Observa c´omo se toman los elementos no nulos del vector x (l´ınea 10). 36
  • 43. Borrador Cap´ıtulo 3 M´etodos directos para sistemas de ecuaciones lineales 3.1. M´etodo de Gauss El m´etodo de Gauss, tambi´en conocido como eliminaci´on gaussiana, es el algoritmo m´as sencillo para la resoluci´on de sistemas de ecuaciones lineales. Consta de dos partes bien diferenciadas: i) Transformaci´on del sistema lineal en otro equivalente, es decir, con la misma solu- ci´on, donde la matriz es triangular superior. ii) Resoluci´on del sistema triangular por sustituci´on regresiva. El paso i) se acomete v´ıa dos operaciones elementales: (a) Sumar a una ecuaci´on otra multiplicada por un n´umero. (b) Intercambiar dos ecuaciones. Si s´olo utilizamos la operaci´on (a) hablaremos del m´etodo de Gauss sin pivotaje, y con pivotaje parcial si tambi´en realizamos las operaciones (b)1 cuando la elecci´on de las filas que se conmutan sea una muy particular. Representando el sistema de ecuaciones en la forma matricial, todo lo anterior se reescribe en t´erminos de operaciones matriciales (sumar a una fila otra fila e intercambiar filas2 ). En lo que sigue expresaremos el sistema en la forma Ax = b, A ∈ Rn×n , x, b ∈ Rn , donde A es la matriz de coeficientes, b el t´ermino independiente y x el vector de soluciones. Los elementos de A se denotar´an por aij, y con bi los de b. 1 Existe una tercera operaci´on (c), que consiste simplemente en multiplicar filas por constantes no nulas. Esta operaci´on recibe el nombre de reescalado (de filas) y en problemas pr´acticos se suele utilizar con el fin de mejorar la estabilidad del sistema frente a errores de redondeo. 2 Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las inc´ognitas). En este caso se habla de pivotaje total. 37
  • 44. Borrador 3.1 M´etodo de Gauss LECCI´ON I 3.1.1. M´etodo de Gauss sin pivotaje El pseudoc´odigo se expone a continuaci´on M´etodo de Gauss 01 for i = 1 : n − 1 02 for k = i + 1 : n 03 ki = aki/aii 04 for j = i + 1 : n 05 akj = akj − kiaij 06 end 07 bk = bk − kibi 08 end 09 end 10 11 xn = bn/ann 12 for i = n − 1 : −1 : 1 13 xi = bi − n j=i+1 aijxj /aii 15 end Las l´ıneas 01--09 se corresponden con la reducci´on a la forma triangular de la matriz y las l´ıneas 11--15 con la resoluci´on del sistema triangular resultante. El elemento aii se denomina pivote y debe ser distinto de cero para que el algoritmo funcione, dado que en caso contrario la operaci´on en 03 est´a mal definida. El algoritmo efect´ua O(n3 /3) productos3 y otras tantas sumas para la reducci´on a la forma triangular y O(n2 /2) sumas y productos para la resoluci´on del sistema triangular. Por tanto el costo se concentra en la primera fase del algoritmo y duplicar la dimensi´on del sistema exige multiplicar por ocho el tiempo de c´alculo (y por cuatro el costo en memoria). Ejercicio 3.1 Implementa una funci´on cuyas entradas sean la matriz de coeficientes y el t´ermino independiente y devuelva la soluci´on del sistema por el m´etodo de Gauss. Soluci´on. El siguiente programa es una soluci´on del ejercicio 01 % GAUSS 02 % 03 % 04 % X=GAUSS(A,B) Solucion del sistema Ax=b con el metodo 05 % de Gauss sin pivotaje 3 es decir, el n´umero de multiplicaciones es n3 /3 + αn2 + βn + γ, donde α, β y γ son constantes adecuadas. Con n creciente, el primer t´ermino es el dominante. 38
  • 45. Borrador LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales 06 07 function x = gauss(a,b) 08 n=length(a); 09 10 % transformacion del sistema en uno triangular 11 for i=1:n-1 12 for k=i+1:n 13 l=a(k,i)/a(i,i); 14 for j=i+1:n 15 a(k,j)=a(k,j)-l*a(i,j); 16 end 17 b(k)=b(k)-l*b(i); 18 end 19 end 20 21 % resolucion del sistema triangular 22 x=zeros(n,1); % tambien vale x=b*0; 23 x(n)=b(n)/a(n,n); 24 for i=n-1:-1:1 25 s=0; 26 for j=i+1:n 27 s=s+a(i,j)*x(j); % sumatorio 28 end 29 x(i)=(b(i)-s)/a(i,i); 30 end 31 return El c´odigo anterior es correcto y ciertamente recuerda a la sintaxis que usar´ıamos en una programaci´on en un lenguaje tradicional como C o Pascal. Sin embargo desde el punto de vista de Matlab es claramente redundante y muy mejorable. Los siguientes ejercicios ahondan en estos aspectos por lo que resolverlos es muy recomendable. Ejercicio 3.2 Reescribe el programa utilizando instrucciones y sintaxis propia de Matlab. Soluci´on. Las filas 14-16 del programa (04--06 del algoritmo) se pueden implementar como una diferencia de dos vectores, a(k,i+1:n) y a(i,i+1:n), con cualquiera de estas dos instrucciones a(k,i+1:n) =a(k,i+1:n) - l*a(i,i+1:n) a(k,:) =a(k,:) - m*a(i,:) La segunda es m´as c´omoda de utilizar pero multiplica por dos el n´umero de operaciones en la ejecuci´on del m´etodo4 . 4 ¿Por qu´e?. 39
  • 46. Borrador 3.1 M´etodo de Gauss LECCI´ON I De forma an´aloga, el sumatorio de las l´ıneas 25-29 del c´odigo (13 del algoritmo del m´etodo de Gauss) es simplemente el producto escalar, y de hecho tambi´en matricial, de dos vectores, el vector fila a(i,i+1:n) y el vector columna x(i+1:n). Esto es el c´odigo de las l´ıneas 25--29 se puede sustituir por x(i)=(b(i)- a(i,i+1:n)*x(i+1:n))/a(i,i); Ejercicio 3.3 (Avanzado) Podemos avanzar a´un m´as hacia la consecuci´on de algoritmos matriciales. Consideremos la partici´on de A A = a11 c1 d1 A11 , b = b1 b1 donde c1, d1 son vectores (n − 1)×1 y A11 una matriz (n − 1)×(n − 1). Entonces, el primer paso del m´etodo de Gauss se puede escribir a11 c1 0 A11 − (a11)−1 c1 d1 , b = b1 b1 − a−1 11 b1d1. A(1) b(1) El segundo paso del m´etodo de Gauss se aplica ahora sobre la matriz A(1) (de tama˜no (n−1)× (n − 1)) y el vector b(1) (de tama˜no (n − 1) × 1) y as´ı se procede sucesivamente. Implementa esta resoluci´on alternativa del m´etodo de Gauss. (Ayuda. Observa estas tres instrucciones l=a(i+1:n,i)/a(i,i) a(i+1:n,i+1:n)-l*a(i,i+1:n) b(i+1:n)-l*b(i) ¿Qu´e hacen?) Nota sobre la vectorizaci´on La noci´on de vectorizaci´on, trabajar con vectores y matrices en lugar de elemento a ele- mento, no es nueva ni en el An´alisis Num´erico ni en la computaci´on a alto nivel. El objetivo que se persigue es que las todas las operaciones se reduzcan a operaciones matem´aticas sencillas, como productos escalares, productos matriciales, b´usqueda de m´aximos y m´ıni- mos en un vector/matriz, suma de vectores y matrices... cuya implementaci´on se opti- miza tomando en consideraci´on el entorno en el que se trabaja, tanto en software como en hardware. Este conjunto de instrucciones se conocen como BLAS (basic linear algebra subprograms). Se distinguen tres niveles. El nivel uno est´a formada por operaciones entre vectores, tales como la suma o el producto escalar de dos vectores, de O(n) operaciones, el nivel dos se ocupa de operaciones matriz-vector con O(n2 ) operaciones y el nivel tres son operaciones entre matrices, O(n3 ) operaciones. En m´aquinas con m´ultiples procesadores estos subprogramas deben adaptarse a dividir la tarea entre los procesadores disponibles de forma ´optima y a buscar algoritmos que soporten este tipo de trabajo5 . 5 Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareas equiparables, y de forma que finalicen en tiempos similares puesto que basta con que una de las subtareas se retrase respecto a las dem´as para que el conjunto de procesadores deba parar a esperar al rezagado con la consiguiente p´erdida de tiempo (y dinero). 40
  • 47. Borrador LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales Uno de los detalles m´as sencillos que hay que plantear es la estrategia de almace- namiento de las matrices en memoria. Se puede optar por un almacenamiento por filas, como hace C, A = a11 a12 a13 a21 a22 a23 ⇒ a11 → a12 → a13 → a21 → a22 → a23 donde con la notaci´on anterior queremos decir que aij y aij+1 ocupan posiciones consec- utivas en memoria. Sin embargo Fortran o Matlab proceden por columnas A = a11 a12 a13 a21 a22 a23 ⇒ a11 → a21 → a12 → a22 → a13 → a23. Seg´un sea el caso se trata de primar algoritmos que accedan a la matriz por filas o por columnas para que el procesador trabaje con posiciones consecutivas de memoria6 . En esta din´amica, la resoluci´on del sistema triangular seg´un el algoritmo expuesto en el Ejercicio 3.3 est´a mejor adaptado a la arquitectura de Matlab puesto que todas las operaciones se hacen sobre columnas de la matriz a. 3.1.2. M´etodo de Gauss con pivotaje parcial Para evitar que el m´etodo de Gauss se colapse, es decir, que encuentre en un paso i que el elemento aii es nulo (l´ınea 03 del algoritmo), se introduce la noci´on de pivotaje. La idea es muy sencilla: en el caso de que en el i–´esimo paso el pivote sea nulo, se procede a intercambiar la fila i por una fila k tal que aki = 0 para cierto k > i. Si esto no es posible, el sistema no es compatible determinado, es decir, o no tiene soluci´on o tiene infinitas soluciones. Desde un punto de vista pr´actico, el m´etodo de Gauss con pivotaje procede a inter- cambiar siempre filas de forma que en cada paso |aki| = m´ax =i,...,n |a i|, esto es, el pivote es el mayor posible. Ello dota al sistema de una mayor estabilidad frente a los errores de redondeo. El algoritmo resultante es el siguiente (denotamos por a ↔ b el intercambio de valores de a y b). 6 Cuando un procesador moderno lee algo en memoria, suele cargar a su memoria internar, la memoria cach´e, posiciones adicionales y consecutivas de memoria bajo la convicci´on de que es probable que las requiera en el siguiente paso. 41
  • 48. Borrador 3.1 M´etodo de Gauss LECCI´ON I M´etodo de Gauss con pivotaje parcial 01 for i = 1 : n − 1 02 03 Encontrar k ∈ {i, . . . , n} tal que |aki| = m´ax j= ,...,n |a i| 04 for j = i : n 05 aij ↔ akj %intercambio filas y termino independiente 08 end 07 bi ↔ bk 08 09 for k = i + 1 : n 10 ki = aki/aii 11 for j = i + 1 : n 12 akj = akj − kiaij 13 end 14 bk = bk − kibi 15 end 16 end Ejercicio 3.4 Implementa una funci´on con el m´etodo de Gauss con pivotaje a partir de la funci´on definida en el Ejercicio 3.2. Para este fin la instrucci´on max te puede resultar ´util. Espec´ıficamente, >> [m,i]=max(v) devuelve en m el mayor valor del vector v y en i su posici´on, esto es, m = v(i). A˜nade tambi´en un control sobre el tama˜no de a(i, i) de forma que si ´este es pr´oximo a cero7 se termine la ejecuci´on y se devuelva un mensaje de error. (Ayuda. La instrucci´on [m,r]=max(abs(a(i:n,i))) te devolver´a en r la posici´on del m´aximo en el vector columna abs(a(i:n,i)). Por tanto, la fila en la matriz a con el mayor valor en la columna i es i+r-1.) El intercambio de filas de las l´ıneas 04--08 se puede implementar de varias formas. La primera es simplemente con un bucle que recorra las filas y proceda a intercambiar los valores elemento a elemento. En la segunda forma se hace de forma global mediante aux=a(i,i:n); a(i,i:n)=a(k,i:n); a(k,i:n)=aux; La tercera forma probablemente ser´a la que resulte m´as extra˜na pero vuelve a ser natural en Matlab. Basta hacer a([i,k],i:n)=a([k,i],i:n) F´ıjate que tiene perfecto sentido sint´actico de acuerdo a las reglas de manipulaci´on de vectores y matrices expuestas en la primera parte de esta lecci´on. 7 ¿Cu´ando se decide que un n´umero es cero? En la pr´actica depende de los tama˜nos del resto de elementos de la matriz. 42
  • 49. Borrador LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales 3.1.3. M´etodo de Gauss con pivotaje parcial ficticio Desde un punto de vista pr´actico no hace falta intercambiar f´ısicamente las filas de la matriz. En lugar de ello se puede utilizar un vector de ´ındices p de forma que p(i) sea la posici´on f´ısica en memoria de la fila i. Inicialmente, las filas est´an sin reordenar, es decir, se empieza declarando p=1:n; Intercambiar las filas i y k es equivalente a intercambiar los valores de p en las posiciones i y k p([i k])=p([k i]) y se procede a hacer ceros en las filas p(i+1),. . . , p(n). El acceso la fila i se consigue con a(p(i),:) y la b´usqueda del m´aximo valor para el intercambio de filas con [m,r]=max(abs(a(p(i:n),i)));r=r+i-1; La fila con el m´aximo elemento en valor absoluto es la p(r). Para la resoluci´on del sistema triangular despejamos igual que en el m´etodo de Gauss, desde la n-´esima inc´ognita a la primera, con 22 x(p(n))=b(p(n))/a(p(n),n); 23 for i=n-1:-1:1 24 x(p(i))=(b(p(i))-a(p(i),i+1:n)*x(i+1:n))/a(p(i),i); 25 end Desde un punto de vista estrictamente matem´atico se trata de llevar la matriz a una forma que, si bien no es triangular, una reordenaci´on adecuada de las filas la transforma en triangular. El vector p recoge en qu´e orden se deben despejar las inc´ognitas a la hora de resolver el sistema reducido. En concreto el orden viene dado por p(n), p(n-1),. . . , p(1). En cualquier caso, a(p,:) es una matriz triangular8 . Ejercicio 3.5 Implementa el m´etodo de Gauss con pivotaje parcial ficticio. Ejercicio 3.6 Las l´ıneas 22–25 proceden a resolver el sistema triangular accediendo a los elementos por filas. Adapta el algoritmo para la resoluci´on de este sistema por columnas, tal como se hizo en el Ejercicio 3.3. Ejercicio 3.7 Sea A una matriz inversible de tama˜no n × n y A−1 su inversa. Si ai es la columna i−´esima de A−1 , esto es, A−1 = [a1|a2| · · · |an], 8 La importancia de estas t´ecnicas ha decrecido con las ´ultimas generaciones de ordenadores, donde la manipulaci´on de enormes cantidades de memoria est´a muy optimizada. 43
  • 50. Borrador 3.2 Descomposiciones matriciales LECCI´ON I entonces Aai = ei =        0 ... 1 ... 0        → i. Utilizando alguna de las diferentes versiones del m´etodo de Gauss, implementa el c´alculo de la inversa mediante la resoluci´on de los n sistemas de ecuaciones. Observa que los n comparten la misma matriz de coeficientes. 3.2. Descomposiciones matriciales Uno de los aspectos que mejores resultados dio a lo largo del siglo XX, en los albores del An´alisis Num´erica, fue la constataci´on de que numerosos algoritmos del ´Algebra Lineal, pod´ıan reescribirse como factorizaciones de matrices en producto de otras matrices con caracter´ısticas muy particulares. ´Este es el caso del algoritmo de Gram-Schmidt, la matriz original escrita como el producto de una ortogonal por una triangular, o el caso que nos ocupa, el m´etodo de Gauss, visto como la b´usqueda de la factorizaci´on de A como el producto de una matriz triangular inferior por una superior. La utilidad que se concedi´o a este tipo de factorizaciones fue en un primer momen- to m´as bien te´orica pero r´apidamente se encontr´o aplicaciones pr´acticas y su uso en la actualidad es profuso. Estudiaremos en lo que sigue la factorizaci´on LU y variantes y dejaremos para m´as adelante (Lecci´on IV) otro tipo de factorizaciones. 3.2.1. Descomposici´on LU Supongamos que se dispone de una descomposici´on A = LU donde L y U son matrices triangulares inferior y superior respectivamente. En este caso, la resoluci´on del sistema lineal Ax = b es equivalente a resolver dos sistemas de ecuaciones triangulares Ly = b, Ux = y. el primero triangular superior y el segundo triangular inferior. Puesto que el costo de resoluci´on de cada sistema es O(n2 ) operaciones (total de sumas y productos) obtenemos una ventaja decisiva en la resoluci´on del sistema. Ejercicio 3.8 Implementa la resoluci´on de un sistema de ecuaciones Lx = b donde L es triangular inferior con 1s en la diagonal. Si abordamos directamente la resoluci´on de la ecuaci´on A = LU, nos encontramos con un sistema no lineal con n2 + n inc´ognitas (las entradas de L y U) y n2 ecuaciones (una por cada elemento de a). Por tanto, el sistema resultante no deber´ıa admitir soluci´on 44
  • 51. Borrador LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales ´unica. Si exigimos que L tenga 1s sobre la diagonal, el n´umero de inc´ognitas pasa a ser de n2 y por tanto tenemos ya un sistema cuadrado (aunque no lineal). Se trata entonces de estudiar el siguiente problema: dada una matriz A de tama˜no n × n, encontrar L y U de la forma L =      1 21 1 ... ... ... n1 n2 · · · 1      , U =      u11 u12 · · · u1n u22 · · · u2n ... ... unn      , y tales que A = LU. El c´alculo de esta descomposici´on se puede llevar a cabo sin m´as que exigir que el producto LU sea igual al de A. As´ı empezamos despejando la primera fila de U (que es igual que la de A por ser 11 = 1). Una vez conocida esa fila, se puede despejar la primera columna de L, utilizando que el producto de L por la primera columna de U (que consta de un ´unico elemento no nulo y ya es conocido del paso anterior) da la primera columna de A. Procedemos sucesivamente de esta forma, construyendo U por filas y L por columnas. Descomposici´on LU (M´etodo de Doolittle) 01 for k = 1 : n 02 for j = k : n 03 ukj = akj − k−1 p=1 kpupj 04 end 05 kk = 1 06 for i = k + 1:n 07 ik = aik − k−1 p=1 ipupk /ukk 08 end 09 end El n´umero de operaciones del algoritmo resulta ser igual al del m´etodo de Gauss, con lo cual no hemos conseguido una ventaja significativa. Sin embargo, disponer de esta descomposici´on es especialmente ´util si se requiere resolver varios sistemas de ecuaciones lineales con la misma matriz pero con t´erminos independientes diferentes. Las operaciones que conllevan un mayor coste son las correspondientes al c´alculo de las matrices L y U, pero ´unicamente hay que realizar esta descomposici´on una vez para posteriormente resolver en cada caso dos sistemas triangulares. Ejercicio 3.9 Implementar la descomposici´on LU en Matlab mediante una funci´on cuya entrada sea una matriz cuadrada y su salida sean las matrices L y U correspondientes. (Ayuda: la funci´on por tanto devuelve dos valores.) 45
  • 52. Borrador 3.2 Descomposiciones matriciales LECCI´ON I Al observar el algoritmo del m´etodo, las operaciones recuerdan a las efectuadas por el m´etodo de Gauss. Esto no es tan sorprendente cuando se analizan con detenimiento los calculados realizados. Se puede ver entonces que en el c´alculo de la descomposici´on LU se est´an haciendo exactamente las mismas operaciones que al aplicar el m´etodo de Gauss. En efecto, definamos a (1) ij = aij i, j = 1, . . . , n a (k+1) ij = a (k) ij − ika (k) kj , k ≥ 1, 1 ≤ i, j ≤ n − k donde ki viene dada por el algoritmo de Doolitle (l´ınea 07). Entonces, de acuerdo con el algoritmo de la factorizaci´on LU, los elementos de la primera fila de U y de la primera columna de L vienen dados por u1j = a (1) 1j , i1 = a (1) i1 a (1) 11 . En el siguiente paso, se observa que u2j = a2j − 21u1j = a (1) 2j − 21a (1) 1j = a (2) 2j i2 = ai2 − i1u12 u22 = a (1) i2 − i1a (1) 12 a (2) 22 = a (2) i2 a (2) 22 . Reiterando el mismo razonamiento concluimos que uij = a (i) ij , i ≤ j, ij = a (j) ij a (j) jj , i > j. Por tanto U es de hecho la matriz triangular que queda al aplicar el m´etodo de Gauss mientras que L est´a formada por los elementos que se han utilizado para hacer ceros en el proceso. Esto es, el elemento i, j de L, denotado por ij, coincide con la constante ij calculado en la l´ınea 03 del m´etodo de Gauss y por tanto no hay una contradicci´on de notaciones. En particular, la propiedad anterior propone una forma alternativa de calcular la de- scomposici´on LU de una matriz es la siguiente modificaci´on del programa del Ejercicio 3.1: 11 for i=1:n-1} 12 a(i,i+1:n)=0; %hacemos cero la columna i 13 for k=i+1:n} 14 l(k,i)=a(k,i)/a(i,i); 15 a(k,i+1:n)=a(k,i+1:n)-l(k,i)*a(i,i+1:n); 16 end 17 end La matriz U estar´ıa entonces almacenada en a. Ejercicio 3.10 Una forma compacta de devolver la descomposici´on LU es insertar L en la parte triangular inferior de a. De esta forma, tras aplicar el m´etodo, a tiene en la parte superior la matriz U, mientras que por debajo de la diagonal encontramos L (exceptuando su diagonal de 1s). Implementa esta modificaci´on. 46
  • 53. Borrador LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales 3.2.2. Casos particulares M´etodo de Cholesky En una gran variedad de problemas pr´acticos aparecen matrices sim´etricas definidas positivas. Este tipo de matrices puede descomponerse en la forma A = LL donde L =      11 21 22 ... ... ... n1 n2 · · · nn      . Gracias a la simetr´ıa de la matriz, tanto el n´umero de operaciones como de posiciones de memoria requeridos pueden reducirse a la mitad. El algoritmo resultante es conocido como el m´etodo de Cholesky. M´etodo de Cholesky 01 for k = 1:n 02 kk = akk − k−1 r=1 2 kr 03 for j = k + 1:n 04 jk = ajk − k−1 r=1 jr kr / kk 05 end 06 end Ejercicio 3.11 Implementa una funci´on que tenga como entrada una matriz A y devuelva la matriz L correspondiente. Debe avisar si la descomposici´on no ha podido llevarse a cabo. Implementa tambi´en una segunda funci´on que tenga como entradas la matriz L triangular y un t´ermino independiente b y que devuelva la soluci´on del sistema (LL )x = b. Para ello se requiere la resoluci´on de los sistemas triangulares Ly = b, L x = y. LU con permutaci´on El m´etodo de Gauss con pivotaje parcial es equivalente a la decomposici´on PA = LU 47
  • 54. Borrador 3.2 Descomposiciones matriciales LECCI´ON I donde P es el resultado de permutar las filas (o columnas) de la identidad. Alternativa- mente, equivale a una descomposici´on de la forma A = LU donde L = P−1 L, de forma que L es una permutaci´on de la matriz triangular inferior9 . La siguiente subrutina devuelve esa descomposici´on. 01 % LUPERMUTACION 02 % 03 % [L,U]=LUPERMUTACION(A) 04 % 05 % devuelve U triangular superior, L permutacion 06 % por filas de una matriz triangular inferior con 07 % 1s en la diagonal de forma que A=L*U 08 09 function [l,u]= LUPermutacion(a) 10 n=length(a); 11 p=1:n; 12 13 for i=1:n-1 14 [maximo,r]=max(abs(a(p(i:n),i)));r=r+i-1; 15 p([i r])=p([r i]); 16 for k=i+1:n 17 l(p(k),i)=a(p(k),i)/a(p(i),i); 18 a(p(k),i:n)=a(p(k),i:n)-l(p(k),i)*a(p(i),i:n); 19 end 20 end 21 for i=1:n 22 l(p(i),i)=1; 23 end 24 u=a(p,:); 25 return 3.2.3. Comandos correspondientes en Matlab Todas las factorizaciones vistas con anterioridad est´an, por supuesto, implementadas en Matlab. Algunos de los comandos relacionados son 9 Esto es, es el resultado de reordenar las filas de L. 48
  • 55. Borrador LECCI´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales [l,u]=lu(a) devuelve u triangular superior, l permutaci´on de una triangular inferior con 1s en la diagonal de forma que a=l*u. [l,u,p]=lu(a) devuelve u triangular superior, l triangular inferior con 1s en la diagonal y p matriz de permutaci´on de forma que p*a=l*u. r=chol(a) devuelve r triangular superior de forma que a=r’*r. Observa que con las notaciones introducidas r es precisamente la traspuesta de la matriz L, expuesta en nuestro algoritmo. El comando asume que la matriz es sim´etrica por lo que s´olo trabaja con la parte superior de la matriz. Otra descomposici´on habitual10 es la denominada QR que devuelve Q ortogonal (es decir, Q Q = In) y R triangular superior de forma que A = QR. El comando encargado de esta tarea es qr. Con estas instrucciones la soluci´on de un sistema utilizando la descomposici´on LU se ejecuta con las siguientes l´ıneas [l,u]=lu(a); x=u(lb); La colocaci´on de los par´entesis es esencial. Con ulb se calcula (u−1 l)−1 b que obvia- mente no tiene nada que ver con la soluci´on del sistema. No hay que preocuparse por el hecho de que las matrices sean triangulares (o permutaci´on de una triangular). Matlab, y en concreto la instrucci´on detecta esto y resolver´a el sistema por sustituci´on progresiva (o regresiva), sin intentar realizar la eliminaci´on gaussiana. Nota hist´orica11 Ideas similares a la eliminaci´on gaussiana pueden encontrarse muchos siglos atr´as, con referencias que se remontan a las matem´aticas babil´onicas y chinas. Carl Friedreich Gauss introdujo el m´etodo que lleva su nombre entorno a 1800 cuando trataba de resolver un problema de ajuste por m´ınimos cuadrados relacionado con el c´alculo de la ´orbita del asteroide Palas. Parece ser que Joseph Louis Lagrange hab´ıa utilizado ideas similares 50 a˜nos antes para dilucidar si una forma cuadr´atica (hoy dir´ıamos matriz) era definida pos- itiva. El matem´atico alem´an Carl Gustav Jacob Jacobi extendi´o la idea de la eliminaci´on gaussiana a matrices arbitrarias. Es rese˜nable que la noci´on de matriz tal como la conocemos ahora era desconocida para Gauss y Lagrange. El concepto de matriz, y el ´algebra asociada (esto es, las opera- ciones) habr´ıan de esperar a los trabajos de James J. Sylvester (que en 1848 introdujo el t´ermino matriz) y de Arthur Cayley (que siete a˜nos despu´es defini´o el producto matricial identific´andolo con el c´alculo de la composici´on de aplicaciones lineales y defini´o la in- versa de una matriz). Importantes fueron tambi´en las contribuciones del f´ısico Hermann 10 Veremos dos algoritmos para obtener esta descomposici´on en la Lecci´on IV. Aunque para la resoluci´on de sistemas de ecuaciones lineales la descomposici´on QR es m´as estable num´ericamente que la LU, se suele optar por esta ´ultima por tener un menor coste computacional (aproximadamente la mitad). 11 Las principales referencias utilizadas para esta nota han sido “Very Early Days of Matrix Compu- tations”, Beresford Parlett en SIAM News, 3, no 9; “Matrix Algorithms”, G.W. Stewart; “Computer solutions of large system of equations”, G. Merant y “An introduction to Numerical Analysis”, E. S¨uli y D. Mayers. Estas referencias est´an completamente detalladas en la bibliograf´ıa. 49
  • 56. Borrador 3.2 Descomposiciones matriciales LECCI´ON I Grassmann (introdujo la primera ´algebra vectorial no conmutativa, basada en el producto vectorial de dos vectores; consider´o tambi´en el producto de un vector fila por un vector columna que daba lugar a una matriz de rango uno), Willard Gibbs y Paul A. Dirac. La equivalencia entre la descomposici´on LU y la eliminaci´on gaussiana parece que fue probada por primera vez por Paul S. Dwyer en 1944. Curiosamente, la descomposici´on de Cholesky es anterior. Publicado p´ostumamente en 1924 en una revista de Geodesia (Andr´e-Louis Cholesky muri´o en 1918). El trabajo original trataba sobre la resoluci´on de un problema de ajuste por m´ınimos cuadrados y pas´o desapercibido hasta que fue rescatado por John Todd a finales de los a˜nos 1940. Los primeros an´alisis sobre la estabilidad num´erica de la eliminaci´on gaussiana, es decir la viabilidad de su programaci´on, se remontan a los trabajos de Harold Hotelling, Alan Turing12 , John von Neumann y Herman Heine Goldstine. Los resultados iniciales eran descorazonadores. Harold Hotelling prob´o en torno a 1940 que el error de redondeo podr´ıa crecer como 4n donde n era el orden de la matriz. Este resultado colocaba al m´etodo de Gauss como un m´etodo inviable para la resoluci´on de grandes sistemas lineales. Turing lleg´o a resultados similares de manera informal. El an´alisis de Neumann y Goldstine ya probaba que el m´etodo era estable para matrices definidas positivas13 . James H. Wilkinson, reconocido universalmente como el padre del an´alisis moderno de estabilidad (frente a los errores de redondeo), extendi´o el an´alisis a matrices generales y mostr´o que el pivotaje mejoraba enormemente la estabilidad del m´etodo. Lo m´as curioso es que el an´alisis inicial estaba enfocado m´as hacia el c´alculo de la inversa de la matriz que al m´etodo de Gauss. Como curiosidad final, Cleve Moler, programador original de Matlab, cita14 a Wilkinson y Todd entre las personas que tuvieron una gran influencia en su formaci´on y por ende en los or´ıgenes de Matlab. 12 La vida de Alan Turing es una de las m´as tr´agicas en historia de las matem´aticas. Dotado de una in- teligencia precoz, realiz´o contribuciones importantes en l´ogica y computaci´on. Trabaj´o durante la segunda guerra mundial en Bletchley Park en el descifrado de los c´odigos alemanes encriptados con la m´aquina Enigma mediante la utilizaci´on del primer ordenador electr´onico en el mundo (Colossus). El papel que este trabajo an´onimo tuvo en la victoria aliada, los alemanes siempre estuvieron seguros de que su c´odigo era indescifrable, s´olo ha empezado a reconocerse en fechas recientes. La presi´on y aislamiento a la que Turing fue sometido por su homosexualidad, llegando incluso a ser detenido por ello, le llev´o al suicidio en 1954 despu´es de haberse sometido a un tratamiento con bromuro para curarle de su enfermedad. 13 En los primeros a˜nos se sugiri´o incluso resoluci´on de un sistema Ax = b mediante las ecuaciones normales A Ax = A b (A A es sim´etrica y definida positiva). 14 http://www.mathworks.com/company/newsletters/news notes/clevescorner/dec04.html 50
  • 57. Borrador Lecci´on II Programaci´on avanzada en Matlab. M´etodos iterativos para sistemas de ecuaciones lineales 51
  • 59. Borrador Introducci´on Homer: Marge? Since I’m not talking to Lisa, would you please ask her to pass me the syrup? Marge: Dear, please pass your father the syrup, Lisa. Lisa: Bart, tell Dad I will only pass the syrup if it won’t be used on any meat product. Bart: You dunkin’ your sausages in that syrup homeboy? Homer: Marge, tell Bart I just want to drink a nice glass of syrup like I do every morning. Marge: Tell him yourself, you’re ignoring Lisa, not Bart. Homer: Bart, thank your mother for pointing that out. Marge: Homer, you’re not not-talking to me and secondly I heard what you said. Homer: Lisa, tell your mother to get off my case. Bart: Uhhh, dad, Lisa’s the one you’re not talking to. Homer: Bart, go to your room. The Simpsons, Episodio 5, temporada 5, Lisa the Vegetarian En el primer apartado entraremos en aspectos m´as avanzados en el tratamiento de vectores y matrices en Matlab, haciendo hincapi´e especial en la manipulaci´on de matrices sparse. Veremos tambi´en c´omo se pueden implementar funciones donde el n´umero de argumentos de entrada y salida son variables. En la parte matem´atica, tocaremos la teor´ıa b´asica de m´etodos iterativos para sistemas de ecuaciones lineales. Empezaremos con los m´etodos cl´asicos: Jacobi, Gauss–Seidel y relajaci´on de Young, para pasar luego a m´etodos m´as modernos y elaborados: el m´etodo del Gradiente y especialmente, el m´etodo del Gradiente Conjugado. En esta lecci´on nos permitiremos hacer algo de Matem´aticas. Animamos a que el lector no se asuste por ello y a que trate de entender los enunciados y las demostraciones que se ofrecen. Para ello se asumen unos conocimientos m´ınimos en ´Algebra Lineal. 53
  • 61. Borrador Cap´ıtulo 4 Matlab: programaci´on avanzada 4.1. Retorno a las matrices A estas alturas el lector ya deber´ıa estar convencido sobre las capacidades de Matlab en lo que se refiere al manejo de enormes cantidades de memoria. En esta secci´on expon- dremos algunos comandos adicionales y entraremos con cierto detalle en la manipulaci´on de matrices sparse1 . 4.1.1. Acceso a partes estructuradas de una matriz En ocasiones es importante tomar partes precisas de una matriz que no son necesaria- mente partes de filas, columnas o simplemente submatrices (estas acciones ya se trataron en la primera lecci´on). Para este fin nos pueden servir las siguientes instrucciones diag triu tril La primera toma la diagonal de una matriz mientras que la segunda y tercera toman la parte triangular superior (upper) e inferior (lower) respectivamente. Adem´as estos co- mandos son algo m´as flexibles de lo que pueda parecer a simple vista como veremos a continuaci´on. Empecemos introduciendo una matriz >> a=[11 12 13; 21 22 23; 31 32 33]; El resultado de los siguientes comandos es, a la luz de lo anterior, esperable >> diag(a) ans = 11 22 33 1 Aceptaremos este anglicismo en lo que sigue. En ocasiones este vocablo se traduce por matrices huecas o matrices dispersas. 55
  • 62. Borrador 4.1 Retorno a las matrices LECCI´ON II >> triu(a) ans = 11 12 13 0 22 23 0 0 33 >> tril(a) ans = 11 0 0 21 22 0 31 32 33 El usuario puede especificar qu´e diagonal se escoge, o a partir de qu´e diagonal se toma la matriz triangular. La diagonal principal es la cero y las subdiagonales inferiores (respec- tivamente superiores) est´an numeradas consecutivamente con n´umeros enteros negativos (respectivamente positivos). El siguiente ejemplo ilustra estas caracter´ısticas. >> diag(a,-1) ans = 21 32 >> tril(a,-1) ans = 0 0 0 21 0 0 31 32 0 >> triu(a,0) ans = 11 12 13 0 22 23 0 0 33 Ejercicio 4.1 Programa una funci´on que dada una matriz a devuelva un vector d con los elementos de la diagonal, una matriz triangular superior u con todos los elementos de a situados 56
  • 63. Borrador LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada encima de la diagonal superior y l una matriz triangular inferior con todas las entradas de debajo de la diagonal principal. Ejercicio 4.2 ¿Qu´e sucede si aplicamos los comandos anteriores a matrices rectangulares?. Con diag podemos tambi´en construir a partir de un vector una matriz diagonal >> diag([1 2]) % es lo mismo que diag([1 2],0) ans = 1 0 0 2 >> diag([1 2],1) ans = 0 1 0 0 0 2 0 0 0 Ejercicio 4.3 ¿C´omo utilizar´ıas el comando diag para generar una matriz con la diagonal de una dada?. Nota. El comando blkdiag permite construir matrices diagonales por bloques: >> blkdiag(1,[1 2; 3 4], 5) ans= 1 0 0 0 0 1 2 0 0 3 4 0 0 0 0 5 Trasposici´on de matrices Dada una matriz A, la matriz traspuesta A es la matriz resultante de intercambiar las filas con las columnas de A. Esto es, las filas de A pasan a ser las columnas de A . Esta operaci´on se denota en Matlab con “ ’ ” : >> a=[1 2 3; 0 2 4]; >> a’ ans = 57
  • 64. Borrador 4.1 Retorno a las matrices LECCI´ON II 1 0 2 2 3 4 Obviamente, tambi´en se aplica sobre vectores: >> b=[1;2;3]; % vector COLUMNA con tres elementos >> b’ % vemos ahora un vector FILA ans = 1 2 3 De nuevo nos encontramos con esta propiedad sobre la que ya hemos incidido: Matlab distingue entre vectores filas y columnas, y esta diferencia se hace especialmente palpable (y en ocasiones molesta) a la hora de realizar operaciones como productos matriz-vector. Nota. En Matlab existe tambi´en el operador “.’”. Sobre matrices reales funciona exac- tamente igual que el comando anterior, pero no as´ı sobre n´umeros complejos. Adem´as de trasponer, “’”, conjuga todas las entradas. Es decir, cambia el signo a la parte imaginaria de cada elemento. Matem´aticamente hablando, ´este es el operador de trasposici´on o con- jugaci´on, denotado habitualmente en matem´aticas con “A∗ ”. Por contra, “.’” se limita a intercambiar filas por columnas en la matriz: >> clear i % i es ahora la unidad imaginaria >> a=[i 1-2i; 1 0.3+4i]; >> a.’ ans = 0 + 1.0000i 1.0000 1.0000 - 2.0000i 0.3000 + 4.0000i >> a’ ans = 0 - 1.0000i 1.0000 1.0000 + 2.0000i 0.3000 - 4.0000i Dada una matriz a, si ejecutamos a(:), obtenemos el vector columna que se con- struye concatenando las columnas de a. T´ecnicamente hablando, nos est´a mostrando la matriz tal como se guarda en memoria. Por ejemplo, 58
  • 65. Borrador LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada >> a=[1 2 3; 0 2 4]; >> a(:) ans = 1 0 2 2 3 4 >> a=a’; %trasponemos a >> a(:) ans = 1 2 3 0 2 4 Esto puede utilizarse para hacer un par de trucos: En ocasiones la entrada de una funci´on es un vector, sin importar si ´este es fila o columna. La instrucci´on >> b=b(:); har´a de b un vector columna, sea cual sea su formato inicial. Si lo que se desea es un vector fila, basta con trasponer >> b=b(:)’; % b=b(:).’ mejor por si b es complejo Se puede utilizar para introducir las entradas de una matriz por columnas. A modo de ejemplo, >> a=zeros(4,3); >> a(:)=[1 2 3 4 5 6 7 8 9 10 11 12] a = 59
  • 66. Borrador 4.1 Retorno a las matrices LECCI´ON II 1 5 9 2 6 10 3 7 11 4 8 12 >> a2=zeros(2,6); >> a2(:)=a(:) a2= 1 3 5 7 9 11 2 4 6 8 10 12 Nota. El comando reshape permite modificar las dimensiones de una matriz (o array en general). Es m´as flexible que el comando “:”. 4.1.2. M´as operaciones sobre matrices Hasta ahora las operaciones matriciales que han centrado nuestra atenci´on son las fun- damentales: suma y producto. En Matlab est´an tambi´en implementadas otras operaciones comunes en el ´Algebra Lineal. Entre todas ellas destacamos dot: Calcula el producto escalar de dos vectores: >> dot([1 2 3],[4 5 6]) ans = 32 Devuelve el produto 1·4+2·5+3·6 = 32. Este comando no distingue entre vectores filas y columnas, y es aplicable siempre que tengan la misma longitud. La funci´on se puede aplicar a matrices bien por columnas, ´esta es la forma est´andar2 , o por filas. >> a=[1 2 3; 4 5 6]; a2=[1 1 1; 1 1 1]; >> dot(a,a2) % producto por columnas ans = 5 7 9 2 Recuerda la predilecci´on de Matlab por las columnas. 60
  • 67. Borrador LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada >> dot(a,a2,2) % producto por filas ans = 6 15 sum: calcula la suma de las entradas un vector. Es aplicable tambi´en a matrices, en el sentido del comando anterior >> v=[1 2 3]; a=[1 2 3; 4 5 6]; >> sum(v) ans = 6 >> sum(a) % suma por columnas ans = 5 7 9 >> sum(a,2) % suma por filas ans = 6 15 prod: Como sum pero con el producto. max: Calcula el m´aximo en un vector. Puede devolver su posici´on en el vector. Aplicado sobre matrices funciona de la misma forma que dot o sum. Esto es, devuelve el m´aximo de cada columna por defecto, o de cada fila si as´ı se le indica >> v=[-2 -5 -3]; a=[2 3 8; -4 2 9]; >> max(v) ans= -2 >> [p,m]=max(abs(v)); [p,m] 61
  • 68. Borrador 4.1 Retorno a las matrices LECCI´ON II ans = 5 2 >> max(a) ans = 2 3 9 >> max(a,[],2) % busqueda por filas ans = 8 9 >> [m,p]=max(a,[],2); p % posicion del maximo ans= 1 1 La raz´on por la que se utiliza [] en la l´ınea anterior es que esta instrucci´on tambi´en se puede utilizar para comparar dos arrays del mismo tama˜no >> a1=[3 1 2; 5 3 2]; a2=[4 2 1; 1 2 3]; >> max(a1,a2) ans = 4 2 2 5 3 3 Al insertar el vac´ıo indicamos a Matlab que no existe un segundo vector y que debe proceder a buscar el m´aximo de a en su segunda dimensi´on, esto es, el m´aximo por filas. min: Calcula el m´ınimo procediendo exactamente igual que max. norm: norma de una matriz o vector. Se puede escoger entre varias normas. >> v=[1 2 3];a=[1 2; 3 4]; >> [norm(v) norm(v,1) norm(v,inf)] % norma 2, 1 e infinito de v ans = 62
  • 69. Borrador LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada 3.7417 6.0000 3.0000 >> [norm(a) norm(a,1) norm(a,inf)] % normas matriciales ans = 5.4650 6.0000 7.0000 En la Secci´on 5.2.3 comentaremos brevemente la definici´on de estas normas. rank: rango num´erico de una matriz. Esto es, el n´umero m´aximo de filas o columnas linealmente independientes3 . cond: Calcula norm(a)*norm(inv(a)), el condicionamiento de una matriz4 . El condi- cionamiento da una medida de la sensibilidad del sistema a perturbaciones en el t´ermino independiente. rcond: estimador del inverso del condicionamiento de una matriz. Es sensiblemente m´as econ´omico de calcular que cond. Nota. Cuando el comando dot se aplica a dos vectores complejos, procede siempre a conjugar el primer vector. Es decir, matem´aticamente dot(u, v) n i=1 uivi. As´ı, >> u=[1+i 2+2i]; v=[2 1]; >> dot(u,v) ans = 4.0000 - 4.0000i >> dot(v,u) ans = 4.0000 + 4.0000i Ejercicio 4.4 ¿C´omo sumar´ıas los elementos de una matriz?. ¿C´omo encontrar´ıas el m´ınimo y el m´aximo?. ¿Y su posici´on? 3 Una matriz tiene, en general, rango m´aximo por los errores de precisi´on de la m´aquina. Este comando hace una estimaci´on del rango, eliminando este factor. 4 En realidad no construye la inversa de la matriz por ser costoso. 63
  • 70. Borrador 4.1 Retorno a las matrices LECCI´ON II 4.1.3. Matrices sparse Las matrices sparse son una importante clase de matrices que surge en diferentes ´ambitos del An´alisis Num´erico y de las Matem´aticas y ciencias en general (elementos finitos, teor´ıa de grafos,...). En la Figura 4.1 se puede ver un ejemplo de una matriz sparse sim´etrica donde los puntos indican las entradas diferentes de cero. Desde una ´optica puramente computacional hace falta desarrollar sistemas de almacenamiento especiales dado que la inmensa mayor´ıa de las entradas no deben ser almacenadas porque son nulas. Figura 4.1: Diagrama de un matriz sparse 400 × 400 con 2690 elementos no nulos. Matlab provee de forma muy sencilla ese almacenamiento. Con >>a=sparse(100,100); b=sparse(100,1); declaramos a como una matriz sparse 100×100 y un vector columna b de 100 elemen- tos. Todas las entradas son inicialmente ceros, pero se guarda la estructura b´asica para introducir los elementos no nulos >> a=sparse(100,100) a = All zero sparse: 100-by-100 >> a(4,4)=1; a(8,9)=-4; a(80,45)=-1; a(99,100)=4; >> a a = 64
  • 71. Borrador LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada (4,4) 1 (8,9) -4 (80,45) -1 (99,100) 4 Para transformar una matriz llena (convencional) en una matriz sparse podemos utilizar tambi´en este comando >> a=diag([1 2 3 4 5]); >> a=sparse(a) a = (1,1) 1 (2,2) 2 (3,3) 3 (4,4) 4 (5,5) 5 Con full realizamos la operaci´on inversa: transforma una matriz sparse en una matriz llena, >> a=full(a) a = 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 La instrucci´on spalloc tiene un funcionamiento muy similar a sparse. Es ´util si se sabe el n´umero de elementos no nulos que tendr´a dicha matriz. Concretamente >> a=spalloc(8,7,12) declara una matriz 8 × 7 con a lo sumo 12 elementos no nulos. Al informar de cu´antos elementos no nulos se esperan Matlab hace una gesti´on m´as eficiente de la memoria. El comando nnz (Non zeros) nos informa del n´umero de elementos no nulos de una matriz, mientras que su esquema (pattern), como el que aparece en la Figura 4.1, se obtiene con spy: >> a=sparse(10,10); >> a(1,4)=1; a(2,8)=-4; a(3,9)=1; a(7,8)=5; >> nnz(a) ans= 65
  • 72. Borrador 4.2 Argumentos de funciones LECCI´ON II 4 >> spy(a) La gr´afica se despliega en una ventana separada. Todas las operaciones que hemos visto est´an adaptadas al nuevo entorno. As´ı, los operadores : triu tril diag devuelven vectores/matrices sparse. Las operaciones * + .* dot ’ est´an asimismo optimizadas. El problema de generar c´odigo eficiente no es tan simple como pudiera parecer. Por ejemplo, si se aplica la funci´on dot a dos vectores sparse es preciso saber antes qu´e entradas hay que multiplicar. De otra forma podr´ıamos estar dedicando un alto porcentaje de nuestro esfuerzo en simplemente calcular productos por cero. Afortunadamente, Matlab hace ese trabajo por nosotros. Por otro lado, aparecen una nueva serie de comandos, que devuelven matrices sparse, entre los que merece la pena destacar spdiags maneja las diagonales de una matriz de forma an´aloga a diag; speye devuelve una matriz diagonal con unos, o similar (an´aloga a eye); spones matriz de 1s, similar a ones; sprand, sprandn construyen una matriz sparse con entradas aleatorias (similar a rand); Ejercicio 4.5 Con la ayuda de Matlab averigua la sintaxis concreta de los comandos ante- riores y comprueba con alg´un ejemplo c´omo funcionan. 4.2. Argumentos de funciones Veremos a continuaci´on c´omo se pueden programar funciones en las que tanto el n´umero de argumentos de entrada como de salida sean variables. Esta caracter´ıstica dota de una mayor flexibilidad a la programaci´on en Matlab. Los comandos esenciales que precisamos son varargin nargin varargout nargout La instrucciones nargin y nargout informan respectivamente sobre el n´umero de variables de entrada y el n´umero de variables de salida (number of input arguments y number of output arguments). Una funci´on puede aceptar una serie de argumentos fijos, al estilo de las funciones que programamos en la lecci´on anterior, y un conjunto de argumentos opcionales, que pueden 66
  • 73. Borrador LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada ser o no especificados por el usuario. Para su acceso se utilizan respectivamente varargin (variable input argument) y varargout (variable output argument) mediante llaves ({})5 . Mostramos a continuaci´on un ejemplo de utilizaci´on conjunta de estas nuevas instruc- ciones. En la cabecera se informa de qu´e hace la funci´on, dependiendo de los argumentos de entrada y salida. 01 % DESCOMPOSICIONLU 02 % 03 % [L,U] = DESCOMPOSICIONLU(A) 04 % Devuelve U triang superior, L permutacion de una 05 % triang inferior con 1s en la diagonal tal que A=LU 06 % 07 % [L,U,X] = DESCOMPOSICIONLU(A,B) 08 % Devuelve U triang superior, L permutacion de una 09 % triang. inferior con 1s en la diagonal tal 10 % que A=LU y la solucion del sistema AX=B 11 12 function varargout=DescomposicionLU(a,varargin) 13 14 [l,u]=lu(a); % descomposicion LU 15 16 if nargin==1 & nargout==2 17 varargout{1}=l; 18 varargout{2}=u; 19 elseif nargin==2 & nargout==3 20 b=varargin{1}; % leemos el primer argumento opcional... 21 varargout{1}=l; varargout{2}=u; 22 varargout{3}=u(lb); % solucion del sistema 23 end Como puede comprobarse, la funci´on precisa de un argumento obligatorio, la matriz a, uno opcional, el t´ermino independiente, y devuelve dos o tres argumentos seg´un se requiera. Observa los resultados que se han obtenido para varios ejemplos: >> a=[1 3; 2 4]; >> [l,u]=DescomposicionLU(a) l = 0.5000 1.0000 1.0000 0 u = 5 Las variables varargin y varargout son de un tipo especial denominado cell array. En la Lecci´on IV estudiaremos su funcionamiento con m´as detalle. 67
  • 74. Borrador 4.2 Argumentos de funciones LECCI´ON II 2 4 0 1 >> [l,u,x]=DescomposicionLU(a,[1 2].’) l = 0.5000 1.0000 1.0000 0 u = 2 4 0 1 x = 1 0 >> [l,u]=DescomposicionLU(a,[1 2]) %falta un arg. de salida ??? Error using ==> DescomposicionLU Too many output arguments. >> [l,u,x]=DescomposicionLU(a) %faltan arg. de entrada ??? Error using ==> DescomposicionLU Too many output arguments. Ejercicio 4.6 A partir de la funci´on anterior implementa una funci´on que opere seg´un la “siguiente cabecera” % DESCOMPOSICIONLU2 % % R = DESCOMPOSICIONLU2(A) % Si A es simetrica definida positiva devuelve % R triang superior tal que A=R’R % [R,X] = DESCOMPOSICIONLU2(A,B) % Si A es simetrica definida positiva devuelve % R triang superior tal que A=R’R y la solucion % del sistema AX=B % [L,U] = DESCOMPOSICIONLU2(A) % Devuelve U triang superior, L permutacion de % una triang. inferior con 1s en la diagonal % tal que A=LU % [L,U,X]= DESCOMPOSICIONLU2(A,B) % Devuelve U triang superior, L permutacion de 68
  • 75. Borrador LECCI´ON II Cap´ıtulo 4. Matlab: programaci´on avanzada % una triang. inferior con 1s en la diagonal % tal que A=LU y la solucion del sistema AX=B Nota: Realizar la comparaci´on A’==A para testar si la matriz es sim´etrica. ¿Qu´e devuelve esta comparaci´on? ¿C´omo se puede utilizar para comprobar si efectivamente la matriz es sim´etrica? ¿Y para ver que es definida positiva?. 69
  • 76. Borrador 4.2 Argumentos de funciones LECCI´ON II 70
  • 77. Borrador Cap´ıtulo 5 Matrices sparse en Matem´aticas. M´etodos iterativos para sistemas de ecuaciones lineales 5.1. M´etodo de Gauss para matrices sparse Esta secci´on se centra en el estudio del m´etodo de Gauss para matrices sparse. Mostraremos los problemas que presenta la aplicaci´on de este algoritmo a este tipo de matrices, espe- cialmente el efecto relleno y algunas estrategias de reordenamiento que mitigan estos efectos adversos. Sirve asimismo para ahondar en la problem´atica de los m´etodos directos y allanar y fundamentar los m´etodos iterativos que se tratan en las siguientes secciones. Recordemos que en Matlab la resoluci´on de sistemas de ecuaciones utilizando >> x=ab; se basa en el m´etodo de Gauss (o alguna de sus variantes). Puede plantearse la cuesti´on de si es adecuado utilizar “” para matrices con formas especiales como por ejemplo matrices triangulares o permutaciones de ´estas, para las que la eliminaci´on gaussiana no es nece- saria puesto que las variables se pueden despejar de forma progresiva. Afortunadamente Matlab detecta estas estructuras b´asicas y resuelve de una manera ´optima el sistema. Si se consulta la ayuda para este comando se puede leer que se reconoce si una matriz es, por ejemplo, sparse o llena, sim´etrica o no sim´etrica, triangular o permutaci´on de ´esta, bandeada (los elementos concentrados en torno a la diagonal), de Hessenberg1 (con todos los elementos por debajo de la subdiagonal principal nulos), etc., y aplica el m´etodo di- recto m´as conveniente en cada caso. Testar si una matriz pertenece a uno de estos tipos se puede realizar en un n´umero de operaciones despreciable respecto a las del m´etodo de Gauss. Hemos visto al final de la Lecci´on I que el m´etodo de Gauss es matem´aticamente equivalente a calcular dos matrices L y U triangular inferior y superior respectivamente con 1s en la diagonal de L de forma que A = LU. 1 Ver Lecci´on IV 71