Matlab Para Novatos

Embed Size (px)

Citation preview

  • MATLAB para novatos 1

    Tabla de contenido 1. Introduccin.........................................................................................................3

    1.1 MATLAB por primera vez ...........................................................................4 1.2 Uso elemental de MATLAB.........................................................................5 1.3 La ayuda en MATLAB ................................................................................7 1.4 Definicin de Variables................................................................................8 1.5 Exhibicin de resultados ..............................................................................9 1.6 Guardar el trabajo ......................................................................................10 1.7 Ejercicios ...................................................................................................10

    2 Arreglos y matrices............................................................................................11 2.1 Construir arreglos de nmeros....................................................................12 2.2 Acceder a los nmeros en los arreglos ........................................................18 2.3 Operaciones con matrices...........................................................................21 2.4 Operaciones con arreglos ...........................................................................24 2.5 Ejercicios ...................................................................................................27

    3 Programas (scripts) y funciones .........................................................................29 3.1 Scripts ........................................................................................................29 3.2 Functions ...................................................................................................30 3.3 Trabajar con y mejorar scripts ....................................................................31 3.4 Funciones de funciones ..............................................................................33 3.5 Ejercicios ...................................................................................................36

    4 Control de flujo de programa .............................................................................37 4.1 Ejemplos ....................................................................................................37 4.2 Ejercicios ...................................................................................................38

    5 Mtodos numricos............................................................................................43 5.1 Mnimos cuadrados, modelo lineal. ............................................................43 5.2 Promedio y desviacin estndar activo .......................................................47 5.3 Algoritmo simplex .....................................................................................48 5.4 Mtodo indirecto de solucin de ecuaciones simultneas............................51 5.5 Races de polinomios (Mtodo de Laguerre) ..............................................53 5.6 Runge Kutta...............................................................................................56 5.7 Descomposicin de LU ..............................................................................59 5.8 Interpolacin suave (splines) ......................................................................62

    6 Grficos.............................................................................................................65 6.1 Dos dimensiones ........................................................................................65 6.2 Tres dimensiones .......................................................................................68 6.3 Guardar imgenes ......................................................................................69 6.4 Ejercicios ...................................................................................................69

    7 Prcticas de buena programacin .......................................................................71 7.1 Favorecer vectores en lugar de bucles.........................................................71 7.2 Evitar que los arreglos crezcan mientras se corre el programa. ...................72 7.3 Escribir MEX-File cuando los bucles son inevitables .................................72 7.4 Otras consideraciones.................................................................................73

    8 GUIs..................................................................................................................76 8.1 Ejemplo de script para FFT ........................................................................76 8.2 Ejemplo de function para FFT ....................................................................77

  • MATLAB para novatos 2

    8.3 Ejemplo de GUI para FFT..........................................................................77 8.4 Pasarlo a ejecutable ....................................................................................80

    9 Conexin con C .................................................................................................81 10 Simulink ........................................................................................................85

    10.1 Simulink para resolver ecuaciones algebraicas. ..........................................85 10.2 Simulink para resolver ecuaciones diferenciales .........................................87 10.3 Simulink para sistemas de ecuaciones ........................................................88

    11 SimMechanics ...............................................................................................91

  • MATLAB para novatos 3

    MATLAB para novatos

    Rafael Quintero Torres*

    2010 Como resultado de que el alfabetismo en MATLAB en las universidades contina siendo muy bajo y de que la necesidad de emplear las buenas herramientas de cmputo matemtico de manera mas extendida esta presente, es que emprendemos la construccin de este material. El material aqu contenido esta pensado para estudiantes que desconocen MATLAB, pero que les gustara introducirse en el de manera autodidctica. Tambin puede ser de utilidad para estudiantes de computacin y mtodos numricos ya que los ejemplos y el inters principal es en el control de las acciones de la maquina por medio de la sintaxis de MATLAB. Suponemos que existe un genuino inters o una necesidad en introducirse en esta temtica, que se tiene un conocimiento bsico de algebra y que se aceptan los retos con singular alegra.

    1. Introduccin MATLAB es un software para computacin en ingeniera y ciencias. Nos ofrece un poderoso lenguaje de programacin, posibilidad de realizar y manipular grficas con facilidad, adems de reunir conocimiento acumulado en estas reas de manera estructurada y til. MATLAB se centra en el cmputo y no en las matemticas, as que las expresiones y la manipulacin simblica no son su fuerte, a excepcin de las empleadas con la herramienta symbolic o con el lenguaje MuPAD. Las soluciones son numricas e inexactas, asociadas a los artificios del redondeo. Esto puede verse como un problema y como una ventaja al mismo tiempo. Comparado con otros lenguajes de programacin numricos como C++ o FORTRAN, MATLAB es mucho ms fcil de usar y esta integrado con una biblioteca formada de una gran, gran cantidad de informacin, mdulos, programas, subrutinas, relacionadas con el cmputo numrico. La nica comparacin donde MATLAB queda en desventaja es en el rubro de velocidad de ejecucin, pero puede ser menos dramtica con buenas prcticas de programacin como veremos aqu. MATLAB no es la herramienta de eleccin para cmputo de alto desempeo (aunque probablemente si lo sea en el futuro cercano), pero es una plataforma inmejorable para proyectos desde elementales hasta intermedios y en muchos casos para

    * UNAM-Quertaro, CFATA. [email protected]

  • MATLAB para novatos 4

    probar lo que en otros lenguajes seria cdigo muy elaborado o que requiere de demasiado tiempo. MATLAB permite obtener una respuesta numrica a una expresin algebraica, de manera similar a una calculadora, tambin permite obtener una aproximacin numricas a problemas donde la substitucin no es posible. Lo que consideramos como la solucin enfrenta dos dificultades; que MATLAB entienda una cosa diferente de lo que estamos pensando en virtud de la falta de dominio de la herramienta y que el procedimiento emprendido sea adecuado para alcanzar la solucin. Esta escrito, espero, ayude a aminorar el primer problema, el segundo se logra con el dominio de los mtodos numricos y de la experiencia. No se espera que MATLAB pueda resolver un problema que no se pueda resolver con papel, lpiz y tiempo. En general es ms exitoso si antes de expresar el problema en MATLAB se ha expresado en papel y lpiz.

    1.1 MATLAB por primera vez

    Al iniciar MATLAB aparece el escritorio con diversas reas de trabajo, Multipaneled desktop. Que se puede modificar para ser til a cada usuario, accin que no es necesaria en un principio. La figura 1.1 ilustra las reas de trabajo, Command Window (elipse amarilla), donde se le escribe a MATLAB las acciones a realizar, inmediatamente frente al prompt >> (rectngulo azul), y donde aparecen las respuestas numricas

    Figura 1.1 Multipaneled desktop en MATLAB. MATLAB es un lenguaje de programacin que interpreta las instrucciones lnea por lnea, a diferencia de otros lenguajes de programacin que compilan el programa total. Esta es una afirmacin correcta en parte, ya que como veremos existen las funciones que no se interpretan o incluso programas completos en MATLAB que pueden ser ejecutables. Esta parte se aclarara al ver MEX files y GUIs.

    prompt

    Start

  • MATLAB para novatos 5

    Workspace (elipse verde), muestra las variables definidas e informacin al respecto; en un principio esta vaca, al definir variables o realizar operaciones se acumulan y se pueden editar. Doble clic sobre la variable, inicia un editor que permite su visualizacin y edicin, siempre que sea menor a 65 536 renglones o columnas. En esta misma rea se puede visualizar la carpeta en la que se esta trabajando al seleccionar la pestaa correspondiente a Current Directory, MATLAB solo ve el contenido de la carpeta que esta seleccionada. Para cambiar el directorio emplear el acceso rpido (circulo azul claro, arriba al centro). Command History (elipse rojo), lista las acciones solicitadas en command window, de la ms reciente a la ms antigua y se pueden pasar al Workspace navegando por medio de la flecha en el teclado (arriba y abajo) o haciendo un doble clic en el comando deseado. Start (rectngulo magenta), es el puerto de entrada a muchas de las funciones de MATLAB, herramientas de trabajo, ayudas y mas, usualmente debe estar preparado para pasar horas de sano entretenimiento en los ejemplos y guas de uso. Cuando se le ha pedido a Matlab que realice una actividad que toma tiempo, desaparece el prompt y a la derecha de Start aparece la leyenda Busy, lo que indica la necesidad de tener paciencia, si se desea cancelar el proceso se puede hacer presionando al mismo tiempo las teclas ctrl-c lo que pone disponible el prompt y aparece la leyenda Ready a la derecha de Start. En clculo numrico elemental, un camino trivialmente simplista es usar una calculadora cuando la tarea es muy simple, despus Excel si se requiere de grficas mas elaboradas y finalmente C++ cuando se tiene en mente acciones no desarrollas por un programa particular. El salto de una herramienta a la otra puede ser intimidante e incluso limitante. Si quisiramos que MATLAB estuviera presente en esta evolucin, igualmente puede ser una alternativa a cualquiera de las herramientas anteriores. Una de las limitaciones para iniciar a usar MATLAB como calculadora (inicialmente y despus el cielo es el lmite), es que no se parece a una. Superando esta diferencia, se puede fcilmente superar las ventajas de Excel como hoja de clculo y de ah pasar a usar MATLAB con ms provecho.

    1.2 Uso elemental de MATLAB

    Si se escribe una expresin valida en el rea de command window, la respuesta aparece de manera inmediata. >> 5*3 ans = 15 >>

    La multiplicacin de dos nmeros se realiza y el resultado se guarda en la variable ans. El prompt indica que esta listo para nuevas instrucciones. >> 3^3

  • MATLAB para novatos 6

    ans = 27 >>

    La potencia es igualmente evidente, el resultado se escribe en la variable ans, substituyendo cualquier valor o contenido que tuviera anteriormente. >> 1/0 Warning: Divide by zero. ans = Inf >>

    Aqu Inf es la manera de representar , que indica un nmero ms grande que cualquiera que puede ser escrito y que en este caso resulto de intentar dividir el nmero uno entre cero. >> cos(pi/4) ans = 0.7071 >>

    Aqu la funcin trigonomtrica est en radianes, pi representa a ; nmero de veces que el dimetro del crculo se requiere para formar el permetro del crculo. La misma funcin trigonomtrica en grados donde el crculo tiene 360 grados se escribe cosd. >> exp(i*pi/4) ans = 0.7071 + 0.7071i >>

    Aqu i (tambin pude ser 1i, uno-i que evita confusiones con la variable i)

    representa a 1 ; unidad de los nmeros imaginarios. i puede ser tambin una variable, nicamente si no ha sido empleado como variable, entonces toma la representacin de los

    nmeros imaginarios. En cuanto a la notacin exp(x) es la representacin de xe , donde e es el nmero de Euler que es aproximadamente 2.718281828. >> 0/0 Warning: Divide by zero. ans = NaN >>

  • MATLAB para novatos 7

    Aqu NaN representa a un resultado indefinido, se form de Not a Number, no es un nmero y aqu surge de intentar dividir cero entre cero. >> (3-exp(log(3)))/3 ans = 1.4803e-016 >>

    Aqu la respuesta algebraica esperada es cero, la aritmtica de punto flotante realiza por aproximaciones los clculos y en su lugar aparece un nmero muy pequeo, 1.4803 x 10-16 (1.4803e-016=1.4803E-016); Los clculos en la computadora producen errores que con la ventaja del punto flotante (notacin exponencial) es muy pequeo. eps representa al valor del error mximo aritmtico en mi mquina, que es 2.2204 x 10-16; cualquier numero mas pequeo que eps es aceptable. Dicho de otra manera el siguiente nmero mayor que uno y distinguible de uno en mi mquina es 1+eps. >> eps ans = 2.2204e-016 >>

    1.3 La ayuda en MATLAB

    MATLAB contienen un enorme material, es imposible dominarlo todo y menos an recordarlo todo, por lo que es importante es aprenda a aprender y recordar de manera eficiente. No es accidente que al iniciar el programa, la primera lnea invite a explorar el material de ayuda que contiene: To get started, select MATLAB Help or Demos from the Help menu. >>

    El texto en azul es una liga directa a la ayuda en MATLAB, que abre una ventana como la mostrada en la figura 1.2. En la figura 1.2 se ve la ventana de ayuda; en el panel izquierdo esta el navegador, donde se puede explorar por contenido, por ndice, hacer bsquedas o explorar las

    log(x) es logaritmo natural de x log10(x) es el logaritmo base 10 de x atan(x) es el ngulo en radianes cuya tangente es x sinh(x) es el seno hiperblico de x sqrt(x) raz cuadrada de x

    Algunas palabras reservadas en MATLAB log(x) es logaritmo natural de x log10(x) es el logaritmo base 10 de x atan(x) es el ngulo en radianes cuya tangente es x sinh(x) es el seno hiperblico de x sqrt(x) raz cuadrada de x

  • MATLAB para novatos 8

    demostraciones. Aqu se muestra el navegador por contenido (elipse azul), el libro de MATLAB (elipse roja), las funciones por categora (elipse verde) y las funciones matemticas elementales. En el panel derecho se ve la lista de funciones exponenciales, doble clic en cualquier nombre en azul para ver la ayuda preparada en cuanto a su definicin y uso.

    Figura 1.2 Ventana de ayuda de MATLAB. Muchas veces no se recuerda o conoce el nombre de la funcin que hace lo que buscamos, la bsqueda alfabtica de funciones puede ser til. Si recordamos el nombre de la funcin y solo no recordamos el uso, podemos emplear Command Window y teclear help y el comando del que requiere ayuda, por ejemplo help log y aparece en el Command Window la ayuda al respecto, usualmente simplificada.

    1.4 Definicin de Variables

    Se puede definir las variables usadas >> a=exp(1) a = 2.7183 >>

    Aqu a tiene el valor de la constante de Euler. >> c=a*b ??? Undefined function or variable 'b'.

  • MATLAB para novatos 9

    >>

    Aqu intentamos guardar en la variable c el resultado de multiplicar el nmero de Euler (a) por el contenido de b, como no habamos definido previamente el valor de b nos lo indica y no realiza nada, queda en espera una instruccin valida. La multiplicacin a*b tiene la notacin correcta, (a)(b) no es aceptable como multiplicacin, como tampoco lo es ab ni a.b, estos dos ltimos casos corresponden a otras variables, ab y la componente b del objeto a. A continuacin estn algunas convenciones tiles de tomar en cuenta; comentarios que ignora el intrprete de MATLAB, asignar caracteres alfanumricos a las variables y continuacin de comandos en varias lneas. Los caracteres que aparecen en verde no son interpretados por MATLAB y estn en verde cuando van despus del smbolo de porcentaje %. >> % este es un comentario, no hay ejecucin >> x=a^2; % ; al final de la instruccin evita que aparezca el resultado en Command Window >> y='letreros';% las comas definen los caracteres alfanumricos >> z=1+2+3+... 4+5+6 % ... es una continuacin de lnea z = 21 >>

    1.5 Exhibicin de resultados

    Los resultados numricos aparecen en forma de 4 decimales, tambin se pueden exhibir en forma de 15 decimales (long) o en forma fraccional aproximada (rat). La palabra format regresa a la forma predeterminada. >> P= pi P = 3.1416 >> format long >> P P = 3.141592653589793 >> format rat >> P P = 355/113 >> format >>

  • MATLAB para novatos 10

    1.6 Guardar el trabajo

    Si se desea guardar las variables se procede por File-Save workspace as y se guarda con el nombre deseado. Para guardar la historia de comandos se procede a seleccionarlos en el panel de Command History y con el botn derecho del Mouse se selecciona Create M-File, aparece otra ventana con la historia de los comandos y ah se puede guardar su contenido en un archivo. Las figuras, mas adelante se vera como generarlas, se pueden guardar en formatos muy diversos, *.fig es el formato nativo de MATLAB, es modificable y el mas conveniente ya que guarda los valores que la generaron, *.eps, es postscript y se pueden anexar a documentos Word y la calidad no cambia al cambiar el tamao, *.jpg es el mas comn pero la calidad es muy limitada y disminuye rpidamente al cambiar de tamao.

    1.7 Ejercicios

    1. Evaluar las siguientes expresiones en MATLAB.

    a)eeeA

    b)

    3

    1cos 1B

    c)

    7log

    eC

    d) determinar que nmero es primo {0,1,2,3,4,5,6,7,8,9,10,97,99} Respuestas: a) A=3.8143e+006 b) B=1.9106 [rad] c) C=0.1718 e) [2, 3, 5, 7, 97]

  • MATLAB para novatos 11

    2 Arreglos y matrices En el centro de MATLAB se posicionan las matrices, el acrnimo del nombre se desprende de MATrix LABoratory, y se espera un uso intensivo de matrices y vectores. Un array es un grupo de nmeros que en MATLAB se especifica con ndices, cada elemento del grupo se identifica con uno o varios ndices, los ndices siempre son enteros que empiezan con el nmero uno. La cantidad de ndices necesarios para especificar a un elemento forma las dimensiones del array. Para el caso de dos dimensiones, la funcin del ndice es la de representar la posicin del rengln y la columna. La estructura de cada ndice esta definida como (i,j), donde i denota la posicin del rengln y j la posicin de la columna:

    Por ejemplo, la matriz es un array de nmeros de dos dimensiones, dado como:

    rows son los renglones, lneas horizontales y las columns son las columnas, lneas verticales. Por otro lado, los vectores son arreglos numricos de una sola dimensin, y pueden ser vectores rengln o vectores columna. Conocer la aritmtica de matrices es fundamental para aprovechar las ventajas de MATLAB.

    ),( ji Rengln Columna

    Columna

    Rengln

    mnmmm

    n

    n

    n

    aaaa

    aaaa

    aaaa

    aaaa

    321

    3333231

    2232221

    1131211

  • MATLAB para novatos 12

    MATLAB no hace distincin entre un escalar; una matriz con un rengln y una columna, y un arreglo de nmeros de mltiples ndices. En la manera de escribir las expresiones es que se respeta la manera de hacer el algebra de matrices o el algebra de arreglos. Una matriz de dos dimensiones representa los coeficientes de sistema de ecuaciones lineales, un arreglo de dos dimensiones puede representar la manera de agrupar informacin por conveniencia, MATLAB no sabe si el conjunto de nmeros es una matriz o un arreglo, la aritmtica de matrices esta bien definida, la aritmtica de arreglos es arbitraria dependiendo de cmo se arreglaron los nmeros y que se quiera hacer con ellos; se debe tener cuidado en lo que le pedimos hacer a MATLAB.

    2.1 Construir arreglos de nmeros

    Un arreglo de dos dimensiones se define al incluir los nmeros entre parntesis cuadrados, las columnas se separan por espacio o por comas y los renglones se separan por punto y coma o por nueva lnea. Por ejemplo, una matriz de tres renglones y tres columnas est dada como: >> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9

    Es importante que los renglones contengan el mismo nmero de columnas de lo contrario Matlab desplegar un mensaje de error de dimensiones. La manera de definir en Matlab un vector columna est dado como: >> B=[1 ;4 ; 7 ] B = 1 4 7

    Un vector rengln puede ser definido como:

    Columna

    Rengln

    naaaa 1131211

    1

    31

    21

    11

    ma

    a

    a

    a

    Vector rengln Vector columna

  • MATLAB para novatos 13

    >> C=[1 2 3] C = 1 2 3

    Un escalar o constante puede ser definido como: >> D=5 D = 5

    Despus de haber definido esas variables, el usuario puede revisar ciertas propiedades directamente en la ventana de Work Space. Sin embargo, existen diferentes funciones en Matlab que le permiten al usuario obtener informacin del grupo de datos que se est manejando. Algunas veces, esta informacin es importante para separar un cierto grupo de datos o tener un control en el nmero de ciclos de operaciones matemticas recursivas basado en la dimensiones del array. Por ejemplo, el comando size proporciona el nmero de renglones y columnas que contiene una variable en particular. Estos parmetros pueden ser almacenados con variables alfanumricas y tenerlos presentes en la memoria de la sesin. La funcin est dada como: >> [n,m]=size (A) n = 3 m = 3

    Donde, n representa el nmero de renglones y m representa el nmero de columnas. En este caso particular se trata de una matriz cuadrada de 3x3. Otra funcin, relacionada con el nmero de elementos que almacena un array, es la funcin length. Esta funcin proporciona la cantidad de elementos ms grande que contiene el array. Por ejemplo si se trata de un vector columna, como aquel definido en la variable B, la funcin esta dada como: >> length(B) 3

    El nmero 3 representa la dimensin mas grande en la variable B y que corresponde a tres renglones. No es fcil darse cuenta si el comando proporciona el nmero de elementos en rengln o columna. Pero este comando es utilizado en ciclos de iteracin que corresponden al mximo nmero de elementos en un arreglo. As se limita un ciclo

  • MATLAB para novatos 14

    de operacin en un proceso recursivo matemtico sin la necesidad de declarar, por separado, el nmero de veces que un ciclo se tiene que repetir, ya que esta basado nicamente en las dimensiones del array. Matlab tiene la capacidad de poder representar datos en dos y tres dimensiones. La funcin dims representa la dimensin en la cual fue definido el array. >> ndims(A) 2

    El nmero dos indica que el arreglo de datos esta representado en dos dimensiones. Cuando se trata de un arreglo de tres dimensiones el resultado numrico es tres. Una de las ventajas de Matlab es que no hay necesidad de realizar programas para poder extraer o identificar cierto grupo de datos numricos en un array, basta usar adecuadamente las funciones definidas en su biblioteca. Esto le permite al usuario identificar y separar propiedades en un array para despus poderlos manejar por separado. Por ejemplo, la funcin find nos permite encontrar datos numricos con ciertas propiedades matemticas. Supongamos que por alguna razn estamos interesados en identificar aquellos datos numricos que son mayores que 7 en el arreglo definido en la matriz A. La funcin debe ser declarada como: >> [row,col] = find(A>7) row = 3 3 col = 2 3

    El resultado desplegar la posicin en el arreglo mediante los ndices de los renglones con sus respectivas columnas. En este ejemplo, el resultado indica que hay dos nmeros en el array mayores que siete. Uno de ellos se encuentra en la posicin (3,2), es decir, en el rengln tres y columna dos, y el otro se encuentra en la posicin (3,3), es decir, en el rengln tres y columna tres. Tambin se pueden emplear las relaciones lgicas para identificar elementos en un array.

  • MATLAB para novatos 15

    En resumen podemos describir las anteriores funciones mediante el siguiente recuadro con la funcin que desempea cada una de ellas:

    Matlab le permite al usuario construir nuevas matrices basndose en los resultados o variables declaradas. El requisito es que todo rengln debe contener el mismo nmero de datos numricos para hacerlos compatibles. Por ejemplo, la tarea es agrupar los datos almacenados en la variable A y en el variable B. El resultado tiene que ser almacenado en una nueva variable llamada E. La nica forma de hacer compatibles ambos array es anexando el vector columna de la variable B; ya sea a la izquierda o la derecha de la matriz A. De aqu que la funcin est dada como: >> E=[A B] E = 1 2 3 1 4 5 6 4 7 8 9 7

    El resultado de la variable E ser una matriz que contiene tres renglones y cuatro columnas. Note que la operacin requiere de agrupar ambas variables separadas por un espacio entre ellas. Esta misma accin se logra, como se comento al inicio de esta seccin, cuando las variables son separadas por una coma. Como regla, el usuario tiene que memorizar que la funcin de espacio y coma son equivalentes en un array. Ahora, supongamos que deseamos agrupar el vector rengln de la variable C con la matriz de datos A. La nica posibilidad de hacer esto es anexar la variable C es en el primer rengln o el ltimo rengln. La funcin, entonces, esta dada como: >> F=[A;C] F = 1 2 3 4 5 6

    == idntico a = diferente de < menor que > mayor que = mayor o igual que

    size da los elementos en cada dimensin length da los elementos en la dimensin mas grande ndims da el numero de dimensiones find encuentra los ndices de elementos diferentes de cero. [row,col] = find(A>7) encuentra en A los electos mayores a 7

  • MATLAB para novatos 16

    7 8 9 1 2 3

    El resultado es una matriz almacenada en una variable F con dimensiones de cuatro renglones y tres columnas. Note que la operacin esta caracterizada por punto y coma porque se requiere de definir un nuevo rengln. Despus de haber entendido como declarar nuevas variables usando matrices, pasemos a redefinir elementos dentro de un array. De esta manera, es posible modificar o sustituir con nuevos datos ciertas posiciones dentro del array. Suponga que en el array F se desea sustituir el nmero ocho por un cero. La funcin est dada como: >> F(3,2)=0 F = 1 2 3 4 5 6 7 0 9 1 2 3

    Note que en la estructura se declara primero el array a ser modificado, en este caso el array esta representado con la variable F. Despus hay que indicar la posicin del ndice a ser sustituido y que en este caso corresponde al tercer rengln y segunda columna (3,2). Finalmente usando el smbolo igual se relaciona con el nuevo dato a ser almacenado dentro del array y que en este caso particular es un cero. Cuando se desee eliminar todo un rengln en el array, la funcin est dada como: >> F(:,2)=[] F = 1 3 4 6 7 9 1 3

    La estructura de esta operacin modific el array de la variable F. El smbolo de dos puntos (:) en el ndice le indica a Matlab que se tomarn todos los renglones de la segunda columna (2) para ser eliminados por []. De aqu que el smbolo de parntesis cuadrado denota vaco. Esta misma operacin puede realizarse si se cambia la notacin del ndice por (2,:). Por ejemplo si se declara en Comman Windows: >> H=F, H(2,:)=[] H = 1 3 7 9 1 3

    La operacin indica que se tomarn todas las columnas del segundo rengln para ser eliminadas []. Se puede incluir mas de una instruccin en un rengln, separado por comas

  • MATLAB para novatos 17

    (en caso de querer ver el resultado en el Comman Windows) o punto y coma (en caso de no desearlo). El usuario puede darse cuenta que el lenguaje y la estructura de Matlab esta basado en una estructura lgica y fcil de entender. Por otro lado, existen diferentes operaciones que son tiles cuando se manejan arreglos de matrices. Una operacin bsica cuando se trabaja con arreglos matriciales consiste en obtener la transpuesta de una matriz, la cual se construye escribiendo los renglones en las columnas. Si los nmeros de la matriz son reales, la transpuesta de A se escribe como A. Esta operacin es muy til para acceder a los nmeros de la matriz, por ejemplo para construir matrices a partir de otras. Otra manera de concatenar arreglos es la funcin cat(dim, A, B) donde los arreglos A y B se unen en la dimensin sealada por dim, por supuesto las dimensiones a pegar tienen que ser compatibles. >> V= cat (1,E,F') V = 1 2 3 1 4 5 6 4 7 8 9 7 1 4 7 1 3 6 9 3 >> H=cat (2,E',F) H = 1 4 7 1 3 2 5 8 4 6 3 6 9 7 9 1 4 7 1 3 >>

    La construccin de matrices grandes se puede realizar con la ayuda de los comandos mostrados en el siguiente recuadro. Se deja al lector, como ejercicio, leer la ayuda en lnea y definir matrices con ciertas dimensiones. Esto le ayudar para resolver los problemas mostrados al final de la seccin.

    Otra funcin relacionada con el operador dos puntos (:), y muy til en MATLAB, es que puede generar secuencias numricas como: >> T=1:10

    eye(m,n) matriz de m x n con unos en la diagonal y ceros en el resto. rand(m,n) matriz de m x n con elementos aleatorios entre 0 y 1. zeros(m,n) matriz de m x n con todos los elementos ceros ones(m,n) matriz de m x n con todos los elementos unos linspace(a,b,n) produce un rengln de n puntos linealmente espaciados de a hasta b repmat(A,m,n) crea una matriz de m x n copias de A

  • MATLAB para novatos 18

    T = 1 2 3 4 5 6 7 8 9 10 >>

    En este caso se genera un vector rengln desde 1 hasta 10. El tamao de paso entre cada digito es por norma 1. Pero si se desea modificar el tamao de paso la funcin debe ser dada como: >>TT= -3:-.5:-6 TT = -3.0000 -3.5000 -4.0000 -4.5000 -5.0000 -5.5000 -6.0000 >>

    En este caso el vector rengln formado empieza en -3 y termina en -6. El tamao de paso de -0.5 esta representado entre los operadores dos puntos (:). De aqu que el formato general para definir un vector est dado como:

    S=nmero inicial : paso entre nmeros : nmero final el resultado produce un vector rengln o vaco si el nmero final es menor que el nmero inicial. Esta funcin es til cuando se desean declarar nuevos vectores para relacionarlos con otros valores de una funcin matemtica previamente calculada. Al final, ambos vectores son concatenados para graficarlos. La funcin linspace realiza una funcin similar y se recomienda al lector tenerla presente.

    2.2 Acceder a los nmeros en los arreglos

    Matlab permite extraer datos numricos del arreglo. Por ejemplo si se desea extraer el segundo rengln del arreglo y almacenarlo en una variable G. La estructura a usar est dada como: >> G=E(2,:) G = 4 5 6 4

    La estructura indica que primero se debe declarar la nueva variable, que en este caso es G. El smbolo igual representa que la operacin ser guardad en esta nueva variable y el grupo de datos se tomar del arreglo original representado por la variable E. Despus, se tiene que indicar mediante un ndice para referirse a todas las columnas del segundo rengln. En este caso, el nmero dos en el ndice usado indica que nos referiremos al segundo rengln y el smbolo dos puntos (:) se refiere a todas las columnas. La estructura para extraer toda una columna es similar a la anterior con la diferencia de que ahora el ndice puede ser declarado como (:,2). En este caso se extraern todos los renglones de la segunda columna y almacenarlo en la misma variable G.

  • MATLAB para novatos 19

    >> G=E(:,2) G = 2 5 8

    El acceso a los nmeros de un arreglo puede involucrar ciertos sectores dentro del arreglo. En otras palabras, no requerimos de extraer todo un rengln o una columna. Para ejemplificar este caso, definamos una nueva matriz usando la funcin rand. Cabe resaltar que cada vez que se ejecuta esta funcin, Matlab proporcionar diferentes nmeros porque la variable rand esta relacionada con nmeros aleatorios entre 0 y 1. >> A=rand(2,5) A = 0.9501 0.6068 0.8913 0.4565 0.8214 0.2311 0.4860 0.7621 0.0185 0.4447

    El arreglo se compone de dos renglones y cinco columnas. Ahora bien, si se desea extraer un valor almacenado en el arreglo, esto puede ser expresado de dos maneras. La primera estructura est dada como: >> ele1=A(1,3) ele1 = 0.8913

    La segunda estructura est dada como: >> ele2=A(5) ele2 = 0.8913 >>

    En el primer formato A(1,3) representa al primer elemento de la tercera columna. Que tambin se puede llamar A(5), quinto elemento del listado, la numeracin es consecutiva agotando los elementos de la primer columna se sigue con el resto de las columnas. Por otro lado es posible extraer una parte del arreglo de la siguiente manera: >> mat1=A(1:2,[3 5]) mat1 = 0.8913 0.8214 0.7621 0.4447

  • MATLAB para novatos 20

    >>

    Los elementos que se seleccionan para formar mat1 son los primeros dos elementos de las columnas 3 y 5. Tambin se puede obtener una matriz nueva a partir de los elementos de otra matriz, por ejemplo, tomar todos los elementos de la columna y formar una nueva matriz con las columnas 2 1 2 4 5 y 5. >> mat2=A(1:end,[2 1 2 4 5 5]) mat2 = 0.6068 0.9501 0.6068 0.4565 0.8214 0.8214 0.4860 0.2311 0.4860 0.0185 0.4447 0.4447 >>

    Aqu end indica el ultimo elemento disponible, as que 1:end es una manera compacta de decir que se tiene que considerar desde el primer elemento hasta el ultimo, equivalente a solo escribir dos puntos (:). Por otro lado cuando se requiere agregar un nuevo elemento al array. Se puede hacer de la siguiente manera: >> mat2(3,1)=8 mat2 = 0.6068 0.9501 0.6068 0.4565 0.8214 0.8214 0.4860 0.2311 0.4860 0.0185 0.4447 0.4447 8.0000 0 0 0 0 0 >>

    El elemento que se agrega requiere de tener un rengln extra, lo que no es problema en principio, pero puede crear problemas cuando se requiere que el tamao del arreglo este cambiando de tamao constantemente, ya que puede hacer el cmputo mucho ms lento. >> F=find(mat2>.6) F = 1 3 4 7 13 16 En este caso F representa al ndice nico que identifica a los elementos de la matriz mat2 que son mayores que 0.6. La siguiente instruccin identifica estos elementos de la matriz. Tambin se podra escribir [a b] = find(mat2>.6)para identificar los dos ndices que etiquetan a los nmeros referidos. >> mat3=mat2(F) mat3 =

  • MATLAB para novatos 21

    0.6068 8.0000 0.9501 0.6068 0.8214 0.8214 >>

    2.3 Operaciones con matrices

    Aqu solo se enfatiza la informacin presentada en help para las matrices, las operaciones entre elementos de matrices se especifica en la siguiente seccin. Dos nuevos vectores columna son generados conteniendo los siguientes nmeros. >> A=[1;2;3], B=[4;5;6] A = 1 2 3 B = 4 5 6 >>

    + Adicin de matrices. A+B suma A y B. A y B deben tener el mismo tamao, a menos que una de las matrices sea un escalar, un escalar se puede sumar a una matriz de cualquier tamao.

    ijijij BAC

    >> C=A+B C = 5 7 9 >>

    - Sustraccin de matrices. A-B resta B de A. A y B deben tener el mismo tamao, a menos que una de las matrices sea un escalar, un escalar se puede sumar a una matriz de cualquier tamao.

    ijijij BAC

    >> C=A-B C =

  • MATLAB para novatos 22

    -3 -3 -3 >>

    * Multiplicacin de matrices. C = A*B es el producto algebraico lineal de las matrices A y B. Mas precisamente,

    n

    kkjikij BAC

    1

    Para matrices no escalares A y B, el nmero de columnas de A debe ser igual al nmero de renglones de B. Un escalar puede multiplicar matrices de cualquier tamao. >> C=A*B ??? Error using ==> mtimes Inner matrix dimensions must agree.

    ?

    6

    5

    4

    3

    2

    1

    >> C=A*B' C = 4 5 6 8 10 12 12 15 18

    181512

    12108

    654

    654

    3

    2

    1

    >> C=A'*B C = 32 >>

    326

    5

    4

    321

    / Diagonal o divisin derecha de matrices. B/A es aproximadamente lo mismo que B*inv(A). De manera mas precisa es, B/A = (A'\B')'. Esta operacin no tienen razn de existir, se tiene por completes pero no representa ninguna operacin o concepto fundamental. \ Diagonal invertida o divisin izquierda de matrices. Si A es una matriz cuadrada, A\B es aproximadamente lo mismo que inv(A)*B, excepto que se calcula de manera diferente. Si A es una matriz de n x n y B es un vector columna con n componentes, o una

  • MATLAB para novatos 23

    matriz con varias columnas de ese tipo, entonces X = A\B es la solucin de la ecuacin AX = B calculada por eliminacin de Gauss. Una advertencia aparece si A esta mal escalada o es casi singular. Es muy comn encontrar un sistema de ecuaciones de la siguiente manera:

    3

    2

    1

    3

    2

    1

    333231

    232221

    131211

    b

    b

    b

    x

    x

    x

    aaa

    aaa

    aaa

    fuerzasvariablessistemadelelementos

    En donde la solucin o valores para el vector X se puede determinar de la siguiente forma: X= inv(A)*B=A\B. >> A=[1 2 3;1 5 6;1 3 9] A = 1 2 3 1 5 6 1 3 9 >> B=[32;65;73] B = 32 65 73 >> X=A\B X = 4 5 6 >>

    ^ Potencia de matrices. X^p es X elevado a la potencia p, si p es un escalar. Si p es un entero, la potencia se calcula por cuadrados repetidos. Si el entero es negativo, X se invierte primero. Para otros valores de p, el clculo se realiza con la ayuda de los eigenvalores y eigenvectores, tales que [V,D] = eig(X), determina los valores de V y D, donde V es la matriz de columnas de eigenvectores y D es la matriz con diagonal de eigenvalores, entonces X^p = V*D.^p/V. Aqu XAX , X es un eigenvector y es un eigenvalor. F=3*ones(3) F = 3 3 3

  • MATLAB para novatos 24

    3 3 3 3 3 3 >> F^2 ans = 27 27 27 27 27 27 27 27 27 >>

    Si x es un escalar y P es una matriz, x^P es x elevado a la potencia matriz P usando eigenvalores y eigenvectores. X^P, donde X y P son ambas matrices se indica por un error. ' Matriz transpuesta. A' es la transpuesta algebraica de A. Para matrices complejas, es la transpuesta del complejo conjugado. >> G=A+i*A G = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i 5.0000 + 5.0000i 6.0000 + 6.0000i 7.0000 + 7.0000i 8.0000 + 8.0000i 9.0000 + 9.0000i >> G' ans = 1.0000 - 1.0000i 4.0000 - 4.0000i 7.0000 - 7.0000i 2.0000 - 2.0000i 5.0000 - 5.0000i 8.0000 - 8.0000i 3.0000 - 3.0000i 6.0000 - 6.0000i 9.0000 - 9.0000i >>

    expm(A). Exponencial de una matriz. Debemos usar expm(A) cuando deseamos obtener el exponencial de una matriz, o sea, cuando queremos calcular: I + A + A2/2 + A3/6 + .

    2.4 Operaciones con arreglos

    Las operaciones entre los elementos se realizan fcilmente incluyendo un punto antes del operador, siguiendo la secuencia empleada en la seccin anterior. >> x=[1;2;3], y=[4;5;6] x = 1 2 3 y =

  • MATLAB para novatos 25

    4 5 6 >>

    .+ Adicin de arreglos. A+B suma A y B. La suma de los elementos de las matrices es idntica a la suma de matrices. .- Sustraccin de arreglos. A-B resta B de A. La resta de los elementos de las matrices es idntica a la resta de matrices. .* Multiplicacin de arreglos. A.*B es el producto de elemento por elemento de las matrices y deben ser del mismo tamao, a menos que alguna de las dos matrices sea un escalar. >> c=x.*y c = 4 10 18 >> x.*y' ??? Error using ==> times Matrix dimensions must agree. >> x'.*y ??? Error using ==> times Matrix dimensions must agree. >>

    ./ Divisin derecha de arreglos. A./B forma la matriz cuyos elementos se forman de A(i,j)/B(i,j). A y B deben tener el mismo tamao, a menos que alguno sea un escalar A = 1 2 3 4 5 6 7 8 9 >> E=2*ones(3) E = 2 2 2 2 2 2 2 2 2 >> P=A./E P = 0.5000 1.0000 1.5000

  • MATLAB para novatos 26

    2.0000 2.5000 3.0000 3.5000 4.0000 4.5000 >>

    .\ Divisin izquierda de arreglos. A.\B forma la matriz cuyos elementos se forman de B(i,j)/A(i,j). A y B deben tener el mismo tamao, a menos que alguno sea un escalar. Esta operacin no tienen razn de existir, se tiene por completes pero no representa ninguna operacin o concepto fundamental. .^ Potencia de arreglos. A.^B es la matriz con elementos A(i,j) elevado a la potencia B(i,j). A y B deben ser del mismo tamao a menos que una sea un escalar. >> F=3*ones(3) F = 3 3 3 3 3 3 3 3 3 >> T=F.^2 T = 9 9 9 9 9 9 9 9 9 >>

    .' Transpuesta de un arreglo. A.' es una matriz de la transpuesta de A. Para matrices complejas, esta operacin no hace el complejo conjugado como lo hace la transpuesta de una matriz. >> G=A+i*A G = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i 5.0000 + 5.0000i 6.0000 + 6.0000i 7.0000 + 7.0000i 8.0000 + 8.0000i 9.0000 + 9.0000i >> GG=G.' GG = 1.0000 + 1.0000i 4.0000 + 4.0000i 7.0000 + 7.0000i 2.0000 + 2.0000i 5.0000 + 5.0000i 8.0000 + 8.0000i 3.0000 + 3.0000i 6.0000 + 6.0000i 9.0000 + 9.0000i >>

  • MATLAB para novatos 27

    exp(A). Exponencial de un arreglo. Esta funcin produce una matriz donde cada elemento se obtiene de exp(aij).

    2.5 Ejercicios

    1. Construir el siguiente arreglo:

    8 2 0 0 0 0 0 0 0 1-

    2 8 2 0 0 0 0 0 0 0

    0 2 8 2 0 0 0 0 0 0

    0 0 2 8 2 0 0 0 0 0

    0 0 0 2 8 2 0 0 0 0

    0 0 0 0 2 8 2 0 0 0

    0 0 0 0 0 2 8 2 0 0

    0 0 0 0 0 0 2 8 2 0

    0 0 0 0 0 0 0 2 8 2

    1- 0 0 0 0 0 0 0 2 8

    A

    a) Consulte help para emplear nicamente diag en su construccin. b) Consulte help para emplear nicamente toeplitz en su construccin. c) Construir los siguientes arreglos de la manera ms econmica.

    1 0 0 0 0

    2 1 0 0 0

    3 2 1 0 0

    4 3 2 1 0

    5 4 3 2 1

    D ,

    11

    21

    31

    41

    51

    21

    11

    21

    31

    41

    31

    21

    11

    21

    31

    41

    31

    21

    11

    21

    51

    41

    31

    21

    11

    E .

    2. Si A es una matriz de nmeros aleatorios de 8x8. a) Determinar el mximo valor en cada rengln. b) Determinar el mnimo valor en cada columna c) Determinar el mximo nmero del arreglo d) Cambiar por cero los elementos que son mayores que 0.5 3. Si A es una matriz mgica (magic) de 4x4, construir una instruccin que le permita suma los elementos de la diagonal principal y de la antidiagonal. 4. Si se tienen un arreglo de 52 nmeros, determine alguna manera de hacer un listado aleatorio de ellos. Respuestas: 1. A=diag(ones(10,1)*8,0)+diag(ones(9,1)*2,1)+

  • MATLAB para novatos 28

    diag(ones(9,1)*2,-1)+diag(-1,9)+diag(-1,-9) note que eye(10)*8= diag(ones(10,1)*8,0) B=toeplitz([8 2 zeros(7,1)' -1],[8 2 zeros(7,1)' -1]) B=toeplitz([8 2 0 0 0 0 0 0 0 -1]) D=toeplitz(1:5,zeros(5,1))' E=toeplitz(1./(1:5),1./(1:5))

    3. sum(diag(magic(4)))

    A=(magic(4)), sum(diag(A(4:-1:1,:)))

    4. sortrows([rand(52,1),(1:52)'])

  • MATLAB para novatos 29

    3 Programas (scripts) y funciones Los M-File son archivos de texto que contienen instrucciones para MATLAB, y se guardan como *.m Existen dos tipos de archivos de este tipo, los scripts o secuencia de instrucciones para MATLAB, y las functions que realizan una secuencia de acciones con argumentos de entrada y de salida. MATLAB tiene integrado un editor de texto que es muy conveniente ya que reconoce las acciones que se solicitan y aporta ayuda visual como colores diferentes para comentarios, palabras reservadas por MATLAB y texto regular, adems de permitir identificar errores de sintaxis y ayuda con indentaciones. El editor de archivos se puede llamar por New M-file y que se puede acceder como acceso directo bajo el men de File, es la hoja en blanco, vase la figura 1.1. Los archivos se guardan de inicio en la carpeta \work o en la carpeta \MATLAB, en mi caso la ruta completa es (C:\Users\bigcheese\Documents\MATLAB), se pueden guardar en otra carpeta pero para ser ejecutados por MATLAB deben estar en una ruta reconocida, editpath o el men de File se emplea para modificar la ruta. Los archivos no son compilados, solo se escribe el nombre frente al prompt o por el editor y las acciones se ejecutan.

    3.1 Scripts

    Si abro el editor de archivos y escribo: % Este script me permite practicar la manera de guardar instrucciones % y aumentar mi alfabetismo en MATLAB x= rand(1) % genera un nmero aleatorio. y=sin(x) % calcula el seno del nmero aleatorio x y lo guardo con el nombre tarea1, que se guardara como tarea1.m. Entonces podra ejecutarlo desde el editor de archivos presionado el acceso directo Save and run o podra ejecutarlo escribiendo tarea1 frente al prompt. >> help tarea1 Este script me permite practicar la manera de guardar instrucciones y aumentar mi alfabetismo en MATLAB >> tarea1 x = 0.8913 y = 0.7779 >>

    C:\Program Files\MATLAB\R2006a\work

  • MATLAB para novatos 30

    Al escribir help tarea1 siempre se escriben los comentarios que se agregaron al principio del archivo. La razn principal para escribir scripts es tener una secuencia de instrucciones secuenciales en MATLAB que al ejecutarse facilitan nuestro trabajo, mas til, conforme mas elaborada es la lista de instrucciones que contiene. Otra importancia de los scripts es que permite revisar y editar la secuencia de instrucciones en cualquier momento y por terceros. Aqu la advertencia de buenas prcticas de escritura y de comentarios nunca se enfatizara lo suficiente.

    3.2 Functions

    Las funciones aumentan las posibilidades de MATLAB, se construyen de manera similar a los scripts, solo que la primera instruccin es: function [sal1, sal2, sal3]=nombre (ent1, ent2, ent3) las variables sal1, etc son las salidas de la funcin y las variables ent1, etc son las entradas de la funcin. Se pueden emplear tantas variables como se necesiten, incluso ninguna variable, y pueden tener el nombre que les guste. El nombre que emplee en la funcin debe ser el mismo del nombre empleado para guardar el archivo m. Las lneas que continan se guardaron en un archivo llamado leycoseno.m. % Esta function calcula la ley de los cosenos, requiere los valores de dos % lados del triangulo (B, C) y el ngulo entre ellos (a) en radianes % La respuesta es la longitud del otro lado del triangulo (A) % % el formato es: [respuesta]=leycoseno(B,C,a) function [A]=leycoseno (B, C, a); A=sqrt(B^2+C^2-2*B*C*cos(a)); Como en el caso de los scripts, escribir help y el nombre en el prompt despliega los comentarios iniciales que escribimos. >> help leycoseno Esta function calcula la ley de los cosenos, requiere los valores de dos lados del triangulo (B, C)y el ngulo entre ellos (a), en radianes La respuesta es la longitud del otro lado del triangulo (A) el formato es: [respuesta]=leycoseno(B,C,a)

    Para emplear la funcin se pueden usar cualquier nombre de variables, a continuacin la respuesta del valor del lado del triangulo, cuando los otros dos lados tienen un valor de uno y el ngulo entre ellos es 90 grados se guarda en ans. Recordemos que ans lo genera MATLAB cuando no se asigna una variable para la respuesta y solo existe un ans. >> leycoseno(1,1,pi/2) ans =

  • MATLAB para novatos 31

    1.4142 >>

    Una propiedad interesante de las funciones es que disponen de su espacio privado para variables, de tal manera que no puede ver las variables del espacio de trabajo de donde se llamo la funcin, y libera todo el espacio de memoria que emple cuando termina, adems cada funcin emplea su propio espacio privado. Para el caso de funciones, es posible agregar sub-funciones dentro del mismo archivo, esto no es posible en los scripts. La funcin principal puede llamar tantas sub-funciones como necesite. Un comentario final en relacin a los archivos-m, la mayora de las funciones en MATLAB son archivos-m, que se pueden leer y se pueden copiar. Lo que representa una oportunidad para aprender como programan los profesionales en MATLAB y copiar algunos de sus secretos. Un tipo de funcin que se puede usar es la funcin annima, es un tipo de funcin para el que no se requiere de escribir un m-file, la sintaxis es: f = @(arglist) expression. Como ejemplo veamos la construccin de la raz cuadrtica mayor, donde los argumentos son tres a, b, y c. y la raz mayor es:

    a

    acbbx

    2

    42

    max

    >> f=@(a,b,c) (-b+sqrt(b^2-4*a*c))/2/a f = @(a,b,c) (-b+sqrt(b^2-4*a*c))/2/a >> x=f(1,-(1e8+1e-8),1) x = 100000000

    3.3 Trabajar con y mejorar scripts

    El editor de MATLAB tiene accesos directos para correr el script, en la figura 3.1 esta dentro del crculo rojo. En el circulo azul esta el setpoint, que permite marcar a la derecha del nmero de lnea puntos de referencia que se pueden usar para correr el script de punto a punto. Esto es ventajoso para probar solo una seccin del script, estos marcadores se pueden eliminar con el accedo directo que esta a la derecha. Al momento de detener el

  • MATLAB para novatos 32

    programa se pueden revisar las variables en el Workspace para juzgar la fuente de error, y se puede continuar despus de revisar. El acceso directo que esta indicado por el crculo amarillo se activa al correr el script y puede emplearse para avanzar un paso a la vez la ejecucin del programa.

    Figura 3.1 Apariencia del editor de MATLAB y accesos comunes. En la figura 3.1 y dentro del circulo rosa se encuentra un indicador de sintaxis, el color en la figura es que se tiene una advertencia, en este caso un error que esta mas adelante del script, si se corrige, el color del recuadro cambia a verde. La posicin del cursor esta sealada en la esquina inferior derecha, rectngulo gris, esta referencia es conveniente cuando aparecen errores de ejecucin e indican en que lugar esta el error. La flecha verde indica las pestaas de los scripts que estn abiertos en el editor y cualquiera de ellos puede editarse, solo seleccionndolo. Una capacidad muy provechosa para mejorar el script es profiling, con ella se puede averiguar que tiempo se pasa la computadora en cada funcin del script y juzgar si es posible mejorar o substituir alguna seccin de lneas por otra alternativa, como por ejemplo crear una funcin. profile on, inicia esta posibilidad, al terminar el script se dice profile report, esto nos da el reporte y cuando no se requiere se deshabilita con profile off.

  • MATLAB para novatos 33

    3.4 Funciones de funciones

    MATLAB cuenta con funciones que requieren de definir la funcin sobre la que operar. La lista incompleta de estas funciones es:

    Encontrar las races de una funcin de una variable. Encontrar el valor mnimo en un intervalo de una funcin de una variable. Encontrar el valor mnimo de un intervalo de una funcin multidimensional. Encontrar la integral de una funcin en un intervalo definido. Resolver ecuaciones diferenciales ordinarias con condiciones iniciales.

    La manera de definir la funcin que se usar depende del grado de complejidad de la funcin; funciones annimas son las mas simples cuando la funcin es relativamente simple y un archivo de funcin cuando la funcin es muy compleja o cuando se tienen que definir el sistema de ecuaciones diferenciales.

    Para encontrar las races de la funcin 12019691133 2345 xxxxxf , se puede

    definir la funcin f por medio de una funciona annima y evaluarla con fzero como en el siguiente ejemplo, (este polinomio tiene races -3, -1, 5, -2-i2 y -2+i2). >> f=@(x) x^5+3*x^4-13*x^3-91*x^2-196*x-120 >> z = fzero(f,6) z = 5

    Para determinar el valor de la variable x donde se tiene el valor mnimo de la funcin f definida anteriormente en el intervalo [0,6] se emplea la funcin fminbnd como en el siguiente ejemplo. >> [x,fenx] = fminbnd(f, 0, 6) x = 3.5529 fenx = -1.5039e+003

    Para determinar el mnimo de una funcin de dos dimensiones se puede usar la funcin annima y fminsearch como en el siguiente ejemplo tomado de la ayuda de MATLAB.

    222 )1()(100 xxyz

  • MATLAB para novatos 34

    Figura 3.2 Script para graficar la funcin limitada en z a 100, (vase seccin 5.2), sin importar que en esta escala se percibe una regin con posibles mnimos, si se limita el crecimiento de z fcilmente se ve que el mnimo esta en (1,1) como lo indica fminsearch. >> banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2; >> [x,fval] = fminsearch(banana,[-1.2, 1]) x = 1.0000 1.0000 fval = 8.1777e-010

    Para calcular la integral reprobabilidad de Gauss de 0 a 1 se puede usar una funcin annima.

    2

    )(exp

    2

    2 2xf

    >> f = @(x) 2/sqrt(2*pi)*exp(-x.^2/2); >> Q = quad(f,0,1) Q = 0.6827

    El caso de ecuaciones diferenciales en general requiere de definir una funcin con las ecuaciones a resolver, (Simulink permite un mejor control de la simulacin y lo recomiendo)

    )5.1cos(505.3512 32

    2

    ttfdt

    df

    dt

    fd

    Que podemos reescribir con las funciones y(1)=f y y(2)=f que es la manera habitual de trabajar con ecuaciones diferenciales, escribiendo un sistema de ecuaciones diferenciales de primer orden.

    x = -2:.01:2; y = -2:.01:4; [X,Y] = meshgrid(x,y); Z=100*(Y-X.^2).^2+(1-X).^2; A=find(Z>100); Z(A)=100; surf(X,Y,Z)

  • MATLAB para novatos 35

    2

    5)5.1cos(505.3 123

    2

    12

    1

    yytt

    dt

    dy

    dt

    dy

    dt

    dfy

    fy

    Se crea el archivo con nombre derivada1.m function dy = derivada1(t,y) dy=zeros(2,1); dy(1)= y(2); dy(2)= (3+0.05*t^3+5*cos(1.5*t)-y(2)-5*(y(1)))/2; y se resuelve el sistema de ecuaciones con ode45. La nica lnea indispensable es la tercera, donde las respuesta se guarda en la columna t, y en dos columnas y una para f y otra para su derivada, si no se agrega el comando options, la simulacin procede con los parmetros tpicos, [0 10] es el intervalo de la simulacin de 0 a 10 segundos y las dos condiciones iniciales son [1.3 8]. clear all options = odeset('RelTol',1e-7,'AbsTol',[1e-7 1e-7]); [t,y]=ode45(@derivada1,[0 10],[1.3 8], options); figure(3) subplot 131 plot(t,y(:,1)); title('1');xlabel('Time [s]'); ylabel('f [a.u.]'); subplot 132 plot(t,y(:,2)); title('2');xlabel('Time [s]'); ylabel('df/dt [a.u.]'); subplot 133 plot(t(1:536),diff(y(:,2))./diff(t)); title('3');xlabel('Time [s]'); ylabel('d(df/dt)/dt [a.u.]');

    Figura 3.3 Grficas de las soluciones de la ecuacin diferencial, la seccin 5 explica la manera de hacer las graficas, el problema es resuelto una vez ms en la seccin de Simulink.

  • MATLAB para novatos 36

    3.5 Ejercicios

    1. Encontrar las primeras seis races de la funcin de Bessel de orden 1. 2. Encontrar la solucin de la ecuacin diferencial con condiciones iniciales y(0)=0,

    10

    dz

    dyen el intervalo de z (0,20] y comparar con besselj(1,z).

    0)1( 22

    22 yz

    dz

    dyz

    dz

    ydz

    Respuesta 1. 3.8317, 7.0156, 10.1735, 13.3237, 16.4706, 19.6159;

    f=@(x) besselj(1,x); z = fzero(f,4)

    2. Crear el archivo derivada2.m function dy = derivada2(t,y) dy=zeros(2,1); dy(1)= y(2); dy(2)= (-(t^2-1)*y(1)-t*y(2))/t^2;

    y resolver con ode45 [t,y]=ode45(@derivada2,[0.0001 20],[0 1]) La comparacin entre ambas debe ser igual.

  • MATLAB para novatos 37

    4 Control de flujo de programa La escritura de programas requiere que se pueda repetir alguna instruccin o tomar decisiones respecto a la direccin del programa. MATLAB dispone de estas herramientas. Las herramientas de control de programa se puede dividir en:

    Decisiones de control

    Bucles

    Acciones cuando hay error

    Finalizar el programa

    4.1 Ejemplos

    Del nmero x, indicar si es un nmero negativo, en caso de serlo; si es real no entero dividirlo entre 2 y si es entero obtener su factorial. if x < 0 disp('es un numero negativo') elseif rem(x,1) == 0 A = factorial(x) else A = x/2 end De la variable x, si tiene el valor -1 imprime uno negativo, si tiene el valor 0 imprime cero, si tiene el valor 1, imprime uno positivo, cualquier otro valor imprime otra cosa. switch x case -1 disp('uno negativo'); case 0 disp('cero'); case 1 disp('uno positivo'); otherwise disp('otra cosa'); end

    return

    try, catch

    for, while, continue, break

    if, else elseif switch, case, otherwise

  • MATLAB para novatos 38

    La siguiente instruccin se realiza 5 veces, la primera, cuando n=2, produce x(2)=2*1 y sucesivamente toma valores que son el doble del anterior, generando x=[1 2 4 8 16 32]. x=1; for n = 2:6 x(n) = 2 * x(n - 1); end

    En el siguiente ejemplo 22222 765321 A , while debera ejecutarse siempre que x < 10; continue evita que se sume 42 y break termina el bucle cuando x=7. x=x+1 se incluye al principio para evitar que x deje de crecer por continue. Las instrucciones while e if se ejecutan siempre que sean verdaderos lgicos, x==4 es verdadero solo cuando x tienen el valor cuatro. x=1; A=1; while x

  • MATLAB para novatos 39

    3.- Hacer el cdigo que permita graficar la siguiente funcin para x entre -12 y 12:

    10

    100

    010

    10

    0

    ))8(exp(

    )sin(

    0

    )(2

    x

    x

    x

    x

    x

    xxf

    4.- Dibujar un helecho! Este se puede realizar haciendo una transformacin repetida de un punto en el plano (x1, x2) por medio de la transformacin que toma al punto ix y lo transporta a un nuevo punto bA if xx , si x es un vector columna de dos elementos, las coordenadas en el plano, A es una matriz de 2x2 y b es un vector columna de dos elementos.

    a) Tomar un punto arbitrario ix =[0.5;0.5] b) Obtener un numero aleatorio R entre 0 y 1

    Si el numero aleatorio esta entre 0 y 0.85 obtener un nuevo punto fx por medio de la transformacin bA if xx , donde A1=[.85 .04;-.04 .85];b1=[0;1.6]; Si el numero aleatorio esta entre 0.85 y 0.92 obtener un nuevo punto fx por medio de la transformacin bA if xx , donde A2=[.20 -.26;.23 .22];b2=[0;1.6]; Si el numero aleatorio esta entre .92 y .99 obtener un nuevo punto fx por medio de la transformacin bA if xx , donde A3=[-.15 .28;.26 .24];b3=[0;.44]; Si el numero aleatorio esta entre .99 y 1 obtener un nuevo punto fx por medio de la transformacin if xx A , donde A4=[0 0;0 .16];

    c) graficar las coordenadas del punto sin borrar las coordinas de punto anterior d) regresar al inciso b y repetir 10000 veces.

    5. Modificar el programa para producir un triangulo de Sierpinski.

  • MATLAB para novatos 40

    a) Iniciar con el punto en el plano s=[0;0]

    b) para cada trasnformacin

    21

    21

    0

    0A

    c) se elige

    0

    0b ,

    021

    b ,

    43

    41

    b con la misma probabilidad

    Posibles soluciones: 1. N=input('numero de elementos de la serie a mostrar: '); x=zeros(N,1); x(1)=0; x(2)=1; for ii=3:N x(ii)=x(ii-2)+x(ii-1); end fprintf('Los primeros %g nmeros de la serie de Fibonacci son:\n',N) disp(int2str(x'))

    2. a=zeros (200,2); a(1,1)=rand(1); a(1,2)=a(1,1) for ii=2:200 a(ii,1)=rand(1); a(ii,2)=(a(ii-1,2)*(ii-1)+a(ii,1))/ii; end plot(a) 3. x = linspace(-12,12,1000)'; f=zeros(length (x),1); ind1=find(x>=-10 & x

  • MATLAB para novatos 41

    f(ind1)=sin(x(ind1)); ind2=find(x>0 & x=-10 && x(j)0 && x(j)

  • MATLAB para novatos 42

    p=[.33 .66 1]; A1=[.5 0;0 .5];b1=[0;0]; A2=[.5 0;0 .5];b2=[.5;0]; A3=[.5 0;0 .5];b3=[1/4;sqrt(3)/4]; A4=[.5 0;0 .5]; r=rand; if r

  • MATLAB para novatos 43

    5 Mtodos numricos En esta seccin se presentarn algunos ejemplos comunes a los cursos de mtodos numricos, se puede saltar esta seccin en la primera lectura o se pueden ver los ejemplos de manera arbitraria, la intencin es comentar el cdigo y considerarlo como una manera de ver una posible solucin a un problema simple. MATLAB tiene soluciones para todos estos problemas de manera mucho mas eficiente y elegante, aqu solo se intenta emplear a MATLAB como el medio ejecutor de las soluciones, controlar a MATLAB a que haga lo que deseamos como medio de aumentar nuestro control de las instrucciones bsicas de MATLAB.

    5.1 Mnimos cuadrados, modelo lineal.

    Tenemos una coleccin de puntos P(xi,yi) que se encuentra dispersos en el plano XY. Podemos decir que cada punto representa el resultado de un experimento, encuesta, censo, etc. Queremos encontrar una representacin lineal que mejor se aproxime a nuestros puntos obtenidos. Para eso queremos que la distancia D entre el modelo y el punto experimental sea muy pequea. Esta distancia la podemos definir como:

    *yyD i

    Donde yi es el valor real y y* es el valor modelado.

    Figura 5.1 Error D a minimizar en este mtodo. El modelo lineal para y* la podemos definir como una funcin del tipo:

    bmxy i *

  • MATLAB para novatos 44

    Entonces: bmxyD ii

    Pero queremos que esta distancia D sea pesada de igual manera sin importar si es positiva o negativa as que queremos que esto se cumpla para cada uno de los puntos por lo que debemos agregar la suma de todos los puntos P(xi,yi).

    n

    iii bmxyDR

    1

    22 )(

    Ahora para obtener los parmetros del modelo m y b que mejor se ajustan a los puntos, queremos que el error sea minimizado, para lo que obtenemos las primeras derivadas para igualarlas a cero, de esta forma minimizamos la distancia de los puntos a la funcin f y determinar nuestras constantes m y b para el modelo lineal.

    n

    ii

    n

    ii

    n

    iii

    i

    n

    iii

    xbxmxy

    xbmxym

    R

    11

    2

    1

    1

    )(2

    nbxmy

    bmxyb

    R

    n

    ii

    n

    ii

    n

    iii

    11

    1

    )(2

    Donde n es el nmero de puntos que tenemos. A continuacin resolvemos el sistema para encontrar m y b a partir de los puntos tabulados.

    n

    iii

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    yx

    y

    m

    b

    xx

    xn

    1

    1

    1

    2

    1

    1

    Despejando b de una de las ecuaciones y sustituyendo en otra obtenemos lo siguiente igual para el caso de substituir m.

  • MATLAB para novatos 45

    2

    11

    2

    1111

    2

    2

    11

    2

    111

    )(

    )(

    n

    ii

    n

    ii

    n

    iii

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    n

    iii

    xxn

    xyxyx

    b

    xxn

    yxxyn

    m

    As nos queda una funcin con coeficientes m y b de la forma y*=mxi+b. La calidad del ajuste se puede estimar por medio del coeficiente de correlacin:

    2

    11

    2

    2

    11

    2

    2

    1112

    11

    1)(

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    n

    ii

    n

    iii

    yn

    yxn

    x

    yxn

    xy

    r

    A continuacin se muestra el algoritmo realizado en MATLAB para este mtodo de mnimos cuadrados. %Ajuste de puntos por el mtodo de mnimos cuadrados, %ajustando puntos a un modelo lineal y=m*x+b %creamos un arreglo de nmeros de -10 al 10 que conste de 200 nmeros %igualmente espaciados. clear all x=linspace(-10,10,200); n=length(x); %creamos nuestro arreglo de nmeros experimentales, formados por una %correlacin definida, y=3x+5 %adems se agrega una componente aleatoria % se grafican los puntos. y=(3*x+5)+(randn(1,200))*10; plot(x,y,'*'); %Seccin de mnimos cuadrados %Ya que para encontrar m y b el denominador es el mismo lo calculamos y lo %guardamos en den. den = (n*sum(x.^2))-(sum(x))^2; %calculamos las constantes m y b de acuerdo con la formula. m = (n*sum(x.*y)-sum(x)*sum(y))/den; b= (sum(x.^2)*sum(y)-sum(x)*sum(x.*y))/den; %calculamos el coeficiente de correlacin, 1 es excelente, 0 es malo.

  • MATLAB para novatos 46

    r=(sum(x.*y)-sum(x)*sum(y)/n)^2/(sum(x.^2)-sum(x)^2/n)/(sum(y.^2)-sum(y)^2/n); n,r,m,b %graficamos esta funcin lineal en la misma ventana para comprarla %con los puntos. f=m*x+b; hold on plot(x,f,'red')

  • MATLAB para novatos 47

    5.2 Promedio y desviacin estndar activo

    El objetivo en este caso es de calcular el promedio y la desviacin estndar de un conjunto de nmeros con condicin de solo usar el valor actual y el anterior de los clculos. En este caso nx es el nmero n de la serie, nx es el promedio de los nmeros del 1 al n y

    n es la desviacin estndar de los nmeros del 1 al n. La regla es que para cada clculo

    solo se accede el nmero y los clculos inmediatos anteriores.

    El promedio se define de la siguiente manera:

    n

    iix

    nx

    1

    1

    La desviacin estndar se define de la siguiente manera:

    n

    ii xx

    n 1

    2)(1

    Si se calcula para el evento n y el evento n+1 se tiene la probabilidad de conocer el promedio a partir del nmero recientemente agregado y del promedio conocido.

    n

    iin x

    nx

    1

    1

    111

    1

    11

    1

    1

    1

    1

    1

    1

    nnn

    n

    ii

    n

    iin xxn

    nxx

    nx

    nx

    Y para la desviacin estndar, se puede obtener la nueva desviacin estndar nicamente con el valor del nmero agregado, del promedio anterior y la desviacin estndar anterior.

    n

    inin xx

    n 1

    2)(1

    ; de donde se tiene

    n

    ini

    n

    inin xnxxxn

    1

    22

    1

    22 )(

    212 1

    1

    21

    1

    211 ))(1(

    1

    1)(

    1

    1nn

    n

    ii

    n

    inin xnxx

    nxx

    n

    Substituyendo la suma de los cuadrados con el valor de n.

    212 1221 ))(1(1

    1

    nnnnn xnxxnn

    n

    %Clculo del promedio y la desviacin estndar despus de agregar un %nuevo nmero y empleando solo los valores del promedio y desviacin %estndar conocidos. %creamos un arreglo de 100 nmeros consecutivos en x %creamos un arreglo de 100 nmeros aleatorios en xx %creamos dos arreglos de 100 ceros para guardar los promedios %creamos dos arreglos de 100 ceros para guardar las desviaciones % clear all x=1:100; %xx=x; xx=rand(100,1); xpro=zeros(100,1);

  • MATLAB para novatos 48

    xdev=zeros(100,1); xproa=zeros(100,1); xdeva=zeros(100,1); % %se inicializan los promedios y las desviaciones xpro(1)=xx(1); xdev(1)=0; xproa(1)=xx(1); xdeva(1)=0; % %de acuerdo a las ecuaciones del texto, se calcula el promedio y la %desviacin por los dos mtodos, el que requiere todos los nmeros y %que emplea solo el ltimo. for m=2:100 xpro(m)=sum(xx(1:m))/m; xdev(m)=sqrt(1/m*sum((xx(1:m)-xpro(m)).^2)); xproa(m)=((m-1)*xproa(m-1)+xx(m))/m; xdeva(m)=sqrt(1/(m)*((m-1)*(xdeva(m-1)^2+xproa(m-1)^2)+xx(m)^2-(m)*xproa(m)^2)); end % %grfica simple de las cuatro curvas, deben ser idnticas por pares. plot(x,xpro,x,xdev) hold on plot (x,xproa,x,xdeva,'r')

    5.3 Algoritmo simplex

    Una compaa manufactura dos productos (A, B) que requieren de pasar por dos departamentos (, ). Producto A requiere de 2 horas en el departamento y 3 horas en el departamento . Producto B requiere de 4 horas en el departamento y 3 horas en el departamento . El tiempo disponible para fabricar ambos modelos es de 100 horas a la semana en el departamento y 90 horas a la semana en el departamento . La ganancia esperada del producto A es de 5 pesos y 7 pesos para el producto B. Determinar en nmero de productos A y B a manufacturar que maximice la ganancia suponiendo que todo artculo fabricado ser vendido. X es el nmero de productos A. Y es el nmero de productos B.

    max75 YXF ; % funcin objetivo, mxima ganancia en pesos. 10042 YX ; % restriccin, un mximo de 100 horas en departamento . 9033 YX ; % restriccin, un mximo de 90 horas en departamento .

    X>=0; % restriccin, el nmero de artculos de A es positivo. Y>=0; % restriccin, el nmero de artculos de B es positivo. Arreglar la funcin objetivo para obtener el mximo nmero para F y modificar las desigualdades agregando dos nuevas variables S1 y S2.

  • MATLAB para novatos 49

    075 YXF 100142 SYX 90233 SYX

    X, Y, S1 y S2 >=0 1. Identifica la columna pivote. Encontrar la columna con el valor ms negativo en el

    rengln de la funcin objetivo. 2. Identifica el rengln pivote. Encontrar el rengln de restricciones que produzca el

    nmero menor al dividir el nmero de la restriccin de los diferentes renglones entre el valor de la columna pivote.

    3. Hacer el elemento pivote unitario. La columna y rengln pivote forman el elemento pivote; hacer el elemento pivote unitario, dividiendo el rengln pivote entre el valor del elemento pivote.

    4. Eliminar los elementos de la columna pivote. En esa columna solo queda el elemento pivote igual a uno y los otros elementos son cero.

    5. Si algn elemento de la funcin objetivo es negativo repetir el paso uno. 6. Al cumplir la condicin anterior se tiene la optimizacin S1=S2=0 y solo falta evaluar

    X, Y y F.

    15

    25

    175

    2

    1175.005.10

    025.015.00

    075.105.11

    S

    S

    Y

    X

    F

    10

    20

    190

    2

    13/25.0010

    3/15.0100

    11001

    S

    S

    Y

    X

    F

    clear all A=[1 -5 -7 0 0 0;0 2 6.5 1 0 100;0 3 3 0 1 90]; m=length(A(:,1)); falta =0; while sum(A(1,:)0 [val,ind]=min (A(1,:));% columna pivote [val2,ind2]=min (A(:,ind)/val);% valor pivote & rengln pivote A(ind2,:)=A(ind2,:)/A(ind2,ind);% rengln pivote con elemento pivote unitario for k=1:m% columna pivote con un solo uno if k==ind2 continue end A(k,:)=A(k,:)-A(ind2,:)*A(k,ind); end

    90

    100

    0

    2

    110330

    01420

    00751

    S

    S

    Y

    X

    F

  • MATLAB para novatos 50

    falta =falta +1; end if falta ==1 ind=5-ind;% columna ind2=5-ind2;% rengln A(ind2,:)=A(ind2,:)/A(ind2,ind);% rengln pivote con elemento pivote unitario for k=1:m% columna pivote con un solo uno. if k==ind2 continue end A(k,:)=A(k,:)-A(ind2,:)*A(k,ind); End

  • MATLAB para novatos 51

    5.4 Mtodo indirecto de solucin de ecuaciones simultneas

    El producto punto puede tener la notacin matricial y escalar siguiente:

    cba

    cba

    n

    i

    n

    jjiij bac

    1 1

    , con

    diferente ndice0

    igual ndice1ij

    cba El producto crus puede tener la notacin matricial y escalar siguiente:

    cba

    cba

    n

    j

    n

    kkjijki bac

    1 1

    , con

    repetido ndice0

    cclico1

    cclico1

    ijk

    ijk

    ijk

    c

    ba Un sistema de ecuaciones algebraicas simultneas tiene la ecuacin matricial bxA Y tambin tiene la notacin escalar

    n

    jijij bxA

    1

    para nn ,,2,1

    Que al sacar xi de la suma, se pude usar para calcular a partir de una aproximacin anterior xj, una aproximacin posterior de xi.

    n

    ij

    jijijiii bxAxA

    1

    , nn ,,2,1

    De donde se obtiene la nueva aproximacin de xi

    n

    ij

    jjiji

    ii

    i xAbA

    x1

    1, nn ,,2,1 (1)

    1. Conociendo Aij y bi y una aproximacin para xj 2. Calcular el valor de xi a partir de la ecuacin (1). 3. Calcular la diferencia entre el nuevo vector xi y el viejo vector xj . 4. Si la diferencia es aceptablemente pequea ya se encontr la solucin, de no ser

    as proponer que xj es xi y repetir desde el paso 2. 5. Traducir este algoritmo en lenguaje de MATLAB y probarlo para obtener la

    solucin xi de la siguiente ecuacin.

  • MATLAB para novatos 52

    5

    1

    12

    421

    241

    114

    3

    2

    1

    x

    x

    x

    function [x,m]=gaussSeidel1(x,maxiter,epsilon) %Soluciona Ax=b por el mtodo de Gauss-Seidel. % %USO: [x,m]=gaussSeidel1(x,maxiter,epsilon) %Ejemplo: [A,m]=gaussSeidel1([0;0;0],100,1e-7) %INPUT: %x=valor inicial arbitrario del vector solucin %maxiter=numero mximo de iteraciones (si no se escribe es 500) %epsilon=tolerancia en el error (si no se escribe es 1e-7) %OUTPUT: %x=vector solucin %m=nmero iteraciones para alcanzar la solucin if nargin

  • MATLAB para novatos 53

    5.5 Races de polinomios (Mtodo de Laguerre)

    Si se tiene un polinomio de grado n

    11

    21)( nn

    nnn axaxaxaxP 1

    Un mtodo econmico para evaluar el polinomio es:

    10 )( axP ; nixxPaxP iii ,2,1);()( 11 1a

    De la misma manera se puede demostrar que se obtienen las expresiones para las primeras dos derivadas:

    0)(0

    xP ; nixxPxPxP iii ,2,1);()()( 11

    2

    0)(0

    xP ; nixxPxPxP iii ,2,1);()(2)( 11

    3

    Encontrar la primera raz y eliminar la posibilidad de repetirla )()()( 1 xPrxxP nn 4

    Si expresamos el nuevo polinomio como sigue:

    nnnn

    n bxbxbxbxP

    12

    21

    11 )( 5

    Al igualar los dos polinomios se obtiene

    111 ; nnn rbabab ni 3,2 6

    Mtodo de Laguerre Propone un polinomio especial, que de manera interactiva, puede aproximar a cualquier polinomio (algebraicamente es un caso particular, la computadora lo hace un caso general).

    1))(()( nn qxrxxP 7

    Derivando el polinomio dos veces

    qx

    n

    rxxP

    xP

    n

    n

    11

    )(

    )( 8

    22

    2

    )(

    1

    )(

    1

    )(

    )(

    )(

    )(

    qx

    n

    rxxP

    xP

    xP

    xP

    n

    n

    n

    n

    9

    De donde se puede definir

    )(

    )()(

    xP

    xPxG

    n

    n

    y 2)(

    )(

    )()( xG

    xP

    xPxH

    n

    n

    10

    Y se obtiene la formula de Laguerre, despejando (x-q) de 8 y substituyendo en 9 y resolviendo para (x-r).

    )()()1()( 2 xGxnHnxGn

    rx

    11

    El procedimiento es: 1.- Proponer un valor de prueba x como primera raz del polinomio

  • MATLAB para novatos 54

    2.- Evaluar el polinomio, su derivada y su segunda derivada en x. Como se propone aqu o como puedan. 3.- Calcular G y H, con eq. 10, solo se necesita la funcin y sus dos derivadas. 4.- Determinar r con la ecuacin 11. Eligiendo la magnitud ms grande en el denominador. 5.- r es x y repetir desde el punto 2 hasta que el error sea mnimo. Esto determina la primera raz. 6.- con las ecuaciones 6, empezar el procedimiento para la siguiente raz, con un polinomio de grado menor. Despus de esto, queda un polinomio de grado menor y con las ecuaciones: a(1)=b(1) y b(n)=a(n)+r*b(n-1) (siendo a(n) los coeficientes del polinomio de orden n y b(n) los de orden n-1) obtenemos sus coeficientes. Repetimos el procedimiento anterior (de 1 a 5) hasta obtener la segunda raz. Despus de esto quedar un polinomio de orden n-2 y volvemos a calcular sus coeficientes. Repetimos todo el procedimiento hasta encontrar todas las races. Ejemplo

    Encontrar las races del polinomio 0432 23 xxx function raiz = raices_polinomio(a,tol) % Regresa todas las races del polinomio de la forma % a(1)*xn + a(2)*x(n-1) + ... + a(n+1). %Si quieres un error mnimo usa como valor de tolerancia de entrada % tol = error de tolerancia (1.0e4*eps) n=length(a)-1; raiz=zeros(n,1); for i=1:n r=laguerre(a,tol); if abs(imag(r))

  • MATLAB para novatos 55

    if abs(G+F)>=abs(G -F); dr=n/(G+F); else dr=n/(G-F); end r=r-dr; if abs(dr)

  • MATLAB para novatos 56

    5.6 Runge Kutta

    Primer orden Una ecuacin diferencial es una regla para construir funciones a partir de sus derivadas. Para obtener la funcin por este mtodo numrico se plantea la ecuacin diferencial de la siguiente forma:

    ),( yxfy Si la ecuacin diferencial es de la forma

    )1()( ,,,,,( nn yyyyxfy

    Transformarla usando la notacin

    yy 1 ; yy 2 ; yy 3 ; )1( nn yy

    Para obtener

    ),,,,( 21

    4

    3

    2

    3

    2

    1

    nn

    yyyxf

    y

    y

    y

    y

    y

    y

    y

    ; con condiciones iniciales

    nny

    y

    y

    y

    3

    2

    1

    3

    2

    1

    en x=xini

    En algunas situaciones, como el caso de sistemas de ecuaciones diferenciales de orden mayor a uno, es necesaria hacer algo parecido para cada ecuacin diferencial. Finalmente se tienen tantas ecuaciones diferenciales como la suma de los rdenes de las ecuaciones de que se parte. La construccin de la funcin (x, y) se hace partiendo de la condicin inicial y por medio de la definicin de la derivada o Taylor a primer orden

    h

    xyhxy

    dx

    dyh

    )()(lim

    0

    Que en la aproximacin de h pequeo o Taylor truncado da )()()( xyhxyhxy RK-primer orden

    Mtodo R-K de cuarto orden

    ),,,,( 211 nyyyxh FK

    )2

    ,2

    ( 12K

    FK yh

    xh

    )2

    ,2

    ( 23K

    FK yh

    xh

    ),( 34 KFK yhxh

    )22(6

    1)()( 4321 KKKK xyhxy RK-cuarto orden

    Ejemplo

  • MATLAB para novatos 57

    Un ejemplo para ilustrar este mtodo se puede obtener del siguiente caso: El movimiento newtoniano en coordenadas polares es:

    rrrerra r )2()(2

    Figura 1. Esquema de un objeto de masa mucho menor que la tierra que se desplaza por efecto de la atraccin gravitatoria. De donde se propone el siguiente conjunto de ecuaciones:

    r

    r

    y

    y

    y

    y

    4

    3

    2

    1

    Y se obtiene el conjunto de ecuaciones diferenciales siguientes:

    1

    42

    4

    21

    241

    2

    4

    3

    2

    1

    2

    y

    yyy

    y

    GMyy

    y

    y

    y

    y

    y

    Para las que podemos emplear las siguientes condiciones iniciales: Posicin radial inicial, y1(0)=R+H=(6378.14 + 772) 10

    3= 7. 15014 106 m Velocidad radial inicial, y2(0)=0 m/s Posicin angular inicial, y3(0)=0 rad Velocidad angular inicial, y4(0)= Vo/r(0) = 6700 /(7.1501 10

    6 ) = 0.937045 103 rad/s Este archivo se llama ruku.m %Mtodo de Runge Kutta de cuarto orden %para resolver ecuaciones diferenciales %con condiciones iniciales. %Esta funcin tienen que ser modificada %y agregar las condiciones iniciales para %t(ini) y para la funcin y(t=ini). %La funcin y se obtiene de un arreglo de %ecuaciones diferenciales de primer orden. % [Y]=[F(t,y)]

    Vo=velocidad inicial

    H=altura inicial

    R=Radio de la tierra

    r

    2

    2

    r

    GMrr

    r

    r

    2

  • MATLAB para novatos 58

    function [B]=ruku() [t,Y,h]=CI(); y=Y(1,:); for m= 2:length(t); K1=h*yprima(t(m-1),y); K2=h*yprima(t(m-1)+h/2,y+K1/2); K3=h*yprima(t(m-1)+h/2,y+K2/2); K4=h*yprima(t(m-1)+h,y+K3); y=y+(K1+2*K2+2*K3+K4)/6; Y(m,:)=y; end B=[t' Y]; function [t,y,h]=CI() tini=0;%CAMBIAR t INICIAL tfin=1200;%CAMBIAR t FINAL h=50;%CAMBIAR PASO t=tini:h:tfin; y=zeros(length(t),4);%CAMBIAR COLUMNAS CON VARIABLES y(1,:)=[7.1501e6 0 0 9.3704e-004];%CAMBIAR Y INICIAL function [yp]=yprima(t,y) yp=zeros(1,4); yp(1)=y(2); yp(2)=y(1)*y(4)^2-3.9860e14/y(1)^2; yp(3)=y(4); yp(4)=-2*y(2)*y(4)/y(1);

  • MATLAB para novatos 59

    5.7 Descomposicin de LU

    Es un mtodo muy utilizado en programacin para resolver sistemas de ecuaciones lineales, tiene la gran ventaja de ser un mtodo fcil y rpido. La descomposicin LU se basa en el proceso de eliminacin de gauss. Es conveniente usar descomposicin de LU cuando se requiere resolver un sistema de ecuaciones lineales de la forma Ax=b que requiere varias iteraciones. Supongamos que la matriz A se puede descomponer como el producto de dos matrices triangulares, una llamada L (lower triangular) y otra llamada U (upper triangular). Existen varias posibilidades para este producto, aqu se hablara de la descomposicin de Doolittle

    mnmmm

    n

    n

    n

    aaaa

    aaaa

    aaaa

    aaaa

    321

    3333231

    2232221

    1131211

    nn b

    b

    b

    b

    x

    x

    x

    x

    3

    2

    1

    3

    2

    1

    El cual representan el sistema lineal Ax=b, y que se puede escribir LUx=b, ya que podemos representar a A como un producto de una cierta matriz triangular inferior (L) y otra matriz triangular superior (U), de la forma:

    [ L][U]=[A] Donde

    1

    01

    001

    0001

    321

    3231

    21

    mmm lll

    ll

    l

    L

    mn

    n

    n

    n

    u

    uu

    uuu

    uuuu

    U

    000

    00

    0

    333

    22322

    1131211

    Observe que los elementos de la diagonal principal de L siempre son iguales a 1 (si la matriz A es cuadrada), y siempre tiene elementos iguales a cero en la parte triangular superior de la matriz. U siempre tiene elementos iguales a cero en su parte triangular inferior. Los dems valores de los elementos de las matrices L y U se obtienen mediante la eliminacin de gauss.

    Al aplicar el mtodo de la eliminacin de gauss y escalonar la matriz A, esta pasa a ser la matriz triangular superior U. En la matriz L se extraen de manera ordenada los coeficientes que se utilizaron para escalonar la matriz, por ejemplo, nos interesa que los

  • MATLAB para novatos 60

    elementos de las posiciones a21, a31, de la matriz A, sean ceros, esto lo podemos lograr sustrayendo un mltiplo adecuado de las filas de A

    renglon2 = renglon2 - m21 * renglon1, donde m21 = a21/a11 renglon3 = renglon3 - m31 * renglon1, donde m31 = a31/a11 Estas operaciones hacen cero los elementos a21 y a31 respectivamente. Por lo tanto en la matriz triangular inferior L, asignamos en la posicin L21 el valor del coeficiente m21 que se utiliz para hacer cero el elemento de la posicin a21, y en L31 asignamos de igual manera el valor de m31,

    1

    01

    001

    0001

    321

    3231

    21

    mmm lll

    lm

    m

    L

    Y as sucesivamente para los dems elementos de L, hasta escalonar A y obtener todos los valores de la matriz triangular inferior L. Una vez que obtenemos LU, descomponemos A en el sistema de ecuaciones

    [L][U][x] = [b] Proponemos

    [U][x]=[z] sustituimos [L][z]=[b] Donde conocemos los valores de [L] y del vector [b], y se obtienen los valores de [z] haciendo una sustitucin hacia adelante.

    1

    01

    001

    0001

    321

    3231

    21

    mmm lll

    ll

    l

    nn b

    b

    b

    b

    z

    z

    z

    z

    3

    2

    1

    3

    2

    1

    Posteriormente podemos conocer el valor de [x], por medio de una sustitucin hacia atrs, de [U][x]=[z] ya que se conoce a [z] y a [U].

  • MATLAB para novatos 61

    mn

    n

    n

    n

    u

    uu

    uuu

    uuuu

    000

    00

    0

    333

    22322

    1131211

    nn z

    z

    z

    z

    x

    x

    x

    x

    3

    2

    1

    3

    2

    1

    A continuacin se presenta un algoritmo de programacin en Matlab, sobre una manera de obtener la descomposicin LU de una matriz cuadrada A=round(rand(5)*10); %Definimos una matriz arbitraria cuadrada de nmeros enteros aleatorios del 1 al 10 n=length(A(:,1)); %Se asigna a la variable n la longitud de las %columnas de A L=zeros(n);%Se reserva el espacio para L y U, para que no %estn creciendo dentro de los ciclos U=zeros(n); for k = 1:n %Este es nuestro ciclo principal L(k, k) = 1; %Elementos de la diagonal principal de L %iguales a uno for i = k+1:n L(i,k) = A(i, k) / A(k, k);%Se guardan de manera ordenada %en L los coeficientes con los que vamos a escalonar la %matriz A for j = k+1:n A(i, j)= A(i, j) - L(i, k)*A(k, j);%Se escalona la matriz A end end for j = k:n U(k, j) = A(k, j);%Al terminar la matriz A, pasa a ser la matriz U end end

  • MATLAB para novatos 62

    5.8 Interpolacin suave (splines)

    Se tienen n pares de puntos. De donde se tiene que son n-1 segmentos Asignando una cbica en cada segmento, con 4 incgnitas por segmento Produce 4(n-1) incgnitas totales De cada segmento conocemos sus extremos

    2(n-1) incgnitas conocidas La pendiente es continua en cada unin de segmentos (n-