Sie sind auf Seite 1von 31

Curso de Matlab

por Bosco Garc a Archilla

1 Introducci on.
Qu e es Matlab (alias Matrix Laboratory)? Es un entorno inform atico de computaci on num erica y representaci on gr aca de f acil manejo. Es entorno porque es a la vez un programa interactivo y un lenguaje de programaci on de muy alto nivel. Su caracter stica fundamental es que su sintaxis es lo m as parecido a nuestra simbolog a matem atica habitual que la estupidez de un ordenador puede entender. 1 No es un manipulador simb olico (aunque se le puede a nadir uno). Nunca nos proporcianar a por tanto la expresi on de la derivada de una funci on o hallar a los factores de un polinomio. 2 Ejecuta ecazmente (esto es, sin eternizarse) algoritmos extraordinariamente complejos (encontrar m aximos y m nimos de funciones, desarrollos de Fourier, c aculo de autovalores e inversi on de matrices, soluci on de sistemas de ecuaciones lineales y no lineales, soluci on num erica de ODEs, etc) con instrucciones sencillas y de nomenclatura m as o menos acorde con el sentido com un. Por ejemplo, la inversa de una matriz A se obtiene con inv(A) o con A (-1), sus autovalores con eig(A) o su norma con norm(A). Estas instrucciones ponen en marcha la selecci on y ejecuci on de una serie de algoritmos de manejo engorroso de lo que hasta hace pocos a nos ha sido la mejor colecci on de algoritmos de Algebra Lineal (Linpack y Eispack). Adem as, Matlab permite elaborar programas cortos y sencillos para tareas m as complejas como representaci on de mapas de fase de sistemas din amicos, soluci on num erica de PDEs o an alisis estad stico. 3 Fue originariamente escrito por Cleve Moler, como ayuda para la ense nanza del Algebra Lineal. Las versiones actuales est an escritas por The Mathworks Inc, y han crecido hasta convertirse en una herramienta profesional muy utilizada en algunos campos de la Industria y la Ingenier a. En las universidades, principalmente en el campo de la Matem atica Aplicada, se est a convirtiendo en herramienta de uso com un entre muchos de sus investigadores.

2 Manejo B asico.
2.1 Elementos de Matlab.
El elemento b asico de Matlab es la matriz rectangular de elementos reales o complejos (el otro elemento b asico es, afortunadamente, el comando help). Los vectores la o columna y los escalares son casos particulares. Las matrices se guardan en variables que Matlab mantiene hasta que se borren con el comando clear. Para introducir una matriz, se hace como si la escribi esemos en la pizarra (bueno, casi). Por ejemplo, A =[ 1 2 log(-1) 2+2*i pi cos(pi)] produce la matriz A = 1.0000 2.0000 2.0000 + 2.0000i 3.1416 0 + 3.1416i 1.0000

que quedar a guardada en memoria hasta que salgamos de Matlab con quit o ejecutemos clear A. Notemos que 1 - Existen variables preasignadas como i que es la unidad imaginaria i = 1, o como pi que es el valor de toda la vida (alias el area del c rculo de radio 1); Tambi en est an on del ordenador en preasignadas j que es i = 1 y la variable eps que es la precisi el que trabajemos (en un PC su valor es 252 2.22 1016 ). El valor de todas ellas lo podemos cambiar asignando valores a voluntad. Por ejemplo j=5. 2 - Matlab, para comodidad nuestra, entiende la expresi on 2i. En la asignaci on de A pod amos haber puesto 2 + 2i en vez de 2 + 2 i. OJO, que esto s olo es v alido si i va a continuaci on de una constante. Pru ebese a escribir A-(real(A) + imag(A)i) y tambi en A-(real(A) + imag(A)*i), y de paso aprendemos los comandos real e imag que proporcionan las partes real e imaginaria respectivamente de una variable. 3 - Los elementos de una matriz A los podemos denir con expresiones como log(-1) 2 + 2 i. En la correspondiente componente de A se guardar a el valor num erico de dichas expresiones. 4 - Al denir una matriz, es importante dejar espacios en blanco entre los distintos elementos de una la y no dejar espacios en blanco entre las diversas componentes de una expresi on que dene un elemento. Si queremos dejar espacios en blanco para ver mejor lo que escribimos o porque somos despistados, hay que separar los elementos 1 /3 con comas, por ejemplo, para introducir el vector la (1 + , 2 , 2 2) podemos por ejemplo escribir v=[1 + pi, 2 (1/3), 2 - sqrt(2)] Pru ebelo para propio convencimiento. 2

NO se nota pero debemos saber que 1 - Matlab, para comodidad nuestra, s olo muestra por pantalla aproximaciones con cuatro cifras decimales, pero trabaja internamente con 16 cifras signicativas. Para cambiar el formato de salida se utilizan los comandos format long format long e format short format short e

Ejec utese el comando format long y a continuaci on tecl eese A para ver el valor de A. Para mayor comodidad volver al formato est andar con el comando format short; 2 - A los que son usuarios de lenguajes cl asicos como Fortran, C, o Pascual, les sorprender a saber que Matlab almacena con cada variable su dimensi on y su caracter complejo o no. La dimensi on de una variable se obtiene con el comando size que produce un vector la con las dimensiones de la variable (pru ebese size(A) y size(v)). El comando length produce un escalar con la m axima dimensi on de la variable (pru ebese length(A) y length(v). Para ver todas las variables que hemos asignado se utiliza el comando who, y para obtener m as informaci on sobre ellas se utiliza whos (who+size). En Matlab tambi en podemos ampliar las matrices orl andolas de igual manera que hacemos en la pizarra. Por ejemplo, ejec utese [real(A) v] que dar a como resultado ans = 1.0000 2.0000 0 2.0000 3.1416 1.0000 4.1416 1.2599 0.5858 que efectivamente es la matriz formada con la parte real de A orlada con el vector v en la ultima la. Observemos tambi en, que cuando ejecutamos un comando sin asignarlo a una variable, el resultado se asigna a la variable ans. Hagamos ahora D=ans y la matriz anterior la tenemos en la variable D. El mismo resultado lo pod amos haber obtenido con el comando [real(A);v] esto es, el punto y coma, al denir una matriz o vector, indica nueva la. Esto permite denir vectores columna en una sola l nea de comandos. Por ejemplo, para denir el vector T w = (1, 2, 3, 4) podemos utilizar w=[1; 2; 3; 4] 3

produciendo w = 1 2 3 4 Aprovechamos para se nalar que, como en otros lenguajes de programaci on, los elementos aij de la matriz A se nombran en Matlab con A(i,j). Por ejemplo, si ejecutamos D(3,1) se produce el resultado ans = 4.1416 Para orlar tambi en se pueden asignar elementos que no est en en la matriz. Por ejemplo si ejecutamos D(4,4)=1 se produce el resultado D = 1.0000 2.0000 4.1416 0 2.0000 0 0 3.1416 1.0000 0 1.2599 0.5858 0 0 0 1.0000

N otese que al haber hecho una asignaci on, hemos ampliado la matriz D, no que la variable ans contiene a la matriz orlada de D. Hemos visto c omo se mencionan los elementos de una matriz, y dijimos al principio que los vectores son un caso particular. Matlab, para comodidad nuestra, permite (cosa por otra parte natural) designar a los elementos de un vector con un solo ndice. As debemos escribir v(2) en lugar de v(1,2). De hecho, v(2) + D(4,4) produce ans = 2.5929 4

Ya sabemos pues c omo referirnos a los elementos de un vector o de una matriz. Sin embargo, y esta es una gran ventaja de Matlab, se dispone de notaci on para referirnos a las columnas y las de una matriz. Por ejemplo D(1,:) produce el resultado ans = 1.0000 2.0000 y D(:,1) produce ans = 1.0000 2.0000 4.1416 0 Podemos pues orlar la matriz D con sus propias las y columnas. Por ejemplo [D, D(:,1); D(1,:), 27] producir a ans = 1.0000 2.0000 4.1416 0 1.0000 0 0

2.0000 0 0 1.0000 3.1416 1.0000 0 2.0000 1.2599 0.5858 0 4.1416 0 0 1.0000 0 2.0000 0 0 27

Por u ltimo, mostramos c omo referirnos a submatrices que no sean un elemento, una la o una columna. La clave est a en que en las componentes de una matriz podemos poner un vector; el resultado ser a las las (o columnas) que indiquen dicho vector. Por ejemplo, para obtener una matriz que contenga las columnas 1 y 3 de D podemos ejecutar I=[1 3] D(:,I) 5

con el resultado, tras el segundo comando de ans = 1.0000 0 2.0000 1.0000 4.1416 0.5858 0 0 y con D(I,:) se obtiene ans = 1.0000 2.0000 0 2.0000 3.1416 1.0000 0 0

N otese que no es necesario que el vector sea la para nombrar columnas ni columna para nombrar las: en el u ltimo comando que hemos ejecutado, I es la y lo hemos utilizado para nombrar las. Tambi en se pueden poner vectores en las dos componentes. Por ejemplo, ejecutando J=[2 4] D(I,J) tras el segundo comando se obtiene ans = 2.0000 3.1416 0 0

Si las las o columnas van seguidas, podemos utilizar rangos. Por ejemplo para referirnos a las tres primeras las de la matriz D podemos escribir D(1:3,:) o D(1:3,1:4) obtni endose en ambos casos ans = 1.0000 2.0000 0 2.0000 3.1416 1.0000 4.1416 1.2599 0.5858 0 0 0 6

De hecho, el comando real(A) - D(1:2,1:3) debe producir una matriz 2 3 de ceros. Digamos para terminar que la sintaxis para describir un rango (que no es otra cosa que un vector la) entre los extremos e1 y e2 es e1:e2 para el rango e1, e1 + 1, e1 + 2, . . . , e1 + [e2 e1] ([] indica parte entera), o bien e1:h:e2 si el incremento h (que puede ser negativo ) no es 1. Ejercicio 1. Si la matriz D que tenemos la expresamos por bloques 2 2 como D= c omo expresar en Matlab la matriz E= D22 D12 D21 ? D11 D11 D21 D12 D22

Ejercicio 2. C omo escribir con dos l neas de comando la matriz F = (eij )1ij 4 a partir de la matriz D = (dij )1ij 4 de manera que eij = d4+1i,4+1j ? Y con una sola l nea?

2.2 Operaciones
Si el elemento b asico de Matlab son las matrices, las operaciones que contempla Matlab (salvo alguna excepci on) son siempre entre matrices. Por tanto las dimensiones deben cuadrar. Hay dos excepciones importantes a esta regla. Una es la obvia de producto de una matriz o vector por un escalar. La otra es que, para comodidad nuestra se permite sumar un escalar y un vector o matriz, por ejemplo 1+v, entendiendo que se suma a cada componente del vector o matriz el escalar en cuesti on. Con la matriz A y el vector v que hemos introducido, no son posibles los productos vA ni Av , pero s Av T . Este u ltimo se ejecuta con el comando A*v OJO, que el ap ostrofe signica herm tico (transpuesto y conjugado). Esto es, cuando en Matlab escribimos v nos referimos a v = v T .. En el caso que nos ocupa v es real, luego para obtener v T nos da lo mismo escribir v que conj(v) o conj(v) que es lo que deber amos escribir para obterner v T en el caso en que v fuese complejo. 7

La notaci on de las operaciones elementales es la siguiente + suma y resta, multiplicaci on exponenciaci on (OJO: s olo matrices cuadradas) \ / divisi on . . ./ multipl., exponenciaci on y div. componente a componente Menci on especial merece la divisi on. Ve amoslo con un ejemplo. Introduczamos la matriz C 1 1 1 C = 0 2 1, 1 1 1 mediante el comando C=[ 1 1 1; 0 2 1; -1 1 1] (n otese la nueva forma m as c omoda de introducir una matriz separando las las por punto y coma) e introduzcamos el vector y = (3, 3, 1)T y=[3 3 1] La soluci on x del sistema Cx = y se obtiene mediante el comando x=C\y Esto es, \ es divisi on por la izquierda. N otese que, con las variables introducidas hasta ahora, tambi en podemos ejecutar C\A La soluci on z de zC = v se obtiene mediante el comando z=v/C Resumiendo: C\ equivale a multiplicar por la izquierda por C 1 y /C equivale a multiplicar por la derecha por C 1 , esto es x = C 1 y z = vC
1

z=v/C

x=C\y

Los vectores x y z los pod amos haber obtenido mediante los comandos x=inv(C)*y z=v*inv(C) 8

o x=C (-1)*y z=v*C (-1) N otese que en el caso de escalares, la divisi on por la izquierda y por la derecha produce el mismo resultado. IMPORTANTE: A efectos pr acticos, y en especial con matrices grandes (ya veremos c omo se obtienen) es siempre mejor utilizar / y \ que la potencia 1 o el comando inv. Se efect uan menos operaciones y el resultado, en general, es menos sensible a errores de redondeo. Las operaciones .*, ./ y . se efect uan entre matrices de igual dimensi on componente a componente. Por ejemplo [ 1 2 3].*[4 5 6] produce el resultado ans = 4 10

18

[4 5 6]./[1 2 3] ans = 4 2.5000 2 y [4 5 6]. [1 2 3] ans = 4 25

216

Menci on especial merece la c omoda excepci on de elevar una matriz componente a componente a una constante, por ejemplo [1 2 3]. 2 produce ans = 1 4

9 9

Por que

u ltimo, tambi en tenemos las siguientes funciones de matrices cuadradas. expm exponencial matricial, logm logaritmo matricial, sqrtm raiz cuadrada matricial, no deben confundirse con exp log y sqrt.

Ejercicio 3. Reducir mediante operaciones elementales las matrices C y D a forma triangular superior con a lo sumo dos y tres l neas de comandos respectivamente.

2.3 Funciones internas


Ya hemos visto que, igual que otros lenguajes de programaci on, Matlab posee funciones internas como cos o log. Quiz a la ventaja m as destacada sobre otros lenguajes de programaci on es que Matlab permite evaluarlas sobre vectores o matrices (componente a componente) con una sola instrucci on. Por ejemplo cos([0 pi/2 pi 3*pi/2]) produce ans = 1.0000 0.0000 1.0000 0.0000 Por ejemplo para dibujar la funci on x log(x) en el intervalo [0 : 2] podemos hacer x=[0:0.01:2]; plot(x,x.*log(x)) NOTESE QUE EL PUNTO Y COMA DESPUES DE UN COMANDO ANULA LA SALIDA POR PANTALLA O ECO DEL DICHO COMANDO, lo cual es muy c omodo cuando se trabaja con vectores o matrices grandes como en el presente caso. Ejecicio 4. Buscar una partici on x del intervalo [0, /2] mediante la cual al ejecutar el comando plot(x,x.*sin(ones(size(x))./x)) quede un gr aco bonito de la funci on y = xsen(1/x) (el comando ones genera matrices de unos de dimensi on la especicada por sus argumentos, y el comando size produce las dimensiones de su argumento). Los comandos para las funciones trigonom etricas e hiperb olicas (senos, cosenos, arcos senos, cosenos hiperb olicos, argumentos y dem as) son sin, cos, tan, asin, acos, atan, atan2, sinh, cosh, tanh, asinh, acosh, antanh Matlab dispone adem as de las siguientes funciones elementales 10

abs valor absoluto o m odulo de complejo, angle argumento de un complejo, sqrt raiz cuadrada, real parte real, imag parte imaginaria, conj conjugado (de un complejo) round redondeo a enteros, fix truncaci on a enteros hacia 0, floor truncaci on a enteros hacia , floor truncaci on a enteros hacia +, sign signo, rem resto de divisi on con cociente entero, gcd MCD, lcm mcm, exp exponencial, log logaritmo natural, log10 logaritmo en base 10. Adem as Matlab dispone de las siguientes funciones especiales, bessel funciones de Bessel, beta la funci on Beta, gamma la funci on Gamma de Euler, rat aproximaci on racional y por fraciones continuas, x t2 2 erf la funci on de error erf(x) = e dt. erfinv su inversa, ellipke integrales el pticas, ellipj funciones el pticas de Jacobi. Ejercicio 4. Curiosear con help algunas de estas funciones. Dibujar algunas de ellas. OJO: Si A es una matriz, exp(A), log(A) y sqrt(A) calculan otra matriz con las exponenciales, logaritmos y raices cuadradas de los elementos de A, mientras que expm(A), logm(A) y sqrt(A) calculan la exponencial, el logaritmo y la raiz cuadrada respectivamente de A.

2.4 Gr acos en 2-D


Ya hemos visto el comando plot que pinta parejas de vectores o (y esto es nuevo) un vector frente a sus ndices o la parte real e imaginaria de un vector. En esta secci on veremos - c omo dibujar m as gr acas en un gr aco, - c omo poner t tulo, e indicaciones en los ejes, - c omo poner texto dentro del dibujo, - c omo imprimir el dibujo y - c omo guardarlo para meterlo en un chero TEX Aparte de plot para dibujar tenemos, con la misma sintaxis, los comandos loglog, semilogx, semilogy 11

que hacen lo mismo que plot con la diferencia que o bien los dos ejes, o bien el eje horizontal o bien el vertical se representan en escala logar tmica. Esto u ltimo es u til cuando las componentes del vector que dibujamos tienen magnitudes muy diferentes Ejercicio 5. Ejecutar los comandos siguientes. x=[0:0.05:10]; y=exp(-x); figure(1) plot(x,y) figure(2) semilogy(x,y) Cu al de los dos gr acos es m as expresivo? En el ejercicio anterior, vemos que el comando figure crea una nueva gr aca, o si ya existe, pinta en la gura seleccionada. Ejec utese por ejemplo figure(1) title(evoluci on del Real Madrid) o un t tulo a voluntad. Ya vemos pues c omo poner t tulo. Para poner las variables de los ejes, se utilizan los comandos xlabel e ylabel Ejec utese por ejemplo. ylabel(goles/pesetas presupuesto) Si ahora quisi esemos pintar otra gr aca junto a esta (por ejemplo la evoluci on del Bar ca) para compararla, ya sabemos que el comando plot dibuja la nueva borrando la vieja. Para sobreimprimir en un gr aco, debemos decirle a Matlab que queremos conservar el gr aco mediante el comando hold que mantiene el gr aco hasta que se ejecute hold de nuevo que lo libera. Matlab, cada vez que se ejecuta hold nos indica si el gr aco est a retenido (y por tanto sobreimprimiremos) respondiendo con el mensaje curren plot held, o si soltamos el gr aco para empezar uno nuevo con el mensaje current plot released. Antes de dibujar la nueva gr aca junto a la vieja, podemos plantearnos el cambiar de tipo de linea. Los tipos de linea se representan con - (l nea continua, por defecto), eg. plot(x,y,-) -- (l nea discontinua), eg. plot(x,y,--) : (l nea de puntos), eg. plot(x,y,:) -. (l nea de trazo y punto), eg. plot(x,y,-.) 12

Tambi en podemos cambiar el color de la l nea con las letras y de yellow, c de cian, r de red, m de magenta, g de enviromentalist y algunas m as. Por ejemplo plot(x,y,r:) dibujar a y (x) en l nea de puntos en color rojo. Ejercicio 6. Dibujar, junto a la gr aca del Real Madrid (o la que se haya dibujado antes) la del Bar ca (o la que apetezca). Tambi en se pueden dibujar los vectores con s mbolos en vez de con l neas Estos son * (asteriscos), eg. plot(x,y,*) + (cruces), eg. plot(x,y,+) x (aspas), eg. plot(x,y,x) o (c rculos), eg. plot(x,y,o) que tambi en se pueden acompa nar de las letras para cambiar el color n. Para poner texto en el gr aco se utiliza el comando gtext, cuya sintaxis es gtext(texto que queramos poner) Al ejecutar el comando, la posici on en la pantalla del rat on cambia de icono, en espera de que apretemos el bot on del rat on, sobre el gr aco, en cuya locaclizaci on escribir a el texto. Ejercicio 7. Marcar con simbolitos los puntos de las gr acas que corresponden a Copas de Europa, de la UEFA y esas cosas, y con gtext poner al lado los a nos correspondientes (si no caben todos los trofeos de tan grandes y afamados equipos, poner s olo unos pocos). Por u ltimo, para imprimir, si tenemos acceso a una impresora, basta ejecutar el comando print En caso contrario, debemos ejecutar print con alguna opci on y a nadiendo el nombre de un chero para que el gr aco se vuelque a dicho chero en el formato que le decimos con opci on. Por ejemplo, print -deps dibujo.ps guardar a en el chero dibujo.ps el dibujo (en nuestro caso el churro que hemos hecho con el Madrid y el Bar ca) en formato PostScript encapsulado, que es el adecuado para insertarlo en los cheros de TEX. V eanse las diversas opciones ejecutando help print. V ease tambi en el comando axis para cambiar los ejes del gr aco. Otros comandos para realizar gr acos m as particulares son los siguientes. bar gr aco de barras, compass gr aco de m odulos y argumentos de n umeros complejos dibujado como echas que salen del origen, feather versi on diferente de compass, 13

fplot eval ua una funci on y dibuja el resultado, polar gr aco en coordenadas polarers, quiver gr aco de un campo de vectores, fill dibuja pol gonos y los rellena de colorines. FPLOT Hemos visto la t ecnica para representar una funci on con el comando plot. Tambi en hemos visto que funciones del tipo sen(1/x) son dif ciles de representar adecuadamente con esta t ecnica. El comando fplot busca autom aticamente una red en la que la funci on se representa m as elmente. Admite dos argumentos opcionales: uno es el color y tipo de l nea, por ejemplo g-- para que dibuje la funci on en verde y l nea discontinua; El otro argumento es una tolerancia sobre el di ametro inferior de la red (por defecto Matlab utiliza TOL=2e-3. Por ejemplo, ejec utense los comandos fplot(sin(1./x),[0 pi]) fplot(sin(1./x),[0 pi],4e-4) N otese que la funci on a representar debe ir entre ap ostrofos. En ocasiones no es f acil (o es completamente imposible) dar una expresi on anal tica de la funci on que se quiere representar. En tal caso podemos escribir aparte un programa funci on que con comandos de Matlab eval ue la funci on en cuesti on. Veamos un ejemplo. Supongamos que queremos representar la funci on
x

f ( x) =
0

cos

(x sen(x2 )) log(1 + x) . 1 + x2

en el intervalo [0, 1]. Tenemos que escribir un programa que eval ue dicha funci on. Por ejemplo en un chero de nombre mifun.m (sin la extensi on .m si estamos en un MacIntosh) con el siguiente contenido function f=mifun(x) % eval ua una funci on horrible % x puede ser escalar vector o matriz v=size(x); % convertimos x en un vector fila y=reshape(x,1,v(1)*v(2)); t=([0:1:50])*(y/50); % se calcula la integral por la regla del trapecio. t=cos((t-sin(t.*t)).*log(1+t)./(1+t.*t)); f=(y/100).*sum(t(1:50,:)+t(2:51,:)); % devolvemos la forma original f=reshape(f,v(1),v(2)); 14

(de paso vemos c omo se ponen comentarios en un programa de Matlab con %, y dos nuevos comandos sum que suma las componentes de un vector o las las de una matriz, y reshape que cambia las dimensiones de una matriz). Para representar la funci on bastar a ejecutar fplot(mifun,[0,1]) Para gr acos en tres dimensiones, v eanse con help los comandos meshgrid, mesh, contour, surf.

2.5 Algebra Lineal


Matlab dispone de una serie de comandos para la reducci on mediante operaciones elementales de una matriz a forma triangular superior. c alculo de autovalores y autovectores. Ortogonalizaci on de columnas de una matriz. C alculo de normas lp de vectores y las correspondientes normas de operadores para los casos p = 1, 2, . Veamos estos comandos con algunos ejemplos. Consideremos la matriz 1 1 1 A = 2 4 5 , 2 2 3

e introduzc amosla en la variable A de Matlab A=[1 -1 1; 2 4 -5; 2 2 -3]; Podemos comprobar que esta matriz tiene determinante -2 ejecutando el comando det(A) Sabemos que A admite una descomposici on de la forma A = P T LU, donde P es una matriz de permutaci on, L es triangular inferior con U es triangular superior. De hecho 0 1 0 1 0 0 2 P = 1 0 0, L = 1/2 1 0, U = 0 0 0 1 1 2/3 1 0 unos en la diagonal y 4 3 0 5 7/2 1/3

Esta descomposici on se obtiene en Matlab con el comando lu. Ejecutando [L,U]=lu(A) 15

se obtienen los factores P T L y U en la respuesta L = 0.5000 1.0000 0 1.0000 0 0 1.0000 0.6667 1.0000 U = 2.0000 4.0000 5.0000 0 3.0000 3.5000 0 0 0.3333 (recu erdese que las cifras de esta salida son un redondeo a cuatro decimales de n umeros con diecieseis cifras signicativas). Si queremos obterner P , L y U debemos ejecutar [L,U,P]=lu(A) La matriz L as obtenida es realmente triangular inferior. N otese que si queremos resolver el sistema Ax = y y hemos ejecutado el comando [L,U]=lu(A) debemos ejecutar x=U\(L\y) y si hemos ejecutado [L,U,P]=lu(A) habr a que ejecutar x=U\(L\(P*y)) siendo importante colocar correctamente los par entesis (por qu e?). En general, es preferible utilizar x=A\y a cualquiera de las dos formas anteriores, salvo que utilicemos un PC (y no un ordenador UNIX) y tengamos que resolver varios sistemas con la misma matriz cuyos segundos miembros no se conozcan a priori (v ease ejemplo en p. 30). La raz on es que Matlab analiza primero la matriz para elegir la mejor manera de resolver el sistema. Por ejemplo, si A es sim etrica y denida positiva, con [L,U]=lu(A) y x=U\(L\y) se hacen aproximadamente el doble de operaciones que con x=A\y puesto que Matlab utiliza en este caso una variante de la descomposici on de Cholesky (comando chol). En cualquier caso, Matlab al resolver x=A\y siempre efect ua alguna variante de la descomposici on LU Veamos ahora la descomposici on espectral. La matriz A que nos ocupa satisface A = V DV 1 donde 1 D= 0 0 0 0 2 0 , 0 1 1 1 V = 1 1 1 0 0 1. 1

(1)

Podemos obtener un vector con los autovalores de A ejecutando eig(A) 16

con el resultado ans = 1.0000 1.0000 2.0000 Si deseamos obtener tambi en los autovectores, esto se hace con el comando [V,D]=eig(A) cuyo resultado es V = 0.5774 0.0000 0.7071 0.5774 0.7071 0.7071 0.5774 0.7071 0.0000 D = 1.0000 0 0 0 1.0000 0 0 0 2.0000 que, salvo el orden y la normalizaci on de las columnas de V , es la misma descomposici on espectral que en (1). Si ahora ejecutamos el comando A*V-V*D la matriz resultante tiene sus elementos menores que 1015 : Los autovalores y autovectores los ha calculado con un error del orden de la precisi on de la m aquina. Un ejemplo interesante es el siguiente. Ejecutemos D(:,2)=[1 1 0] C=V*D/V de manera que la matriz C tiene autovalor 1 doble y no diagonaliza. El comando [V1,D1]=eig(C) produce la respuesta V1 = 0.0000 + 0.5774i 0.0000 0.5774i 0.7071 0.0000 + 0.5774i 0.0000 0.5774i 0.7071 0.0000 + 0.5774i 0.0000 0.5774i 0.0000 1.0000 + 0.0000i 0 0 0 1.0000 0.0000i 0 0 0 2.0000 17

D1 =

y si efectuamos C*V1 - V1*D1 el resultado es de nuevo una matriz con elementos de tama no menor que 1015 . Este ejemplo sirve para recordar que 1 - Matlab no es un manipulador simb olico, y que 2 - a efectos pr acticos, las matrices no diagonalizables no existen, ya que las matrices diagonalizables forman un conjunto denso en el espacio de las matrices del orden correspondiente. Notemos sin embargo que la matriz V 1 tiene aparentememte dos columnas iguales (de hecho su distancia es del orden de 108 ). Si calculamos el n umero de condici on de V 1 ( V 1 V 11 ) mediante el comando cond(V1) se obtiene la respuesta ans = 9.8199e+007 mientras que el n umero de condici on de V es aproximadamente 6.7807. Ello nos indica que V 1, aun siendo invertible est a proxima a ser una matriz singular. Los diversos algoritmos para el c alculo de autovectores y autovalores est an basados en la iteraci on QR, basados a su vez en la descomposici on QR u ortogonal de una matriz que a continuaci on tratamos. Dada una matriz A m n existen una matriz Q de dimensi on m m y ortogonal (o unitaria si A es compleja) esto es, Q Q = I , y una matriz R de dimensi on n n triangular superior y con rg(R) = rg(A) tales que A = QR. Esto es el teorema de ortogonalizaci on de Gram-Schmidt completado con un complemento ortogonal de Im(A). La descomposici on QR de una matriz se obtiene mediante el comando qr. Si ejecutamos [Q,R]=qr(A) se obtiene la respuesta. Q = 0.3333 0.8085 0.4851 0.6667 0.5659 0.4851 0.6667 0.1617 0.7276 3.0000 3.6667 5.0000 0 2.7487 3.1530 0 0 0.2425 18

R =

Puede comprobarse la ortogonalidad de Q mediante los comandos Q*Q Q*Q-eye(length(Q)) (el comando eye produce la matriz identidad del orden que le demos como argumento). El algoritmo para obtener la descomposici on QR de una matriz que ejecuta Matlab no es el de la ortogonalizaci on de Gram-Schmidt que aprendemos en los cursos de Algebra Lineal. Este suele ser bastante sensible a errores de redondeo. Salvo en el caso de matrices dispersas, en el que se utilizan generalmente las rotaciones de Givens, el procedimiento habitual para encontrar la descomposici on QR consiste en ir haciendo ceros en la matriz A mediante transformaciones de Householder I2 vv vv

tambi en conocidas como reexiones especulares. Para dejar la primera columna de A, a1 = (a11 , . . . , am1 )T proporcional al primer vector coordenado e1 , basta tomar v = (a11 a1 , a21 , . . . , am1 )T (para mayor estabilidad del algoritmo se elige el signo + si a11 es positivo y - en caso contrario). Ejercicio 8. Mediante el comando rand construya una matriz de orden 6 y halle su descomposici on QR utilizando transformaciones de Householder. Ev tense las operaciones innecesarias. Para la descomposici on en valores singulares Matlab dispone del comando (qu e otro nombre pod a tener) svd. Dada una matriz A m n existen matrices V m m y Q n n ortogonales (o unitarias si A es compleja) y una matriz D m n diagonal (sus u nicos elementos posiblemente no nulos son de la forma dii ) de elementos positivos y con rg(D) = rg(A) tal que A = V DQ (los elementos de D son las ra ces cuadradas de los autovalores de A A). Pru ebese el comando [V,D,Q]=svd(A) Para el c alulo de normas Matlab dispone del comando norm (ejec utese help norm). Teminamos esta secci on con un listado de comandos relativos al tema. lu descomposici on LU qr descomposici on QR svd descomposici on en valores singulares. cond proporciona el n umero de condici on (en la norma 2 de operadores) de una matriz. norm calcula normas (por defecto la eucl dea y la norma de operadores asociada). 19

det calcula el determinante de una matriz cuadrada. rank calcula el rango de una matriz. rcond estima el n umero de condici on. rref reduce una matriz m n a forma escalonada. pinv calcula la pseudoinversa de Moore-Penrose de una matriz utiliza la SV D). orth proporciona una base ortonormal de la imagen (o espacio columna) de una matriz (utiliza la descomposici on QR). null proporciona una base ortonormal del n ucleo de una matriz (utiliza la descomposici on QR). poly produce un vector con los coecientes del polinomio caracter stico de una matriz (v ease tambi en polyval)

2.6 Construcci on de matrices gordas


Hemos visto c omo generar matrices y vectores introduciendo sus componentes. Tambi en hemos visto algunos comandos que generan matrices: - rand(m,n) genera una matriz m n de componentes aleatorias - zeros(m,n) genera una matriz m n de ceros - ones(m,n) genera una matriz m n de unos. Hemos visto tambi en c omo generar vectores utilizando rangos. Por ejemplo [0:pi/100:pi/2] . Existen otros comandos para generar matrices. - vander genera una matriz de Vandermonde. - hilb genera las matrices de Hilbert (matrices de Gram de los polinomios en L2 (0, 1), hij = 1/(i + j 1) - diag genera matrices a partir de sus diagonales o extrae las diagonales de una matriz. Ejercicio 9. Generar matrices de orden n de la forma 2 1 0 1 2 .. . ... 0 1 .. . 1 0 ... . 2 1 .. 0

1 2

2.7 Matrices dispersas


Se entiende por matriz dispersa aquella en la que la proporci on de elementos no nulos es peque na, por ejemplo las del ejercicio anterior. Las matrices dispersas surgen con frecuencia en la pr actica. Un caso t pico son las matrices que se obtienen al discretizar por diferencias nitas o elementos nitos ecuaciones en derivadas parciales. Num ericamente, tienen tratamiento distinto de las matrices llenas. De entrada s olo se almacenan los elementos no nulos (en los lenguajes cl asicos como Fortran o C en un 20

vector largo, junto con dos vectores de enteros que indican la la y la columna del elemento correspondiente del vector largo). Cuando se opera con ellas, s olo se utilizan los elementos no nulos. Hay t ecnicas num ericas espec cas para resolver sistemas lineales cuya matriz de coecientes es dispersa. Su costo operativo, en lugar de crecer como la dimensi on al cubo (como en las matrices llenas) crece de manera mucho m as moderada (en muchos casos linealmente con la dimensi on). Matlab, a partir de la versi on 4.0, contempla el caso particular de matrices dispersas. El comando lu, por ejemplo, act ua sobre matrices dispersas eligiendo rutinas internas espec cas para este tipo de matrices. Tambi en tiene algunos comandos especiales para estas matrices. Para Matlab, una matriz dispersa es una forma distinta de almacenamiento, o lo que es lo mismo, un nuevo tipo de variable distinto. Ejec utese por ejemplo A=[1 0 -1; 0 1 1; 1 0 1] B=sparse(A) La respuesta al segundo comando es B = (1, 1) (3, 1) (2, 2) (1, 3) (2, 3) (3, 3) 1 1 1 1 1 1

N otese que los unicos elementos almacenados son los no nulos. Junto con cada elemento, se almacena el par con la la y la columna de la matriz a que corresponde. Las matrices A y B , como matrices, son la misma; como variables de Matlab son, como vemos, diferentes. Sin embargo, siendo variables de tipos distintos, se puede operar entre ellas como si el tipo de variable fuese la misma. Si ejecutamos A-B el resultado es ans = 0 0 0 0 0 0

0 0 0

Todo lo que se ha explicado de manejo y operaciones con matrices es v alido para matrices dispersas, siguiendo la losof a de que simplemente es un tipo de almacenamiento diferente. A nivel de usuario, no nos interesa c omo se almacena una matriz, sino simplemente si es dispersa o no (para saber que ciertos procesos como la factorizaci on LU la suma, la 21

multiplicaci on, etc, requerir an menos tiempo de computaci on o m as. Por ejemplo, podemos efectuar la descomposici on LU de B [L,U]=lu(B) con respuesta L = (1, 1) (3, 1) (2, 2) (3, 3) U = (1, 1) (2, 2) (1, 3) (2, 3) (3, 3) 1 1 1 1 2 1 1 1 1

Debemos insistir en que a nivel de manejo, poco importa que las matrices sean dispersas o no. Podemos ejecutar por ejemplo B(1,1)=3 o B(:,1)=[ 3 0 1] etc. Los comandos qr y eig no son v alidos para matrices disperas salvo que la matriz en cuesti on sea sim etrica y denida positiva. Si no es as , se debe convertir la matriz dispersa en llena mediante el comando full, por ejemplo eig(full(B)) S podemos ejecutar sin embargo eig((B+B)/2) Para la creaci on de matrices dispersas, tenemos, adem as del comando sparse, los comandos speye crea la identidad y la almacena como dispersa. spdiags crea matrices dispersas a partir de diagonales y extrae diagonales de una matriz dispersa. Para la creaci on de matrices disperas, el comando spdiags parece superuo, pues podemos ejecutar primero el comando diags y luego el comando sparse; el resultado nal ser a el mismo. Sin embargo spdiags tiene su raz on de ser. Tr atese de ejecutar sparse(diag(5*ones(1000,1),0)) 22

Probablemente, el comando diag(5*ones(1000,1)) no se pueda ejecutar por falta de memoria, y en caso de que se pueda ejecutar, probablemente los comandos spdiags(5*ones(1000,1),0,1000,1000); 5*speye(1000); lo ejecuten en menos tiempo. Veamos con un poco m as de detalle, el comando spdiags. Aunque tiene muchas formas de empleo, estudiaremos c omo crear matrices a traves de sus diagonales. Si B es una matriz llena con J las y q columnas, d un vector con menos de q componentes cuyos valores se encuentran entre M y N (con M J ) el comando A=spdiags(B,d,M,N) crear a una matriz dispersa M N cuyas d(i)- esima diagonal ser a la i- esima columna de B. Si las columas de B son constantes es bien sencillo. En caso contrario OJO, PORQUE LAS FILAS DE B PASAN A SER COLUMNAS DE A. Ejercicio 10. Construir las matrices del Ejercicio 9 sin utilizar el comando diags y utilizando spdiags. Ejercicio 11. Mediante el comando 100 10 0 B= 0 spdiags, construir la matriz 1 0 0 ... 0 200 2 0 ... 0 20 300 3 .. .. .. . . . 50 600 6 ... 0 0 60 700

Compru ebese el resultado con full(B) Otros comandos de inter es son spy dibuja en un gr aco los elementos no nulos de una matriz dispersa. sprank calcula el rango estructural sprand crea matrices dispersas con componentes aleatorias sprandsym crea matrices sim etricas dispersas con componentes aleatorias

2.8 Transformada r apida de Fourier (FFT)


La FFT es un algoritmo que permite obtener los coecientes del desarrollo de Fourier de una funci on (o una aproximaci on a los mismos) a bajo costo. Este hecho es la base de los m etodos para el tratamiento de se nales as como de los m etodos espectrales (de auge muy reciente) para la soluci on num erica de problemas de PDEs. Matlab tiene implementado el algoritmo de la FFT. Es bien conocido que los vectores wj = (1, wj , . . . , wj (N 1) )T , 23 j = 0, . . . N 1,

2i donde w = e N son ortogonales entre s , y que, divididos por N forman una base ortonormal de C N . El proceso seg un el cual dado un vector V de C N expresa sus coecientes en as la base dada por los wj se conoce como Transformada Discreta de Fourier (DFT). M concretamente, si V = (V1 , . . . , VN )T , tambi en V = donde j = V w 1 jV = N N
N 1 j =0

j w V j

Vl e
l=1

2i N (l1)j

j = 0, . . . , N 1.

(2)

La transformada discreta de Fourier es entonces la aplicaci on = (V 0 , . . . , V N 1 )T V [DFT]V = V N otese que , V = N [DFT]V esto es, que la inversa de la DFT consiste en conjugar, aplicar la DFT, volver a conjugar j en (2), parece que se requiren en y multiplicar por N . A la vista de la expresi on de V 2 . Se debe a J. W. Cooley y J. W. Tookey en 1965 principio N operaciones para calcular V un algoritmo, conocido como Transformada R apida de Fourier (FFT), que reduce el costo de la DFT a una cantidad del orden de N log(N ) operaciones (para N = 30, por ejemplo, N 2 = 900 y N log(N ) 102, y para N = 100, N 2 = 104 y N log(N ) 460). Matlab, ejecuta mediante el algortimo de la FFT, N [DFT] con el comando fft N 1 [DFT]1 con el comando ifft La relaci on de la DFT y el desarrollo en serie de Fourier de una funci on es como sigue. Sea v ( x) =
j

v j e

2i L jx

una funci on L-peri odica (la supondremos sucientemente regular) y llamemos vN a la restricci on de v a los N puntos xl = esto es vN = (v (x0 ), . . . , v (xN 1 ))T 24 l L, N l = 0, 1 . . . N 1,

La DFT de vN proporciona los coecientes v j del polinomio trigonom etrico IN (v )(x) =


N/21 j =N/2

v j e

2i L jx

(suponemos N par) que interpola a v en los nodos xl . N otese que los wj son las restricciones 2i a la red de nodos xl , l = 0, . . . N 1, de las funciones e L j , y es inmediato comprobar que m = 1, 2, . . . , (3) wj = wj mN , lo que permite dar sentido a los v j con j negativo v j = v j +N , N otese adem as que de (3) se deduce que v j = v j +
|m|>1

j = N/2, . . . 1.

u j +mN ,

(4)

esto es los coecientes v j del polinomio trigonom etrico interpolador IN (v ) son una aproximaci on a los correspondientes coecientes de Fourier v j . De hecho si v H s (0, L), de (4) se deduce que C |v j v j | s v H s m y C v IN (v ) H r sr v H s , 0 r s, m Este hecho se utiliza para aproximar las derivadas de una funci on mediante las derivadas de su polinomio trigonom etrico. N otese que los coecientes de Fourier v j pueden ser diciles de obtener, pero la FFT proporciona de manera eciente los coecientes aproximados v j , si se dispone de la expresi on de v o una manera de obtener su valor en los nodos xl . Esta es la base de los m etodos espectrales, que permiten obtener aproximaciones muy precisas a bajo costo de las soluciones de problemas de EDPs. Cuando las funciones son sucientemente regulares y la precisi on deseada es alta, son maniestamente m as ecientes que los m etodos tradicionales de diferencias nitas y de elementos nitos. La FFT es tambi en de amplio uso en el campo de tratamiento de se nales. OJO: el resultado del comando fft de Matlab sobre el vector (V1 , . . . , VN )T es el vector ( v0 , . . . v N 1 )T . Desde el punto de vista de la aproximaci on (supongamos Vl = v (xl ) para una funci on v ), j = V N j , conviene tenerlos ordenados de la forma dado que V N/2 , . . . V N/21 )T = (V N/2 , . . . , V N 1 , V 0 , . . . , VN/21 )T (V 25

esta permutaci on la ejecuta el comando fftshift Ejemplo Obtengamos una aproximaci on a los valores de una primitiva (de media cero) de la funci on sen(x2 ) log(1 + cos2 (x)) . v ( x) = 1 + etan(4x) Ejecutemos x=[0:pi/100:2*pi-pi/100]; y=sin(x.*x).*log(1+cos(x) 2)./(1+exp(tan(4*x))); y=fftshift(fft(x)); y=y./(i*[-length(y)/2:1:length(y)/2-1]); y=fftyshift(y); y(1)=0; y=real(ifft(y));

2.9 Interacci on con el sistema operativo


Desde la ventana de comandos de Matlab se pueden ejecutar comandos del sistema operativo (el MS DOS en un PC, el Unix en una estaci on de trabajo, etc) simplemente poniendo un signo de admiraci on antes del comando, por ejemplo !copy pepe.m pepa.m Los comandos cd y dir no necesitan ir precedidos del signo de admiraci on. Tambi en tenemos la posibilidad de guardar la memoria que est a utilizando Matlab en un momento dado con el comando save. Esto vuelca al chero matlab.mat todas las variables (con sus nombres respectivos) que tengamos en un momento dado). Ejecutando save fichero har a lo mismo salvo que volcar a la memoria en el hero fichero.mat. Podemos salir de Matlab con quit, volver a ejecutar Maltab, y con el comando load fichero volvemos a estar como antes de haber salido de Matlab. El comando load de Matlab tambi en lee tablas de n umeros escritas en ASCII. Esto es u til cuando para cargar en la memoria de Matlab resultados num ericos producidos por otros programas. Por ejemplo, un programa escrito en Fortran o C es m as r apido que Matlab, y adem as existe much simo m as software cient co en aquellos lenguajes (sobre todo en Fortran) que en Matlab. En 26

muchas situaciones uno utiliza programas de otros lenguajes pero despu es quiere realizar gr acos o procesar con comodidad los resultados. Matlab, con el comando load permite leer los resultados de esos otros programas siempre que se hayan volcado a un chero ASCII.

2.10 Programaci on
Matlab no s olo ejecuta sus comandos internos; tambi en ejecuta comandos escritos por nosotros mismos. Ello permite elaborar programas que, utilizando instrucciones de Matlab ejecuten tareas no contempladas en los comandos. Pero, OJO: Si una tarea se puede realizar con un comando interno de Matlab, este comando casi siempre ser a m as eciente y m as able que el que programemos nosotros. Hay dos razones para ello: 1 - La mayor parte de los comandos de Matlab est an en lenguaje m aquina, mucho m as r apido que la traducci on de los comandos del programa que escribamos nosotros. 2 - La elaboraci on de algoritmos es una tarea altamente profesional. Aunque las ideas matem aticas subyacentes a un algoritmo sean sencillas, existen muchos componentes, no s olo propios del An alisis Num erico, sino tambi en de las Ciencias de la Computaci on que inuyen en el resultado y la ecacia de un algoritmo. Existen casos en los que, o bien porque Matlab no dispone de comandos para una tarea determinada, o bien porque estos son inadecuados nos vemos en la obligaci on de elaborar un programa. Tambi en, hay veces que los algoritmos que ejecutan los comandos de Matlab son maniestamente mejorables. Por ejemplo, para la integraci on num erica de ODEs, Matlab dispone de los comandos ode23 y ode45. Ambos comandos ejecutan algoritmos basados en pares encajados de m etodos Runge-Kutta debidos a Fehlberg. Hoy d a los pares debidos a Dormand y Prince pueden llegar a ser hasta 20 o 40 veces m as ecientes que los de Fehlberg, y puede compensar en determinados casos programar por ejemplo el m etodo DOPRI8. En general, en todo lo referente al Algebra Lineal, es dif cil que un programa elaborado por nosotros supere a los comandos de Matlab. En otros campos, esta armaci on no est a tan clara. Existen dos tipos de programas que se pueden hacer en Matlab. 1 - Ficheros M o M-les 2 - Funciones. Un ejemplo de funci on lo hemos visto al estudiar los gr acos. La diferencia entre un M-le y una funci on es que en un M-le las variables son globales, mientras que en una funci on son internas. En la funci on de la p agina 14, las variables y, t y v desaparecen una vez calculada la varible f. En un M-le, en cambio, todas las variables que se creen al ejecutar el M-le permanecen. Si en Matlab tenemos una variable, por ejemplo x, y dentro de una funci on aparece una variable con el mismo nombre, esta no tiene nada que ver con la otra: si en la funci on se le asigna un valor, la variable original no cambia. En un M-le esto no ser a as : si en un M-le asignamos un valor a una variable y ya existe una variable con el mismo nombre, el valor de la existente cambia. Este es uno de los peligros de los M-les: se debe tener cuidado en que las variables que utiliza el M-le no coincidan en nombre con otras cuyo valor no queremos alterar. Es recomendable por tanto la programaci on de funciones sobre la de M-les. 27

El formato de una funci on es argsal = nombre(argent) donde argsal son los argumentos de salida, argent son los argumentos de entrada, y nombre es el nombre de la funci on. En la funci on de la p. 14, f es el argumento de salida, x es el argumento de entrada, y mifun es el nombre de la funci on (que debe coincidir, salvo la extensi on .m, con el nombre del chero de texto donde est a escrita). Si los argumentos de salida son m as de uno (como en el comando lu) deben ir entre corchetes y separados por comas. Para poder programar necesitamos saber c omo se hacen - ciclos for - ciclos while - bloques if - operaciones de relaci on Ejemplo de ciclo for. for k=1:N z(k)=sum(y(1:k); z(k)=log(z(k)) end Este ciclo coloca en la k - esima componente del vector z el logaritmo de la suma desde uno hasta k de las componentes de y y las muestra por pantalla a medida que se van creando (la tercera l nea no lleva el punto y coma al nal). N otese que la sintaxis es for rango expresiones y comandos end Ejemplo de ciclo while. El siguiente ciclo suma la serie arm onica; k=1; suma=1; sumav=0; while sumav < suma sumav=suma; k=k+1; suma=suma+1/k; end Vemos que la sintaxis es while expresi on expresiones y comandos end 28

Las expresiones y comandos internos del ciclo se ejecutar an mientras la expresi on de la l nea del while sea cierta. Ejemplos de bloques if. Un bloque if permite que se ejecuten unos comandos dependiendo de si el valor de una expresi on es cierto o no. Veamos los tres tipos que hay. Mostramos primero un bloque en el que si el valor de x es positivo, lo sustituye por su logaritmo. if x > 0 x=log(x); end En el siguiente ejemplo, se coloca en z el m odulo de x. if x > 0 z=x; else z=-x end En el siguiente ejemplo, se coloca en z el signo de x if x > 0 z=1; else if x < 0 z = 1;

else z=0 end

En un bloque if se pueden poner tantas lineas else if como queramos. Siempre un bloque if debe terminar con end. Los bloques if de este ejemplo s olo hacen lo que queremos que hagan si x es real. Modif quense para que no den lugar a resultados incorrectos si x es complejo. En los ejemplos anteriores hemos visto algunos operadores de relaci on; mayor y menor. La notaci on de los operadores de relaci on en Matlab es < menor. > mayor. <= menor o igual >= mayor o igual == igual = distinto. 29

Asimismo, desde el punto de vista l ogico, 0 es falso, cualquier cantidad distinta de 0 es cierto, yes negaci on. Ejec utense por ejemplo los comandos find([1 0 3 0 5 0]) [f,I]=find( [1 0 3 0 5 0]) Ya tenemos todos los elementos para programar (o entender programas) de Matlab. Mostramos a continuaci on un ejemplo de programa para aproximar la soluci on de la ecuaci on de la cal o ut = uxx con condiciones Dirichlet homog eneas en el intervalo [0, 1] y dato inicial dado. El programa ejecuta el m etodo de diferencias centrales integrado con el m etodo de Euler regresivo. Dado el vector inicial 0 0 T U 0 = (U1 , . . . UJ 1 )
0 donde cada Uj = u0 (jh) con u0 el dato inicial, y Jh = 1, el programa devolver a la aproximaci on N N T U N = (U1 , . . . UJ 1 )

al vector (u(x1 , T ), . . . , u(xJ 1 , T ))T , calculada mediante la recurrencia,


n1 n n n n Uj Uj Uj 1 2Uj + U j + 1 = t h2

, j = 1, . . . J 1,

n = 1, . . . n,

donde N t = T . function [U,hn]=lacalo(h,deltat,U0,T) % devuelve en U una aproximacion a la solucion de la ecuacion % del calor con condiciones homogeneas Dirichlet en [0,1] y % dato U0. % la aproximacion U se obtiene mediante discretizacion de % diferencias centrales integrada con el Euler Implicito. % hn es el diametro de red utilizado (distinto de h si 1/h % no es entero. J=length(U0); e=ones(J,1); % ajustamos h h=1/round(1/h); hn=h; % se calcula la matriz de diferencias D=spdiags([e -2*e e],[-1 0 1],J,J)/h/h; UP=speye(J)-deltat*D; % al ser una matriz tridiagonal, no se gana nada con % la descomposici on de Choleski. Utilizamos la LU [L,UP]=lu(UP); t=0; % convertimos U0 en un vector columna 30

v=size(U0); U=reshape(U0,v(1)*v(2),1); while t< T % ajustamos el ultimo paso por si acaso T/deltat no es entero if t+deltat > T deltat=T-t; UP=speye(J)-deltat*D; [L,UP]=lu(UP); end U=UP\(L\ U); t=t+deltat; end % devolvemos la solucion a su forma original U=reshape(U,v(1),v(2));

31

Das könnte Ihnen auch gefallen