• No se han encontrado resultados

LibroMatlabWEB.pdf

N/A
N/A
Protected

Academic year: 2021

Share "LibroMatlabWEB.pdf"

Copied!
280
0
0

Texto completo

(1)

Matlab en cinco lecciones de Num´erico

V´ıctor Dom´ınguez B´

aguena

M

a

Luisa Rap´

un Banzo

Febrero de 2006

Disponible en

(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

(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

(5)

Borrador

A Javier Amigo y maestro.

(6)
(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,..);

1por 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,...

2Fortran 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.

(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 adecuaeto-do, y especialmente el significaeto-do 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,...)

3A modo de ejemplo, estos comandos cubren salidas gr´aficas: plot, line, ezplot, ezsurf, surf,

(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.

4Tambi´en est´a la extensi´on *.mat, propia de ficheros de datos.

5De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecuci´on entre los dos c´odigos

(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.

(11)

Borrador

Lecci´

on I

Primeros pasos en Matlab.

M´etodos directos para sistemas de ecuaciones

lineales

(12)
(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.

(14)
(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 Figura2.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:

(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;

(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:

(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

1Aproximadamente 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.

(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 =

(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

(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 Figura2.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

2Para 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.

(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 =

(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

(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

3Se entiende por sesi´on el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar el

(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:

4Tambi´en es posible crear este fichero a golpe de rat´on. 5Por defecto es C:\MATLAB6p5\work.

(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

(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;

(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

7No 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.

8Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombre

(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.

9Ello 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.

(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), a\a2 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

>> 3\5

y observa el resultado. ¿Tiene sentido desde el punto de vista anterior?. Ejercicio 2.6 Dado b una matriz, ¿qu´e hace 1/b?.

(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−1b. As´ı, si b es n × 1 y a es n × n,

>> x=a\b;

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)

(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.

(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

(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 =

(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 =

(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´on2.5.3)

Por ejemplo,

>> for j=1:3; disp(j); end 1

(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 12 · · · 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

(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

(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

(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.

(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

(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).

(43)

Borrador

Cap´ıtulo 3

etodos directos para sistemas de

ecuaciones lineales

3.1.

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.

1Existe 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.

2Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las inc´ognitas). En este

(44)

Borrador

3.1 M´etodo de Gauss LECCI ´ON I

3.1.1.

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 X 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

3es decir, el n´umero de multiplicaciones es n3/3 + αn2+ βn + γ, donde α, β y γ son constantes

(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.

(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 c > 1 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 c>1 0 A11− (a11)−1c>1d1  , b =  b1 b1− a−111b1d1.  | {z } A(1) | {z } 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.

5Se 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).

(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 almacealmace-namiento 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.

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 6= 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).

6Cuando 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.

(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

(49)

Borrador

LECCI ´ON I Cap´ıtulo 3. M´etodos directos para sistemas de ecuaciones lineales

3.1.3.

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],

8La importancia de estas t´ecnicas ha decrecido con las ´ultimas generaciones de ordenadores, donde la

(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, U x = 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

(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 X p=1 `kpupj 04 end 05 `kk = 1 06 for i = k + 1:n 07 `ik =  aik− k−1 X 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.

(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 Ejercicio3.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.

Referencias

Documento similar

ELABORACIÓN DE LOS MAPAS DE PELIGROSIDAD Y RIESGO REQUERIDOS POR EL R.D...

Las pruebas de evaluación a distancia abarcan básicamente tres aspectos: una dedicada a las expresiones y los términos críticos manejados a lo largo de la asignatura; otro basado en

El objetivo de la asignatura es el estudio de los sistemas de aprovechamiento de energía eólica, y especialmente del proceso de transformación de la energía del viento en

Gastos derivados de la recaudación de los derechos económicos de la entidad local o de sus organis- mos autónomos cuando aquélla se efectúe por otras enti- dades locales o

4) Elemento inverso: para todas las matrices de orden n con determinante no nulo existe otra matriz de orden n con determinante no nulo, donde el producto de ambas es la

creto de Concilio no apiouado , que faltando la apro*.. fin interucncion de autoridad Apoflolícajíi t a m í bien es hercgejeslo macer¡almente,y no en todo rigor* porque le faltó

[r]

&#34;No porque las dos, que vinieron de Valencia, no merecieran ese favor, pues eran entrambas de tan grande espíritu […] La razón porque no vió Coronas para ellas, sería