curso_matlab

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´ afica 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 eficazmente (esto es, sin eternizarse) algoritmos extraordinariamente com- plejos (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 nomen- clatura 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, Mat- lab 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 Al- gebra 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. 1

Transcript of curso_matlab

  • Curso de Matlab

    por

    Bosco Garca Archilla

    1 Introduccion.Que es Matlab (alias Matrix Laboratory)? Es un entorno informatico de computacionnumerica y representacion grafica de facil manejo. Es entorno porque es a la vez unprograma interactivo y un lenguaje de programacion de muy alto nivel. Su caractersticafundamental es que su sintaxis es lo mas parecido a nuestra simbologa matematica habitualque la estupidez de un ordenador puede entender.1 No es un manipulador simbolico (aunque se le puede anadir uno). Nunca nosproporcianara por tanto la expresion de la derivada de una funcion o hallara losfactores de un polinomio.

    2 Ejecuta eficazmente (esto es, sin eternizarse) algoritmos extraordinariamente com-plejos (encontrar maximos y mnimos de funciones, desarrollos de Fourier, caculo deautovalores e inversion de matrices, solucion de sistemas de ecuaciones lineales y nolineales, solucion numerica de ODEs, etc) con instrucciones sencillas y de nomen-clatura mas o menos acorde con el sentido comun. Por ejemplo, la inversa de unamatriz A se obtiene con inv(A) o con A(-1), sus autovalores con eig(A) o su normacon norm(A). Estas instrucciones ponen en marcha la seleccion y ejecucion de unaserie de algoritmos de manejo engorroso de lo que hasta hace pocos anos ha sido lamejor coleccion de algoritmos de Algebra Lineal (Linpack y Eispack). Ademas, Mat-lab permite elaborar programas cortos y sencillos para tareas mas complejas comorepresentacion de mapas de fase de sistemas dinamicos, solucion numerica de PDEs oanalisis estadstico.

    3 Fue originariamente escrito por Cleve Moler, como ayuda para la ensenanza del Al-gebra Lineal. Las versiones actuales estan escritas por The Mathworks Inc, y hancrecido hasta convertirse en una herramienta profesional muy utilizada en algunoscampos de la Industria y la Ingeniera. En las universidades, principalmente en elcampo de la Matematica Aplicada, se esta convirtiendo en herramienta de uso comunentre muchos de sus investigadores.

    1

  • 2 Manejo Basico.

    2.1 Elementos de Matlab.

    El elemento basico de Matlab es la matriz rectangular de elementos reales o comple-jos (el otro elemento basico es, afortunadamente, el comando help). Los vectores fila ocolumna y los escalares son casos particulares. Las matrices se guardan en variables queMatlab mantiene hasta que se borren con el comando clear.

    Para introducir una matriz, se hace como si la escribiesemos 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 0 + 3.1416i2.0000 + 2.0000i 3.1416 1.0000

    que quedara guardada en memoria hasta que salgamos de Matlab con quit o ejecutemosclear A.Notemos que1 - Existen variables preasignadas como i que es la unidad imaginaria i =

    1, o comopi que es el valor pi de toda la vida (alias el area del crculo de radio 1); Tambien estanpreasignadas j que es i =

    1 y la variable eps que es la precision del ordenador enel que trabajemos (en un PC su valor es 252 2.22 1016). El valor de todas ellaslo podemos cambiar asignando valores a voluntad. Por ejemplo j=5.

    2 - Matlab, para comodidad nuestra, entiende la expresion 2i. En la asignacion de Apodamos haber puesto 2 + 2i en vez de 2 + 2 i. OJO, que esto solo es valido sii va a continuacion de una constante. Pruebese a escribir A-(real(A) + imag(A)i)y tambien A-(real(A) + imag(A)*i), y de paso aprendemos los comandos real eimag que proporcionan las partes real e imaginaria respectivamente de una variable.

    3 - Los elementos de una matriz A los podemos definir con expresiones como log(-1)2 + 2 i. En la correspondiente componente de A se guardara el valor numerico dedichas expresiones.

    4 - Al definir una matriz, es importante dejar espacios en blanco entre los distintos ele-mentos de una fila y no dejar espacios en blanco entre las diversas componentes deuna expresion que define un elemento. Si queremos dejar espacios en blanco para vermejor lo que escribimos o porque somos despistados, hay que separar los elementoscon comas, por ejemplo, para introducir el vector fila (1 + pi, 21/3, 2 2) podemospor ejemplo escribir

    v=[1 + pi, 2(1/3), 2 - sqrt(2)]

    Pruebelo para propio convencimiento.

    2

  • NO se nota pero debemos saber que1 - Matlab, para comodidad nuestra, solo muestra por pantalla aproximaciones con cuatro

    cifras decimales, pero trabaja internamente con 16 cifras significativas. Para cambiarel formato de salida se utilizan los comandos

    format long format long e format short format short e

    Ejecutese el comando format long y a continuacion tecleese A para ver el valor de A.Para mayor comodidad volver al formato estandar con el comando format short;

    2 - A los que son usuarios de lenguajes clasicos como Fortran, C, o Pascual, les sorpren-dera saber que Matlab almacena con cada variable su dimension y su caracter complejoo no. La dimension de una variable se obtiene con el comando size que produce unvector fila con las dimensiones de la variable (pruebese size(A) y size(v)). El co-mando length produce un escalar con la maxima dimension de la variable (pruebeselength(A) y length(v). Para ver todas las variables que hemos asignado se utiliza elcomando who, y para obtener mas informacion sobre ellas se utiliza whos (who+size).

    En Matlab tambien podemos ampliar las matrices orlandolas de igual manera quehacemos en la pizarra. Por ejemplo, ejecutese

    [real(A)

    v]

    que dara como resultado

    ans =

    1.0000 2.0000 02.0000 3.1416 1.00004.1416 1.2599 0.5858

    que efectivamente es la matriz formada con la parte real de A orlada con el vector v en laultima fila. Observemos tambien, que cuando ejecutamos un comando sin asignarlo a unavariable, 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 podamos haberobtenido con el comando

    [real(A);v]

    esto es, el punto y coma, al definir una matriz o vector, indica nueva fila. Esto permitedefinir vectores columna en una sola lnea de comandos. Por ejemplo, para definir el vectorw = (1, 2, 3, 4)T podemos utilizar

    w=[1; 2; 3; 4]

    3

  • produciendo

    w =1234

    Aprovechamos para senalar que, como en otros lenguajes de programacion, los ele-mentos 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 tambien se pueden asignar elementos que no esten en la matriz. Por ejemplo siejecutamos

    D(4,4)=1

    se produce el resultado

    D =

    1.0000 2.0000 0 02.0000 3.1416 1.0000 04.1416 1.2599 0.5858 0

    0 0 0 1.0000

    Notese que al haber hecho una asignacion, hemos ampliado la matriz D, no que la variableans contiene a la matriz orlada de D.

    Hemos visto como se mencionan los elementos de una matriz, y dijimos al principioque los vectores son un caso particular. Matlab, para comodidad nuestra, permite (cosapor otra parte natural) designar a los elementos de un vector con un solo ndice. Asdebemos escribir v(2) en lugar de v(1,2). De hecho,

    v(2) + D(4,4)

    produce

    ans =

    2.5929

    4

  • Ya sabemos pues como referirnos a los elementos de un vector o de una matriz. Sinembargo, y esta es una gran ventaja de Matlab, se dispone de notacion para referirnos alas columnas y filas de una matriz. Por ejemplo

    D(1,:)

    produce el resultado

    ans =

    1.0000 2.0000 0 0

    y

    D(:,1)

    produce

    ans =1.00002.00004.1416

    0

    Podemos pues orlar la matriz D con sus propias filas y columnas. Por ejemplo

    [D, D(:,1); D(1,:), 27]

    producira

    ans =1.0000 2.0000 0 0 1.00002.0000 3.1416 1.0000 0 2.00004.1416 1.2599 0.5858 0 4.1416

    0 0 0 1.0000 01.0000 2.0000 0 0 27

    Por ultimo, mostramos como referirnos a submatrices que no sean un elemento, una filao una columna. La clave esta en que en las componentes de una matriz podemos ponerun vector; el resultado sera las filas (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 02.0000 1.00004.1416 0.5858

    0 0

    y con

    D(I,:)

    se obtiene

    ans =

    1.0000 2.0000 0 02.0000 3.1416 1.0000 0

    Notese que no es necesario que el vector sea fila para nombrar columnas ni columna paranombrar filas: en el ultimo comando que hemos ejecutado, I es fila y lo hemos utilizado paranombrar filas. Tambien 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 03.1416 0

    Si las filas o columnas van seguidas, podemos utilizar rangos. Por ejemplo para referirnosa las tres primeras filas de la matriz D podemos escribir

    D(1:3,:)

    o

    D(1:3,1:4)

    obtniendose en ambos casos

    ans =

    1.0000 2.0000 0 02.0000 3.1416 1.0000 04.1416 1.2599 0.5858 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 fila) 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 =

    [D11 D12D21 D22

    ]

    como expresar en Matlab la matriz

    E =

    [D22 D21D12 D11

    ]?

    Ejercicio 2. Como escribir con dos lneas de comando la matriz F = (eij)1ij4 a partirde la matriz D = (dij)1ij4 de manera que eij = d4+1i,4+1j? Y con una sola lnea?

    2.2 Operaciones

    Si el elemento basico de Matlab son las matrices, las operaciones que contempla Matlab(salvo alguna excepcion) son siempre entre matrices. Por tanto las dimensiones debencuadrar. Hay dos excepciones importantes a esta regla. Una es la obvia de producto deuna matriz o vector por un escalar. La otra es que, para comodidad nuestra se permitesumar un escalar y un vector o matriz, por ejemplo 1+v, entendiendo que se suma a cadacomponente del vector o matriz el escalar en cuestion. Con la matriz A y el vector v quehemos introducido, no son posibles los productos vA ni Av, pero s AvT . Este ultimo seejecuta con el comando

    A*v

    OJO, que el apostrofe significa hermtico (transpuesto y conjugado). Esto es, cuando enMatlab escribimos v nos referimos a v = vT .. En el caso que nos ocupa v es real, luegopara obtener vT nos da lo mismo escribir v que conj(v) o conj(v) que es lo quedeberamos escribir para obterner vT en el caso en que v fuese complejo.

    7

  • La notacion de las operaciones elementales es la siguiente

    + suma y resta, multiplicacion exponenciacion (OJO: solo matrices cuadradas)

    \ / division. . ./ multipl., exponenciacion y div. componente a componente

    Mencion especial merece la division. Veamoslo con un ejemplo. Introduczamos la matrizC

    C =

    1 1 10 2 11 1 1

    ,

    mediante el comando

    C=[ 1 1 1; 0 2 1; -1 1 1]

    (notese la nueva forma mas comoda de introducir una matriz separando las filas por puntoy coma) e introduzcamos el vector y = (3, 3, 1)T

    y=[3 3 1]

    La solucion x del sistema Cx = y se obtiene mediante el comando

    x=C\y

    Esto es, \ es division por la izquierda. Notese que, con las variables introducidas hastaahora, tambien podemos ejecutar C\A

    La solucion z de zC = v se obtiene mediante el comando

    z=v/C

    Resumiendo: C\ equivale a multiplicar por la izquierda por C1 y /C equivale a multiplicarpor la derecha por C1, esto es

    x = C1y x=C\yz = vC1 z=v/C

    Los vectores x y z los podamos haber obtenido mediante los comandos

    x=inv(C)*y

    z=v*inv(C)

    8

  • ox=C(-1)*y

    z=v*C(-1)

    Notese que en el caso de escalares, la division por la izquierda y por la derecha produce elmismo resultado.IMPORTANTE: A efectos practicos, y en especial con matrices grandes (ya veremoscomo se obtienen) es siempre mejor utilizar / y \ que la potencia 1 o el comando inv.Se efectuan menos operaciones y el resultado, en general, es menos sensible a errores deredondeo.

    Las operaciones .*, ./ y . se efectuan entre matrices de igual dimension componente acomponente. 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

    Mencion especial merece la comoda excepcion de elevar una matriz componente a compo-nente a una constante, por ejemplo

    [1 2 3]. 2

    produce

    ans =

    1 4 9

    9

  • Por ultimo, tambien tenemos las siguientes funciones de matrices cuadradas.- expm exponencial matricial,- logm logaritmo matricial,- sqrtm raiz cuadrada matricial,

    que no deben confundirse con exp log y sqrt.

    Ejercicio 3. Reducir mediante operaciones elementales las matrices C y D a forma trian-gular superior con a lo sumo dos y tres lneas de comandos respectivamente.

    2.3 Funciones internas

    Ya hemos visto que, igual que otros lenguajes de programacion, Matlab posee fun-ciones internas como cos o log. Quiza la ventaja mas destacada sobre otros lenguajes deprogramacion es que Matlab permite evaluarlas sobre vectores o matrices (componente acomponente) con una sola instruccion. 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 funcion 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 COMANDOANULA LA SALIDA POR PANTALLA O ECO DEL DICHO COMANDO,lo cual es muy comodo cuando se trabaja con vectores o matrices grandes como en elpresente caso.

    Ejecicio 4. Buscar una particion x del intervalo [0, pi/2] mediante la cual al ejecutar elcomando

    plot(x,x.*sin(ones(size(x))./x))

    quede un grafico bonito de la funcion y = xsen(1/x) (el comando ones genera matricesde unos de dimension la especificada por sus argumentos, y el comando size produce lasdimensiones de su argumento).

    Los comandos para las funciones trigonometricas e hiperbolicas (senos, cosenos, arcossenos, cosenos hiperbolicos, argumentos y demas) son

    sin, cos, tan, asin, acos, atan, atan2, sinh, cosh, tanh, asinh,

    acosh, antanh

    Matlab dispone ademas de las siguientes funciones elementales

    10

  • abs valor absoluto o modulo 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 truncacion a enteros hacia 0,floor truncacion a enteros hacia ,floor truncacion a enteros hacia +,sign signo,rem resto de division con cociente entero,gcd MCD,lcm mcm,exp exponencial,log logaritmo natural,log10 logaritmo en base 10.

    Ademas Matlab dispone de las siguientes funciones especiales,bessel funciones de Bessel,beta la funcion Beta,gamma la funcion Gamma de Euler,rat aproximacion racional y por fraciones continuas,erf la funcion de error erf(x) = 2

    pi

    x e

    t2 dt.erfinv su inversa,ellipke integrales elpticas,ellipj funciones elpticas 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 exponen-ciales, 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 Graficos 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 seccionveremos

    - como dibujar mas graficas en un grafico,- como poner ttulo, e indicaciones en los ejes,- como poner texto dentro del dibujo,- como imprimir el dibujo y- como guardarlo para meterlo en un fichero TEXAparte 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 ejehorizontal o bien el vertical se representan en escala logartmica. Esto ultimo es utilcuando 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)

    Cual de los dos graficos es mas expresivo?

    En el ejercicio anterior, vemos que el comando figure crea una nueva grafica, o si yaexiste, pinta en la figura seleccionada. Ejecutese por ejemplo

    figure(1)

    title(evolucion del Real Madrid)

    o un ttulo a voluntad. Ya vemos pues como poner ttulo. Para poner las variables de losejes, se utilizan los comandos

    xlabel e ylabel

    Ejecutese por ejemplo.

    ylabel(goles/pesetas presupuesto)

    Si ahora quisiesemos pintar otra grafica junto a esta (por ejemplo la evolucion del Barca)para compararla, ya sabemos que el comando plot dibuja la nueva borrando la vieja. Parasobreimprimir en un grafico, debemos decirle a Matlab que queremos conservar el graficomediante el comando

    hold

    que mantiene el grafico hasta que se ejecute hold de nuevo que lo libera. Matlab, cada vezque se ejecuta hold nos indica si el grafico esta retenido (y por tanto sobreimprimiremos)respondiendo con el mensaje curren plot held, o si soltamos el grafico para empezaruno nuevo con el mensaje current plot released.

    Antes de dibujar la nueva grafica junto a la vieja, podemos plantearnos el cambiar detipo de linea. Los tipos de linea se representan con

    - (lnea continua, por defecto), eg. plot(x,y,-)-- (lnea discontinua), eg. plot(x,y,--): (lnea de puntos), eg. plot(x,y,:)-. (lnea de trazo y punto), eg. plot(x,y,-.)

    12

  • Tambien podemos cambiar el color de la lnea con las letras y de yellow, c de cian,r de red, m de magenta, g de enviromentalist y algunas mas. Por ejemplo

    plot(x,y,r:)

    dibujara y(x) en lnea de puntos en color rojo.

    Ejercicio 6. Dibujar, junto a la grafica del Real Madrid (o la que se haya dibujado antes)la del Barca (o la que apetezca).

    Tambien se pueden dibujar los vectores con smbolos en vez de con lneas Estos son* (asteriscos), eg. plot(x,y,*)+ (cruces), eg. plot(x,y,+)x (aspas), eg. plot(x,y,x)o (crculos), eg. plot(x,y,o) que tambien se pueden acompanar de las letraspara cambiar el colorn.Para poner texto en el grafico se utiliza el comando gtext, cuya sintaxis es

    gtext(texto que queramos poner)

    Al ejecutar el comando, la posicion en la pantalla del raton cambia de icono, en espera deque apretemos el boton del raton, sobre el grafico, en cuya locaclizacion escribira el texto.

    Ejercicio 7. Marcar con simbolitos los puntos de las graficas que corresponden a Copasde Europa, de la UEFA y esas cosas, y con gtext poner al lado los anos correspondientes(si no caben todos los trofeos de tan grandes y afamados equipos, poner solo unos pocos).

    Por ultimo, para imprimir, si tenemos acceso a una impresora, basta ejecutar el co-mando

    print

    En caso contrario, debemos ejecutar print con alguna opcion y anadiendo el nombre deun fichero para que el grafico se vuelque a dicho fichero en el formato que le decimos conopcion. Por ejemplo,

    print -deps dibujo.ps

    guardara en el fichero dibujo.ps el dibujo (en nuestro caso el churro que hemos hechocon el Madrid y el Barca) en formato PostScript encapsulado, que es el adecuado parainsertarlo en los ficheros de TEX. Veanse las diversas opciones ejecutando help print.Vease tambien el comando

    axis

    para cambiar los ejes del grafico.Otros comandos para realizar graficos mas particulares son los siguientes.bar grafico de barras,compass grafico de modulos y argumentos de numeros complejos dibujado como flechasque salen del origen,feather version diferente de compass,

    13

  • fplot evalua una funcion y dibuja el resultado,

    polar grafico en coordenadas polarers,

    quiver grafico de un campo de vectores,

    fill dibuja polgonos y los rellena de colorines.

    FPLOT Hemos visto la tecnica para representar una funcion con el comando plot.Tambien hemos visto que funciones del tipo sen(1/x) son difciles de representar ade-cuadamente con esta tecnica. El comando fplot busca automaticamente una red en laque la funcion se representa mas fielmente. Admite dos argumentos opcionales: uno esel color y tipo de lnea, por ejemplo g-- para que dibuje la funcion en verde y lneadiscontinua; El otro argumento es una tolerancia sobre el diametro inferior de la red (pordefecto Matlab utiliza TOL=2e-3. Por ejemplo, ejecutense los comandos

    fplot(sin(1./x),[0 pi])

    fplot(sin(1./x),[0 pi],4e-4)

    Notese que la funcion a representar debe ir entre apostrofos. En ocasiones no es facil(o es completamente imposible) dar una expresion analtica de la funcion que se quiererepresentar. En tal caso podemos escribir aparte un programa funcion que con comandosde Matlab evalue la funcion en cuestion. Veamos un ejemplo. Supongamos que queremosrepresentar la funcion

    f(x) =

    x0

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

    1 + x2

    ).

    en el intervalo [0, 1]. Tenemos que escribir un programa que evalue dicha funcion. Porejemplo en un fichero de nombre mifun.m (sin la extension .m si estamos en un MacIntosh)con el siguiente contenido

    function f=mifun(x)

    % evalua una funcion 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 como se ponen comentarios en un programa de Matlab con %, y dos nuevoscomandos sum que suma las componentes de un vector o las filas de una matriz, y reshapeque cambia las dimensiones de una matriz). Para representar la funcion bastara ejecutar

    fplot(mifun,[0,1])

    Para graficos en tres dimensiones, veanse con help los comandos meshgrid, mesh,contour, surf.

    2.5 Algebra Lineal

    Matlab dispone de una serie de comandos para- la reduccion mediante operaciones elementales de una matriz a forma triangular su-perior.

    - calculo de autovalores y autovectores.- Ortogonalizacion de columnas de una matriz.- Calculo de normas lp de vectores y las correspondientes normas de operadores paralos casos p = 1, 2,.Veamos estos comandos con algunos ejemplos. Consideremos la matriz

    A =

    1 1 12 4 52 2 3

    ,

    e introduzcamosla 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 descomposicion de la forma

    A = PTLU,

    donde P es una matriz de permutacion, L es triangular inferior con unos en la diagonal yU es triangular superior. De hecho

    P =

    0 1 01 0 00 0 1

    , L =

    1 0 01/2 1 0

    1 2/3 1

    , U =

    2 4 50 3 7/20 0 1/3

    Esta descomposicion se obtiene en Matlab con el comando lu. Ejecutando

    [L,U]=lu(A)

    15

  • se obtienen los factores PTL y U en la respuesta

    L =0.5000 1.0000 01.0000 0 01.0000 0.6667 1.0000

    U =

    2.0000 4.0000 5.00000 3.0000 3.50000 0 0.3333

    (recuerdese que las cifras de esta salida son un redondeo a cuatro decimales de numeroscon diecieseis cifras significativas). Si queremos obterner P , L y U debemos ejecutar

    [L,U,P]=lu(A)

    La matriz L as obtenida es realmente triangular inferior.Notese 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) habra que ejecutar

    x=U\(L\(P*y))

    siendo importante colocar correctamente los parentesis (por que?).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 sistemascon la misma matriz cuyos segundos miembros no se conozcan a priori (vease ejemplo enp. 30). La razon es que Matlab analiza primero la matriz para elegir la mejor manera deresolver el sistema. Por ejemplo, si A es simetrica y definida positiva, con [L,U]=lu(A)y x=U\(L\y) se hacen aproximadamente el doble de operaciones que con x=A\y puestoque Matlab utiliza en este caso una variante de la descomposicion de Cholesky (comandochol). En cualquier caso, Matlab al resolver x=A\y siempre efectua alguna variante de ladescomposicion LU

    Veamos ahora la descomposicion espectral. La matriz A que nos ocupa satisface

    A = V DV 1

    donde

    D =

    1 0 00 2 00 0 1

    , V =

    1 1 01 1 11 0 1

    . (1)

    Podemos obtener un vector con los autovalores de A ejecutando

    eig(A)

    16

  • con el resultado

    ans =1.0000

    1.00002.0000

    Si deseamos obtener tambien los autovectores, esto se hace con el comando

    [V,D]=eig(A)

    cuyo resultado es

    V =0.5774 0.0000 0.70710.5774 0.7071 0.70710.5774 0.7071 0.0000

    D =

    1.0000 0 00 1.0000 00 0 2.0000

    que, salvo el orden y la normalizacion de las columnas de V , es la misma descomposicionespectral que en (1). Si ahora ejecutamos el comando

    A*V-V*D

    la matriz resultante tiene sus elementos menores que 1015: Los autovalores y autovectoreslos ha calculado con un error del orden de la precision de la maquina.

    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.70710.0000 + 0.5774i 0.0000 0.5774i 0.70710.0000 + 0.5774i 0.0000 0.5774i 0.0000

    D1 =

    1.0000 + 0.0000i 0 00 1.0000 0.0000i 00 0 2.0000

    17

  • y si efectuamos

    C*V1 - V1*D1

    el resultado es de nuevo una matriz con elementos de tamano menor que 1015. Esteejemplo sirve para recordar que1 - Matlab no es un manipulador simbolico, y que2 - a efectos practicos, las matrices no diagonalizables no existen,ya que las matrices diagonalizables forman un conjunto denso en el espacio de las matricesdel orden correspondiente. Notemos sin embargo que la matriz V 1 tiene aparentememtedos columnas iguales (de hecho su distancia es del orden de 108). Si calculamos el numerode condicion de V 1 (V 1V 11) mediante el comandocond(V1)

    se obtiene la respuesta

    ans =

    9.8199e+007

    mientras que el numero de condicion de V es aproximadamente 6.7807. Ello nos indicaque V 1, aun siendo invertible esta proxima a ser una matriz singular.

    Los diversos algoritmos para el calculo de autovectores y autovalores estan basadosen la iteracion QR, basados a su vez en la descomposicion QR u ortogonal de una matrizque a continuacion tratamos.

    Dada una matriz A m n existen una matriz Q de dimension mm y ortogonal (ounitaria si A es compleja) esto es, QQ = I, y una matriz R de dimension nn triangularsuperior y con rg(R) = rg(A) tales que

    A = QR.

    Esto es el teorema de ortogonalizacion de Gram-Schmidt completado con un complementoortogonal de Im(A). La descomposicion QR de una matriz se obtiene mediante el comandoqr. Si ejecutamos

    [Q,R]=qr(A)

    se obtiene la respuesta.

    Q =

    0.3333 0.8085 0.48510.6667 0.5659 0.48510.6667 0.1617 0.7276

    R =

    3.0000 3.6667 5.00000 2.7487 3.15300 0 0.2425

    18

  • 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 descomposicion QR de una matriz que ejecuta Matlab noes el de la ortogonalizacion de Gram-Schmidt que aprendemos en los cursos de AlgebraLineal. Este suele ser bastante sensible a errores de redondeo. Salvo en el caso de matricesdispersas, en el que se utilizan generalmente las rotaciones de Givens, el procedimientohabitual para encontrar la descomposicion QR consiste en ir haciendo ceros en la matriz Amediante transformaciones de Householder

    I 2vv

    vv

    tambien conocidas como reflexiones 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 casocontrario).

    Ejercicio 8. Mediante el comando rand construya una matriz de orden 6 y halle sudescomposicion QR utilizando transformaciones de Householder. Evtense las operacionesinnecesarias.

    Para la descomposicion en valores singulares Matlab dispone del comando (que otronombre poda tener) svd. Dada una matriz A m n existen matrices V m m y Qn n ortogonales (o unitarias si A es compleja) y una matriz D m n diagonal (susunicos elementos posiblemente no nulos son de la forma dii) de elementos positivos y conrg(D) = rg(A) tal que

    A = V DQ

    (los elementos de D son las races cuadradas de los autovalores de AA). Pruebese elcomando

    [V,D,Q]=svd(A)

    Para el calulo de normas Matlab dispone del comando norm (ejecutese help norm).Teminamos esta seccion con un listado de comandos relativos al tema.lu descomposicion LUqr descomposicion QRsvd descomposicion en valores singulares.cond proporciona el numero de condicion (en la norma 2 de operadores) de una matriz.norm calcula normas (por defecto la eucldea 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 numero de condicion.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 descomposicion QR).null proporciona una base ortonormal del nucleo de una matriz (utiliza la descom-posicion QR).poly produce un vector con los coeficientes del polinomio caracterstico de una matriz(vease tambien polyval)

    2.6 Construccion de matrices gordas

    Hemos visto como generar matrices y vectores introduciendo sus componentes. Tam-bien 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 tambien como 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 . . . 01 2 1

    . . .. . .

    . . .

    1 2 10 . . . 0 1 2

    2.7 Matrices dispersas

    Se entiende por matriz dispersa aquella en la que la proporcion de elementos no nuloses pequena, por ejemplo las del ejercicio anterior. Las matrices dispersas surgen confrecuencia en la practica. Un caso tpico son las matrices que se obtienen al discretizar pordiferencias finitas o elementos finitos ecuaciones en derivadas parciales.

    Numericamente, tienen tratamiento distinto de las matrices llenas. De entrada solose almacenan los elementos no nulos (en los lenguajes clasicos como Fortran o C en un

    20

  • vector largo, junto con dos vectores de enteros que indican la fila y la columna del elementocorrespondiente del vector largo). Cuando se opera con ellas, solo se utilizan los elementosno nulos. Hay tecnicas numericas especficas para resolver sistemas lineales cuya matriz decoeficientes es dispersa. Su costo operativo, en lugar de crecer como la dimension al cubo(como en las matrices llenas) crece de manera mucho mas moderada (en muchos casoslinealmente con la dimension).

    Matlab, a partir de la version 4.0, contempla el caso particular de matrices dispersas.El comando lu, por ejemplo, actua sobre matrices dispersas eligiendo rutinas internasespecficas para este tipo de matrices. Tambien tiene algunos comandos especiales paraestas matrices.

    Para Matlab, una matriz dispersa es una forma distinta de almacenamiento, o lo quees lo mismo, un nuevo tipo de variable distinto. Ejecutese por ejemplo

    A=[1 0 -1; 0 1 1; 1 0 1]

    B=sparse(A)

    La respuesta al segundo comando es

    B =

    (1, 1) 1(3, 1) 1(2, 2) 1(1, 3) 1(2, 3) 1(3, 3) 1

    Notese que los unicos elementos almacenados son los no nulos. Junto con cada elemento,se almacena el par con la fila y la columna de la matriz a que corresponde. Las matrices Ay 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 tipode variable fuese la misma. Si ejecutamos

    A-B

    el resultado es

    ans =

    0 0 00 0 00 0 0

    Todo lo que se ha explicado de manejo y operaciones con matrices es valido para matricesdispersas, siguiendo la filosofa de que simplemente es un tipo de almacenamiento diferente.A nivel de usuario, no nos interesa como se almacena una matriz, sino simplemente sies dispersa o no (para saber que ciertos procesos como la factorizacion LU la suma, la

    21

  • multiplicacion, etc, requeriran menos tiempo de computacion o mas. Por ejemplo, podemosefectuar la descomposicion LU de B

    [L,U]=lu(B)

    con respuesta

    L =(1, 1) 1(3, 1) 1(2, 2) 1(3, 3) 1

    U =

    (1, 1) 1(2, 2) 1(1, 3) 1(2, 3) 1(3, 3) 2

    Debemos insistir en que a nivel de manejo, poco importa que las matrices sean dispersaso no. Podemos ejecutar por ejemplo

    B(1,1)=3

    o

    B(:,1)=[ 3 0 1]

    etc. Los comandos qr y eig no son validos para matrices disperas salvo que la matriz encuestion sea simetrica y definida positiva. Si no es as, se debe convertir la matriz dispersaen llena mediante el comando full, por ejemplo

    eig(full(B))

    S podemos ejecutar sin embargo

    eig((B+B)/2)

    Para la creacion de matrices dispersas, tenemos, ademas del comando sparse, loscomandos

    speye crea la identidad y la almacena como dispersa.spdiags crea matrices dispersas a partir de diagonales y extrae diagonales de unamatriz dispersa.Para la creacion de matrices disperas, el comando spdiags parece superfluo, pues

    podemos ejecutar primero el comando diags y luego el comando sparse; el resultado finalsera el mismo. Sin embargo spdiags tiene su razon de ser. Tratese de ejecutar

    sparse(diag(5*ones(1000,1),0))

    22

  • Probablemente, el comando diag(5*ones(1000,1)) no se pueda ejecutar por falta dememoria, 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 mas de detalle, el comando spdiags. Aunque tiene muchas

    formas de empleo, estudiaremos como crear matrices a traves de sus diagonales. Si B esuna matriz llena con J filas y q columnas, d un vector con menos de q componentes cuyosvalores se encuentran entre M y N (con M J) el comando

    A=spdiags(B,d,M,N)

    creara una matriz dispersa M N cuyas d(i)-esima diagonal sera la i-esima columna de B.Si las columas de B son constantes es bien sencillo. En caso contrario OJO, PORQUELAS FILAS DE B PASAN A SER COLUMNAS DE A.

    Ejercicio 10. Construir las matrices del Ejercicio 9 sin utilizar el comando diags yutilizando spdiags.

    Ejercicio 11. Mediante el comando spdiags, construir la matriz

    B =

    100 1 0 0 . . . 010 200 2 0 . . . 00 20 300 3

    . . .. . .

    . . .

    50 600 60 . . . 0 0 60 700

    Compruebese el resultado con full(B)

    Otros comandos de interes son- spy dibuja en un grafico los elementos no nulos de una matriz dispersa.- sprank calcula el rango estructural- sprand crea matrices dispersas con componentes aleatorias- sprandsym crea matrices simetricas dispersas con componentes aleatorias

    2.8 Transformada rapida de Fourier (FFT)

    La FFT es un algoritmo que permite obtener los coeficientes del desarrollo de Fourierde una funcion (o una aproximacion a los mismos) a bajo costo. Este hecho es la base de losmetodos para el tratamiento de senales as como de los metodos espectrales (de auge muyreciente) para la solucion numerica de problemas de PDEs. Matlab tiene implementado elalgoritmo de la FFT.

    Es bien conocido que los vectores

    wj = (1, wj, . . . , wj(N1))T , j = 0, . . .N 1,

    23

  • donde w = e2pii

    N son ortogonales entre s, y que, divididos porN forman una base ortonor-

    mal de CN . El proceso segun el cual dado un vector V de CN expresa sus coeficientes enla base dada por los wj se conoce como Transformada Discreta de Fourier (DFT). Masconcretamente, si

    V = (V1, . . . , VN )T ,

    tambien

    V =N1j=0

    Vjwj

    donde

    Vj =wjVN

    =1

    N

    Nl=1

    Vle 2pii

    N(l1)j , j = 0, . . . , N 1. (2)

    La transformada discreta de Fourier es entonces la aplicacion

    V 7 [DFT]V = V = (V0, . . . , VN1)T

    Notese que

    V = N [DFT]V ,

    esto es, que la inversa de la DFT consiste en conjugar, aplicar la DFT, volver a conjugary multiplicar por N . A la vista de la expresion de Vj en (2), parece que se requiren en

    principio N2 operaciones para calcular V . Se debe a J. W. Cooley y J. W. Tookey en 1965un algoritmo, conocido como Transformada Rapida de Fourier (FFT), que reduce el costode la DFT a una cantidad del orden de N log(N) operaciones (para N = 30, por ejemplo,N2 = 900 y N log(N) 102, y para N = 100, N2 = 104 y N log(N) 460).

    Matlab, ejecuta mediante el algortimo de la FFT,

    N [DFT] con el comando fft

    N1[DFT]1 con el comando ifft

    La relacion de la DFT y el desarrollo en serie de Fourier de una funcion es como sigue.Sea

    v(x) =j

    vje2pii

    Ljx

    una funcion L-periodica (la supondremos suficientemente regular) y llamemos vN a larestriccion de v a los N puntos

    xl =l

    NL, l = 0, 1 . . .N 1,

    esto es

    vN = (v(x0), . . . , v(xN1))T

    24

  • La DFT de vN proporciona los coeficientes vj del polinomio trigonometrico

    IN (v)(x) =

    N/21j=N/2

    vje2pii

    Ljx

    (suponemos N par) que interpola a v en los nodos xl. Notese que los wj son las restricciones

    a la red de nodos xl, l = 0, . . .N 1, de las funciones e 2piiL j, y es inmediato comprobarque

    wj = wjmN , m = 1, 2, . . . , (3)

    lo que permite dar sentido a los vj con j negativo

    vj = vj+N , j = N/2, . . . 1.Notese ademas que de (3) se deduce que

    vj = vj +|m|>1

    uj+mN , (4)

    esto es los coeficientes vj del polinomio trigonometrico interpolador IN (v) son una aprox-imacion a los correspondientes coeficientes de Fourier vj . De hecho si v Hs(0, L), de (4)se deduce que

    |vj vj | Cms

    vHsy

    v IN (v)Hr C

    msrvHs , 0 r s,

    Este hecho se utiliza para aproximar las derivadas de una funcion mediante las derivadas desu polinomio trigonometrico. Notese que los coeficientes de Fourier vj pueden ser dificilesde obtener, pero la FFT proporciona de manera eficiente los coeficientes aproximados vj , sise dispone de la expresion de v o una manera de obtener su valor en los nodos xl. Esta es labase de los metodos espectrales, que permiten obtener aproximaciones muy precisas a bajocosto de las soluciones de problemas de EDPs. Cuando las funciones son suficientementeregulares y la precision deseada es alta, son manifiestamente mas eficientes que los metodostradicionales de diferencias finitas y de elementos finitos. La FFT es tambien de ampliouso en el campo de tratamiento de senales.OJO: el resultado del comando fft de Matlab sobre el vector

    (V1, . . . , VN )T

    es el vector(v0, . . . vN1)T .

    Desde el punto de vista de la aproximacion (supongamos Vl = v(xl) para una funcion v),dado que Vj = VNj , conviene tenerlos ordenados de la forma

    (VN/2, . . . VN/21)T = (VN/2, . . . , VN1, V0, . . . , VN/21)T

    25

  • esta permutacion la ejecuta el comando

    fftshift

    Ejemplo Obtengamos una aproximacion a los valores de una primitiva (de media cero)de la funcion

    v(x) =sen(x2) log(1 + cos2(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 Interaccion con el sistema operativo

    Desde la ventana de comandos de Matlab se pueden ejecutar comandos del sistemaoperativo (el MS DOS en un PC, el Unix en una estacion de trabajo, etc) simplementeponiendo un signo de admiracion antes del comando, por ejemplo

    !copy pepe.m pepa.m

    Los comandos cd y dir no necesitan ir precedidos del signo de admiracion. Tambientenemos la posibilidad de guardar la memoria que esta utilizando Matlab en un momentodado con el comando save. Esto vuelca al fichero matlab.mat todas las variables (con susnombres respectivos) que tengamos en un momento dado). Ejecutando

    save fichero

    hara lo mismo salvo que volcara la memoria en el fihero fichero.mat. Podemos salir deMatlab 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 Matlabtambien lee tablas de numeros escritas en ASCII. Esto es util cuando para cargar en lamemoria de Matlab resultados numericos producidos por otros programas. Por ejemplo,un programa escrito en Fortran o C es mas rapido que Matlab, y ademas existe muchsimomas software cientfico en aquellos lenguajes (sobre todo en Fortran) que en Matlab. En

    26

  • muchas situaciones uno utiliza programas de otros lenguajes pero despues quiere realizargraficos o procesar con comodidad los resultados. Matlab, con el comando load permiteleer los resultados de esos otros programas siempre que se hayan volcado a un ficheroASCII.

    2.10 ProgramacionMatlab no solo ejecuta sus comandos internos; tambien ejecuta comandos escritos por

    nosotros mismos. Ello permite elaborar programas que, utilizando instrucciones de Matlabejecuten tareas no contempladas en los comandos. Pero,

    OJO: Si una tarea se puede realizar con un comando interno de Matlab, este comandocasi siempre sera mas eficiente y mas fiable que el que programemos nosotros. Hay dosrazones para ello:

    1 - La mayor parte de los comandos de Matlab estan en lenguaje maquina, mucho masrapido que la traduccion de los comandos del programa que escribamos nosotros.

    2 - La elaboracion de algoritmos es una tarea altamente profesional. Aunque las ideasmatematicas subyacentes a un algoritmo sean sencillas, existen muchos componentes,no solo propios del Analisis Numerico, sino tambien de las Ciencias de la Computacionque influyen en el resultado y la eficacia de un algoritmo.

    Existen casos en los que, o bien porque Matlab no dispone de comandos para unatarea determinada, o bien porque estos son inadecuados nos vemos en la obligacion deelaborar un programa. Tambien, hay veces que los algoritmos que ejecutan los comandosde Matlab son manifiestamente mejorables. Por ejemplo, para la integracion numericade ODEs, Matlab dispone de los comandos ode23 y ode45. Ambos comandos ejecutanalgoritmos basados en pares encajados de metodos Runge-Kutta debidos a Fehlberg. Hoyda los pares debidos a Dormand y Prince pueden llegar a ser hasta 20 o 40 veces maseficientes que los de Fehlberg, y puede compensar en determinados casos programar porejemplo el metodo DOPRI8. En general, en todo lo referente al Algebra Lineal, es difcilque un programa elaborado por nosotros supere a los comandos de Matlab. En otroscampos, esta afirmacion no esta tan clara.

    Existen dos tipos de programas que se pueden hacer en Matlab.

    1 - Ficheros M o M-files

    2 - Funciones.

    Un ejemplo de funcion lo hemos visto al estudiar los graficos. La diferencia entre unM-file y una funcion es que en un M-file las variables son globales, mientras que en unafuncion son internas. En la funcion de la pagina 14, las variables y, t y v desaparecenuna vez calculada la varible f. En un M-file, en cambio, todas las variables que se creenal ejecutar el M-file permanecen. Si en Matlab tenemos una variable, por ejemplo x, ydentro de una funcion aparece una variable con el mismo nombre, esta no tiene nada quever con la otra: si en la funcion se le asigna un valor, la variable original no cambia. Enun M-file esto no sera as: si en un M-file asignamos un valor a una variable y ya existeuna variable con el mismo nombre, el valor de la existente cambia. Este es uno de lospeligros de los M-files: se debe tener cuidado en que las variables que utiliza el M-file nocoincidan en nombre con otras cuyo valor no queremos alterar. Es recomendable por tantola programacion de funciones sobre la de M-files.

    27

  • El formato de una funcion es

    argsal = nombre(argent)

    donde argsal son los argumentos de salida, argent son los argumentos de entrada, ynombre es el nombre de la funcion. En la funcion de la p. 14, f es el argumento de salida,x es el argumento de entrada, y mifun es el nombre de la funcion (que debe coincidir, salvola extension .m, con el nombre del fichero de texto donde esta escrita). Si los argumentosde salida son mas de uno (como en el comando lu) deben ir entre corchetes y separadospor comas.

    Para poder programar necesitamos saber como se hacen- ciclos for- ciclos while- bloques if- operaciones de relacion

    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 unohasta k de las componentes de y y las muestra por pantalla a medida que se van creando(la tercera lnea no lleva el punto y coma al final). Notese que la sintaxis es

    for rango

    expresiones y comandos

    end

    Ejemplo de ciclo while. El siguiente ciclo suma la serie armonica;

    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 expresion

    expresiones y comandos

    end

    28

  • Las expresiones y comandos internos del ciclo se ejecutaran mientras la expresion de lalnea del while sea cierta.Ejemplos de bloques if. Un bloque if permite que se ejecuten unos comandos depen-diendo de si el valor de una expresion 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 sulogaritmo.

    if x > 0

    x=log(x);

    end

    En el siguiente ejemplo, se coloca en z el modulo 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 bloqueif debe terminar con end. Los bloques if de este ejemplo solo hacen lo que queremos quehagan si x es real. Modifquense para que no den lugar a resultados incorrectos si x escomplejo.

    En los ejemplos anteriores hemos visto algunos operadores de relacion; mayor y menor.La notacion de los operadores de relacion en Matlab es

    < menor.> mayor.= mayor o igual== igual= distinto.

    29

  • Asimismo, desde el punto de vista logico, 0 es falso, cualquier cantidad distinta de 0es cierto, yes negacion. Ejecutense 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 Mat-lab. Mostramos a continuacion un ejemplo de programa para aproximar la solucion de laecuacion de la calo

    ut = uxx

    con condiciones Dirichlet homogeneas en el intervalo [0, 1] y dato inicial dado. El programaejecuta el metodo de diferencias centrales integrado con el metodo de Euler regresivo. Dadoel vector inicial

    U0 = (U01 , . . .U0J1)

    T

    donde cada U0j = u0(jh) con u0 el dato inicial, y Jh = 1, el programa devolvera laaproximacion

    UN = (UN1 , . . .UNJ1)

    T

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

    Unj Un1jt

    =Unj1 2Unj + Unj + 1

    h2, j = 1, . . . J 1, n = 1, . . . n,

    donde Nt = 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 descomposicion 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