SlideShare una empresa de Scribd logo
1 de 280
Descargar para leer sin conexión
Matlab en cinco lecciones de Num´rico
                                e

V´
 ıctor Dom´
          ınguez B´guena
                  a              Ma Luisa Rap´n Banzo
                                             u



                   Febrero de 2006




                     Disponible en
    http://www.unavarra.es/personal/victor dominguez/
Prefacio
Bo
     El origen de este libro es una asignatura de libre elecci´n que uno de los autores im-
                                                              o
 parti´ durante los cursos 2004–2005 y 2005–2006 en la Universidad P´blica de Navarra.
      o                                                                    u
 Nuestra intenci´n original era tratar temas algo avanzados de C´lculo Cient´
                  o                                                  a           ıfico y utilizar
 Matlab como v´ para su aprendizaje. Los alumnos, obviamente, estaban m´s interesados
                 ıa                                                              a
 en aprender Matlab y ve´ el Num´rico como forma de probar y ensayar las diferentes
                           ıan          e
 herramientas de Matlab que se iban exponiendo en clase. Desafortunadamente, la forma-
 ci´n en Num´rico de nuestros alumnos nos oblig´ a relajar considerablemente el contenido
   o          e                                    o
 matem´tico del curso y a ser m´s modestos, desde el punto de vista te´rico, en nuestros
         a                         a                                        o
  rra
 objetivos. El resultado final en su vertiente matem´tica se podr´ enmarcar sin problemas
                                                      a             ıa
 en un curso introductorio de C´lculo Num´rico. En cuanto a Matlab, creemos que hemos
                                  a           e
 tratado todos sus aspectos fundamentales aunque en ocasiones sea de forma superficial.
 Nuestro objetivo era conseguir no tanto un conocimiento muy profundo de Matlab como
 el de colocar al alumno en una buena posici´n de arranque para un autoaprendizaje.
                                                o
     El enfoque y los temas tratados son consecuencia de diversos factores entre los que
 conviene citar nuestro propio bagaje matem´tico1 , el uso que hemos tenido que hacer de
                                                a
 Matlab en nuestra carrera investigadora y, como ya hemos mencionado, los conocimientos
 de partida que ten´ nuestros propios alumnos. Hemos insistido bastante en la manip-
                     ıan
      o                                               o                            ´
 ulaci´n de vectores y matrices y a la programaci´n en forma vectorizada. Esta es una
 de las diferencias m´s acusadas con los lenguajes de programaci´n tradicionales y una
                       a                                               o
 implementaci´n eficiente en Matlab pasa necesariamente por la vectorizaci´n.
               o                                                                o
     Los apuntes est´n organizados en torno a temas o lecciones, cada cual dividido en dos
                     a
     do
 partes, la primera de Matlab y la segunda con un tema espec´     ıfico de C´lculo Num´rico.
                                                                             a            e
 En la primera parte se presentan los aspectos instrumentales de Matlab que utilizaremos
 en la implementaci´n de los algoritmos de la parte de Num´rico. La longitud de cada
                      o                                           e
 parte es variable, y dependiente de la dificultad tratada ya sea en la parte instrumental
 (Matlab) o en la parte matem´tica. De tanto en tanto nos hemos permitido hacer algo de
                                a
 Matem´ticas tratando de presentarlas en la forma m´s simple posible.
         a                                              a
     A lo largo de estas p´ginas el lector podr´ encontrar ejercicios, algunos de ellos resuel-
                          a                     a
 tos, que tratan de ahondar en puntos espec´  ıficos, matem´ticos e inform´ticos. Finalmente
                                                           a               a
 se han introducido algunas notas hist´ricas que describen brevemente la evoluci´n que han
                                        o                                           o
       r
 tenido las ideas a lo largo del tiempo. Con ello tratamos de combatir la idea gaussiana,
 demasiado extendida, de las Matem´ticas como un mundo est´tico, monol´
                                       a                         a             ıtico y perfecto
 donde la teor´ se presenta cerrada y completa. Las Matem´ticas en general y el C´lculo
               ıa                                              a                         a
 Cient´ıfico en particular recorren un largo trecho antes de llegar a este estado, durante
 el cual brotan ideas constantemente, siempre prometedoras en un primer momento, que
   1
       modelado por nuestra formaci´n cient´
                                   o       ıfica, com´n en muchos aspectos.
                                                    u

                                                   i
evolucionan con los a˜os, con muchas de ellas desechadas finalmente e incluso algunas
                        n
 rescatadas a˜os despu´s de considerarse como v´ muertas.
               n         e                        ıas
     Hemos adjuntado al final una bibliograf´ utilizada en este texto. Nos gustar´ resaltar
                                             ıa                                    ıa
 tres textos sobre los dem´s. En primer lugar, Numerical Computing with Matlab, de Cleve
                            a
 Moler, que descubrimos cuando and´bamos en la redacci´n de la Lecci´n II. Su sencillez
                                      a                    o               o
 y la buena elecci´n de ejemplos ha ejercido una influencia considerable en estas notas.
                   o
Bo
     El segundo libro es ya un cl´sico entre los que aprendimos Matlab hace algunos a˜os.
                                 a                                                       n
 And´bamos entonces en la b´squeda de recursos en la web cuando nos encontramos con
      a                        u
 unos apuntes muy completos de libre divulgaci´n. Nos referimos al libro de Garc´ de
                                                   o                                   ıa
 Jal´n y sus colaboradores, Aprenda Matlab ?.? como si estuviera en primero. Diferentes
    o
 versiones de estos apuntes llevan cubriendo de forma incansable la evoluci´n de Matlab
                                                                                o
 desde la versi´n 4.0.
                o
     Por ultimo, aunque no es un texto propiamente, la enciclopedia libre on line Wikipedia2
         ´
 ha sido utilizada profusamente para obtener datos y fuentes utilizadas en la redacci´n de
                                                                                       o
 este texto. Debemos se˜alar que estas informaciones han sido debidamente contrastadas.
                          n
 A pesar de algunos problemas iniciales, es seguro que la influencia de esta enciclopedia
 libre crecer´ exponencialmente en el futuro.
             a
     Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayas
  rra
 que se ofreci´ muy generosamente a revisar este libro. Sus numerosas y acertadas indica-
               o
 ciones y sugerencias han contribuido, y mucho, en la redacci´n final de este texto.
                                                               o
     do
 Pamplona, Febrero de 2006                                     V´
                                                                ıctor Dom´
                                                                         ınguez B´guena
                                                                                 a
                                                                 a
                                                               M Luisa Rap´n Banzo
                                                                           u
       r
   2
       http://www.wikipedia.org

                                             ii
Bo
              A Javier
      Amigo y maestro.
  rra
     do
       r
r
     do
  rra
Bo
Cap´
    ıtulo 1
Bo
 Introducci´n
           o
                                         ... and the first lesson of all was the basic trust that he
                                         could learn. It is shocking to find how many people do
                                         not believe they can learn, and how many more believe
                                         learning to be difficult.
  rra
                                                                                               Dune
                                                                                       Frank Herbert

 1.1.       ¿Qu´ es?
               e
     Matlab es un entorno de trabajo para el c´lculo cient´
                                              a            ıfico. Programado originalmente
 por Cleve Moler a finales de los a˜os 70, su finalidad original era proporcionar una forma
                                     n
 sencilla de acceder a las librer´ LINPACK y EISPACK donde est´n implementadas de una
                                 ıas                              a
 forma altamente eficiente los algoritmos clave del an´lisis matricial1 . De hecho, Matlab es
                                                      a
 una abreviatura de Matrix Laboratory
     Su primera implementaci´n se hizo en Fortran que era, y en buena medida a´n sigue
                                o                                                   u
 si´ndolo, el lenguaje est´ndar en la implementaci´n de m´todos num´ricos2 . Posterior-
   e                        a                       o        e            e
     do
 mente se reimplement´ en C, que es como se encuentra en la actualidad.
                         o
     Las aplicaciones de Matlab se fueron extendiendo a otras ramas del c´lculo cient´
                                                                             a          ıfico
 y de las ciencias aplicadas en general, dot´ndole de una gran popularidad en ambientes
                                            a
 cient´
      ıficos (especialmente en Ingenier´ Dichas extensiones se consiguieron en gran parte
                                       ıa).
 mediante la implementaci´n de toolboxes, librer´ escritas en el lenguaje de programaci´n
                             o                  ıas                                       o
 propio de Matlab y que ampliaban el rango de problemas que pod´ resolverse.
                                                                     ıan
     Sin miedo a equivocarse, se pueden enunciar las siguientes ´reas donde Matlab muestra
                                                                a
 un gran potencial:

        a
        ´lgebra lineal num´rica;
                          e
       r
        procesamiento de se˜ales (an´lisis, compresi´n de datos,..);
                           n        a               o
    1
      por ejemplo, el m´todo de Gauss, el c´lculo de las descomposiciones m´s habituales del ´lgebra
                         e                   a                                 a                a
 matricial num´rica (LU , LL , QR), m´todos iterativos,...
                 e                      e
    2
      Fortran significa Formula translation. Desarrollado por IBM en 1954, es considerado como el primer
 lenguaje de alto nivel. Las ultimas actualizaciones (Fortran 95 y Fortran 2003) han dado nuevo vigor a
                             ´
 este veterano lenguaje de programaci´n.
                                      o

                                                   1
dise˜o de sistemas de control;
           n

       salidas gr´ficas;
                 a

       estad´
            ıstica;
Bo
       simulaci´n de sistemas din´micos.
               o                 a

    La extensa gama de problemas que cubre hace de Matlab un lenguaje dif´ de entender
                                                                          ıcil
 y manejar en su completitud. Esto no quiere decir que sea inarbodable: el conocimiento
 base que permite empezar a trabajar es muy sencillo. No obstante el elevado n´mero de
                                                                                u
                                                      3
 comandos que se encuentra a disposici´n del usuario provoca que en ocasiones existan
                                        o
 problemas no s´lo para encontrar los comandos adecuados sino tambi´n para tener una
                o                                                      e
 idea de qu´ posibilidades exactamente ofrece Matlab en un problema o tarea en particular.
           e


 1.2.      ¿C´mo trabaja?
             o
  rra
     El lenguaje de programaci´n de Matlab es bastante m´s flexible que el de los lenguajes
                                o                           a
 tradicionales. No es preciso la declaraci´n inicial de variables, ´stas se pueden introducir
                                          o                        e
 en el momento que se necesiten, y por ejemplo, vectores y matrices pueden declararse
 sin especificar sus dimensiones e incluso cambiar sus tama˜os sobre la marcha. Ello per-
                                                               n
 mite una programaci´n algo m´s desordenada, aunque debe tenerse bien claro que una
                        o         a
 programaci´n cl´sica, m´s al uso, suele generar c´digo m´s eficiente.
             o    a       a                          o       a
     Por otro lado, una gran cantidad de m´todos num´ricos se encuentran implementados
                                            e            e
 de una forma muy eficiente y son accesibles como simples comandos. De esta forma, Mat-
 lab se puede utilizar como una caja negra: el usuario pregunta y el ordenador responde sin
 que ´ste tenga que preocuparse de qu´ tipo de operaciones se han efectuado por el camino.
      e                                e
 De todas formas es conveniente tener una idea de qu´ m´todos se est´n utilizando para
                                                         e e               a
 as´ ser conscientes de en qu´ condiciones van a funcionar, cu´l es en cada caso el m´to-
   ı                          e                                  a                       e
     do
 do adecuado, y especialmente el significado de los, posiblemente, numerosos argumentos
 opcionales que controlan el funcionamiento del algoritmo.
     A priori se pueden distinguir dos tipos de funciones en Matlab: funciones compiladas
 (Built in functions) y funciones no compiladas. Las primeras est´n optimizadas, son pro-
                                                                     a
 gramas ya compilados y con el c´digo no accesible para el usuario. Como ejemplos se
                                    o
 pueden citar

       operaciones fundamentales +, *,. . . .

       las funciones matem´ticas b´sicas (sin, cos, exp, log,. . . )
                          a       a
       r
                              ´
       algoritmos b´sicos del Algebra Lineal (inv, det, lu, chol, qr,...)
                   a

       s´lidas gr´ficas (plot, surf,...)
        a        a
   3
    A modo de ejemplo, estos comandos cubren salidas gr´ficas: plot, line, ezplot, ezsurf, surf,
                                                       a
 surfc, line, patch, plot3, contour, contourf, ezcontour, pcolor, trimesh, trisurf,...

                                                2
Las funciones no compiladas est´n escritas siguiendo el lenguaje de programaci´n
                                      a                                                o
 propio de Matlab. Estos comandos se guardan en ficheros *.m que es la extensi´n est´ndar
                                                                              o     a
 de los ficheros de Matlab4 .
     Originalmente, Matlab funcionaba como un interprete. Es decir, cada l´ınea de c´digo
                                                                                    o
 era traducido antes de su ejecuci´n. Ello hac´ que una programaci´n similar a lenguajes
                                  o           ıa                    o
 cl´sicos de programaci´n diera lugar a c´digo poco eficiente.
   a                    o                 o
Bo
     Este problema se puede subsanar en gran medida recurriendo a la programaci´n vec-
                                                                                  o
 torizada. El siguiente ejemplo muestra las diferencias con una programaci´n est´ndar
                                                                          o     a

   No vectorizada                                   Vectorizada



   y=zeros(1,1000);                                 y=sin(linspace(0,2*pi,1000));
   h=2*pi/999;
   for i=0:999
         y(i+1)=sin(h*i);
  rra
   end



 En la primera parte del c´digo, encontramos una estructura t´
                              o                                     ıpica en los lenguajes de
 programaci´n: el comando for. Su significado es claro: las l´
             o                                               ıneas comprendidas entre el for
 y end se repiten 1000 veces con la variable i tomando valores de 0 a 999. El resultado final
 es el vector fila y que recoge el valor del seno en 1000 puntos uniformemente espaciados
 en [0, 2π].
     Por otro lado, el comando linspace devuelve un array que contiene 1000 puntos
 equidistantes entre 0 y 2π. La funci´n seno es aplicada sobre todo el array devolviendo
                                       o
 un vector con estos valores que se guarda en y. La diferencia entre ambas formas de
 programar es ahora patente. Mientras que en la primera realizamos 1000 llamadas a la
     do
 funci´n seno con un argumento por llamada, en la segunda hay una unica llamada donde
       o                                                                 ´
 se requiere el c´lculo del seno en 1000 puntos, y el resultado se devuelve en un vector con
                  a
 estos valores (y por tanto tambi´n de longitud 1000).
                                   e
     Desde el punto de vista de Matlab el segundo c´digo es m´s eficiente. Habitualmente,
                                                      o          a
 la vectorizaci´n lleva consigo una reducci´n del c´digo a la vez que se incrementan las
                o                             o       o
 necesidades de memoria.
     Con Matlab 6.5 se inici´ un proyecto a m´s largo plazo consistente en la aceleraci´n
                               o                  a                                         o
 (Performance Acceleration) de las versiones no vectorizadas dirigida a estrechar las difer-
 encias con los lenguajes cl´sicos de alto nivel como Fortran, C o Pascal5 . En cualquier caso,
                             a
       r
 la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en contraste
 con operaciones elemento a elemento como en los lenguajes tradicionales, es algo que
 conviene explotar por las importantes ventajas que proporciona.

   4
    Tambi´n est´ la extensi´n *.mat, propia de ficheros de datos.
            e  a           o
   5
    De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecuci´n entre los dos c´digos
                                                                          o                 o
 expuestos.

                                                3
1.3.     ¿C´mo aprenderemos?
            o
     Como ya hemos se˜alado anteriormente, aprender a manejar Matlab en su totalidad
                        n
 est´ fuera de los contenidos de un curso introductorio como ´ste. No as´ aprender los
    a                                                              e          ı
 fundamentos y preparar el terreno para un autoaprendizaje de las partes en las que cada
 uno est´ interesado. Encontramos en este punto dos dificultades que salvar: saber de la
         e
Bo
 existencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primera
 es la mayor dificultad. No obstante los comandos llevan siempre nombres nemot´cnicos e
 para facilitar su memorizaci´n. Las funciones de ayuda tambi´n echan una mano.
                              o                                  e
     Como a programar se aprende programando, comenzaremos escribiendo c´digo desde
                                                                                 o
 los primeros pasos. Los esquemas num´ricos que implementaremos se encuentran pr´cti-
                                        e                                               a
 camente en cualquier curso introductorio de An´lisis Num´rico. En cada lecci´n imple-
                                                    a          e                   o
 mentaremos dichos algoritmos, introduciendo ´rdenes, estructuras de decisi´n, datos,...
                                                  o                             o
 seg´n sea necesario.
    u
     En los apuntes se incluyen m´ltiples ejercicios cuya realizaci´n ayudar´ al aprendizaje
                                 u                                 o        a
 de la asignatura. Estos apuntes no deben tomarse como un manual en el estilo usual, sino
 como una forma de aprender Matlab y repasar o aprender el An´lisis Num´rico b´sico.
                                                                     a          e      a
 Ya existen manuales extensos y concienzudos, en la bibliograf´ citamos algunos de ellos,
                                                                 ıa
  rra
 que pueden servir para ese fin.
     do
       r
                                             4
Bo
                  Lecci´n I
                       o

         Primeros pasos en Matlab.
  rra
 M´todos directos para sistemas de ecuaciones
  e
                   lineales
     do
       r
                      5
r
     do
  rra
Bo
Introducci´n
           o
Bo
                                    When asked whether a programming language supports
                                    matrices, many people will think of two-dimensional
                                    arrays and respond, “Yes.” Yet matrices are more than
                                    two-dimensional arrays -they are arrays with operations.
                                    It is the operations that cause matrices to feature so
                                    prominently in science and engineering

                                                          G.W. Stewart, Matrix Algorithms
  rra
     Comenzaremos en la primera parte de esta lecci´n tratando nociones b´sicas de Matlab,
                                                    o                     a
 introduciendo el entorno de trabajo y las estructuras b´sicas de programaci´n. En segundo
                                                        a                   o
 lugar entraremos en uno de los detalles fuertes de Matlab, la manipulaci´n de vectores y
                                                                          o
 matrices.
     En la parte matem´tica estudiaremos m´todos directos para la resoluci´n de sis-
                         a                      e                                o
 temas de ecuaciones lineales. En la implementaci´n de estos algoritmos repasaremos los
                                                    o
 conocimientos de Matlab expuestos en la primera parte.
     do
       r
                                            7
r
     do
  rra
Bo
Cap´
    ıtulo 2
Bo
 Matlab: Primeros pasos

 2.1.     Entorno de trabajo
     En las primeras secciones comenzaremos explorando Matlab de la forma m´s simple, en
                                                                               a
 modo comando: el usuario pregunta y Matlab responde. El interfaz de Matlab es bastante
 pobre, con un aspecto est´tico que en modo alguno es comparable al de programas como
                           e
  rra
 Maple o Mathematica. El modo interactivo de trabajar es sencillo aunque algo inc´modo. A
                                                                                  o
 modo de ejemplo, requiere algo de esfuerzo editar instrucciones ejecutadas con anterioridad
                                                            ´
 y manejarse con bloques de comandos es muy engorroso. Este y otros problemas del modo
 interactivo se subsanan en gran medida empaquetando instrucciones con ficheros script
 y/o programando en funciones (subrutinas) que es la forma natural de trabajar en Matlab.
 En un segundo paso, se puede implementar un interfaz gr´fica, las guides de Matlab, que
                                                              a
 hacen m´s amigable la comunicaci´n con el usuario.
          a                         o
     En la Figura 2.1 podemos ver el aspecto inicial de Matlab. Distinguimos las siguientes
 ventanas

      Command window: ventana donde podemos ejecutar los comandos;
     do
      Ventanas auxiliares: command history, workspace, current directory que informan
      sobre (y permiten editar) los comandos insertados, las variables declaradas y el
      directorio en el que estamos trabajando.

      Ventana de ayuda: en una ventana independiente proporciona un acceso completo
      a las funciones de ayuda de Matlab, incluyendo b´squedas, demostraciones, etc.
                                                      u
    ´
    Estas son las caracter´
                          ısticas b´sicas que debemos considerar:
                                   a

      El prompt de Matlab es >>. El usuario escribe a continuaci´n.
                                                                o
       r
      Para ejecutar se pulsa la tecla Enter.

      Se pueden recuperar comandos anteriores navegando con las flechas ↑ y ↓.

    Cuando se trabaje en Matlab, debemos tener muy en cuenta que:

      Se distinguen may´sculas y min´sculas.
                       u            u

                                               9
2.1 Entorno de trabajo                                                          ´
                                                                            LECCION I
Bo
  rra
                             Figura 2.1: Pantalla Principal.

      Todos los comandos de Matlab se escriben en min´sculas y los argumentos se env´
                                                     u                              ıan
      entre par´ntesis separados por comas.
               e
     do
      El car´cter % se utiliza para insertar comentarios. Todo lo que sigue (en la misma
             a
      l´
       ınea) es ignorado por Matlab.

      Si se teclea al final de una instrucci´n ’;’ ´sta se ejecuta pero el resultado no se
                                           o      e
      visualiza por pantalla.

      Dos comandos se pueden insertar en la misma l´  ınea separados por “,” o por “;”. La
      diferencia entre los dos es que con “,” se muestran los resultados de las operaciones
      mientras que con “;” la operaci´n se ejecuta pero no se visualiza.
                                        o
       r
 Ejercicio 2.1 Ejecuta las instrucciones

        >>   4+4 % mi primera operacion
        >>   3^4, 4/9
        >>   3^4; 4/9
        >>   3^4, 4/9;
        >>   3^4; 4/9;

                                            10
´
 LECCION I                                               ıtulo 2. Matlab: Primeros pasos
                                                      Cap´

 y observa la salida.

     Haremos algunos comentarios sobre el ejercicio anterior. El circunflejo ^ es la poten-
 ciaci´n:
      o

        >> 3^5
Bo
        ans=

              243

 El t´rmino ans es la primera variable que vemos de Matlab. Concretamente, guarda la
     e
 ultima salida dada por Matlab (answer):
 ´

        >> 4+6

        ans =

              10
  rra
        >> ans*2

        ans =

              20

        >> ans*2

        ans =

              40
     do
 La ra´ cuadrada se puede calcular bien elevando a 1/2 (^(1/2)) o bien utilizando sqrt.
      ız

 Ejercicio 2.2 Comprueba la diferencia entre

        4/4+6           4/(4+6)    3^5*2          3^(5*2)

 Nota. La prioridad de ejecuci´n entre operaciones matem´ticas es la habitual: primero
                                 o                             a
 se calcula la potenciaci´n ^, posteriormente los productos y divisiones *, / y en ultimo
                         o                                                             ´
 lugar, las sumas y restas + y -. Este orden se puede cambiar utilizando los par´ntesis.
                                                                                      e
 La regla es sencilla: dada una expresi´n, lo primero que se calcula es lo que est´ dentro
                                        o                                           a
       r
 de cada par´ntesis. Esta regla es recursiva, es decir, si dentro de un par´ntesis hay otros
              e                                                             e
 par´ntesis, para evaluar el primero se empezar´ con los par´ntesis interiores.
     e                                           a             e
     Los n´meros reales se pueden insertar tambi´n en notaci´n cient´
           u                                      e            o      ıfica, muy adecuada si
 se trata de n´meros grandes o muy peque˜os (en valor absoluto). As´ se tiene la siguiente
               u                           n                           ı,
 regla de construcci´n:
                     o
                                  m · 10r              m er

                                             11
2.1 Entorno de trabajo                                                                     ´
                                                                                       LECCION I

 Por ejemplo

              0.005                     5e − 3             115 · 1012                   115e12
        −1201200000               −1.2012e009            0.00031415               3.1415e − 004

     Existen adem´s dos n´meros especiales: inf y NaN. El primer signo representa la can-
                   a       u
Bo
 tidad infinita (∞). El segundo es una abreviatura de “no es un n´mero” (Not a Number)
                                                                   u
 y es el resultado que se devuelve ante una operaci´n indefinida como 0/0. Este s´
                                                      o                               ımbolo
 se puede utilizar en ´mbitos, en principio tan extra˜os, como en el dibujo de superficies
                       a                               n
 (v´r la Lecci´n V).
   e          o
     En general los resultados num´ricos se presentan con cuatro cifras decimales correctas,
                                   e
 aunque todas las operaciones se ejecutan en doble precisi´n1 . Si se desean las salidas con
                                                             o
 toda la precisi´n disponible se debe insertar la instrucci´n
                o                                          o

          >> format long

 A partir de este punto, el resultado de cualquier operaci´n se mostrar´ con 16 cifras
                                                          o            a
 significativas. La instrucci´n
                            o
  rra
          >> format short

 devuelve a la forma est´ndar con cuatro cifras decimales. Existen m´s opciones con format.
                        a                                           a
 Las siguiente l´
                ıneas muestran algunas de ellas:

          >> pi % el numero pi

          ans =

               3.1416

          >> format long          % mayor precision
          >> pi
     do
          ans =

             3.14159265358979

          >> format compact % compacto
          >> pi
          ans =
             3.14159265358979
          >> format bank    %No fijo de cifras decimales
       r
          >> pi
          ans =
              3.14
    1
     Aproximadamente 16 cifras decimales correctas. En el momento de redactar estas l´ ıneas, los proce-
 sadores de 32 bits dominan todav´ el parqu´ de ordenadores. Las nuevas generaciones, con procesadores
                                    ıa        e
 con 64 bits, duplican la precisi´n de trabajo.
                                 o

                                                  12
´
 LECCION I                                             ıtulo 2. Matlab: Primeros pasos
                                                    Cap´

        >> format rat         %salidas en forma fraccionaria
        >> pi
        ans =
           355/113
        >> format loose       % mas espaciada
        >> pi
Bo
        ans =

           355/113
 Observa la diferencia de espaciamiento que se obtiene con las opciones compact y loose.

 N´ meros complejos
  u
    La √aritm´tica compleja se encuentra tambi´n integrada en Matlab. La unidad imagi-
             e                                e
 naria ( −1) se representa en Matlab con i ´ j:
                                           o
        >> clear i j % borramos posibles valores de i y j
  rra
        >> i^2

        ans=

           -1

        >> j^2

        ans=

           -1
     do
 El signo i suele ser habitual en Matem´ticas mientras que en diversas ramas de la F´
                                       a                                              ısica
 y en Ingenier´ de Telecomunicaciones o El´ctrica se prefiere el s´
               ıa                           e                     ımbolo j (en este caso
 para no confundir con la intensidad de corriente el´ctrica). De ah´ que Matlab permita
                                                     e             ı
 ambas representaciones.
     Todas las operaciones matem´ticas incluyen la aritm´tica compleja en el sentido usual
                                  a                     e


        >> 1+i +5-6i            % suma de dos numeros complejos

        ans =
       r
               6.0000 - 5.0000i

        >> (5+3i)*(5-3i), (1+2i)/(3-4i)

        ans =


                                            13
2.2 Comandos de ayuda                                                           ´
                                                                            LECCION I

             34.00


        ans =

            -0.20
Bo
 +
        >> conj(3e-3+2e-4i) % conjugado

        ans =

              0.0030 - 0.0002i

        >> abs(3+4i),     angle(2i)     % modulo y argumento

        ans =

              5
  rra
        ans =

              1.5708


 2.2.      Comandos de ayuda
    La ayuda de Matlab es ciertamente muy clara y completa. Los comandos siempre
 dispuestos a echarnos una mano son:

       help: muestra una ayuda por pantalla, en la ventana de comandos, con la informa-
     do
       ci´n esencial sobre un comando concreto.
         o

       helpwin: similar a help pero despliega la ayuda en una ventana auxiliar, permitien-
       do as´ una navegaci´n, estilo web, muy c´moda.
            ı              o                    o

       lookfor: permite buscar una cadena en la primera l´
                                                         ınea de todos los ficheros de
       ayuda.

     Por ejemplo, si deseamos ayuda sobre la funci´n sin, podemos ejecutar
                                                  o

        >> help sin
       r
         SIN    Sine.
           SIN(X) is the sine of the elements of X.

         Overloaded methods
         help sym/sin.m

                                            14
´
 LECCION I                                                      ıtulo 2. Matlab: Primeros pasos
                                                             Cap´
Bo
  rra
                                  Figura 2.2: Pantalla de ayuda.

 o bien
          >> helpwin sin
     do
 y obtener la pantalla que se muestra en la Figura 2.3. Adem´s, si aparece el enlace “Go to
                                                            a
 online doc for ...”, ´ste nos permite navegar entre una ayuda mucho m´s completa
                          e                                                     a
 donde se muestran ejemplos y detalles sobre la implementaci´n del comando (ver la Figura
                                                            o
    2
 2.4 ).

 Ejercicio 2.3 Utilizando las funciones de ayuda, obtener informaci´n de alguna de estas
                                                                   o
 funciones elementales de Matem´ticas
                                a
          sin          cos            tan           asin           acos            atan
          sec          csc            cot           asec           acsc            acot
       r
          sinh         cosh           tanh          asinh          acosh           atanh
          exp          log            log10         log2           sign
 Mediante la instrucci´n
                      o
    2
      Para que esta opci´n est´ disponible es necesario que se haya instalado la ayuda completa de Matlab.
                        o      e
 A partir de la versi´n 6.0 la instalaci´n consta de (al menos) dos CDs, el primero con el programa y las
                     o                  o
 librer´ habituales y el segundo con la documentaci´n de la ayuda.
       ıas                                             o

                                                   15
2.3 Variables                                                                     ´
                                                                              LECCION I
Bo
  rra
 Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opci´n Go to online doc...
                                                            o

        >> help +

 se pueden adem´s visualizar las operaciones “elementales” seg´n Matlab.
               a                                              u
     do
 2.3.      Variables
     Matlab no necesita la declaraci´n de variables como en un lenguaje tradicional. En prin-
                                    o
 cipio todas las variables son reales, y basta hacer uso de ellas para que queden declaradas:

        >> a=1; b=2; c=3;
        >> a-b

        ans =
       r
             -1

        >> a*b*c

        ans =

                                             16
´
 LECCION I                                             ıtulo 2. Matlab: Primeros pasos
                                                    Cap´
Bo
  rra
                               Figura 2.4: Ayuda on line.



                6
     do
    El comando who sirve para conocer los nombres de las variables declaradas, mientras
 que con whos obtenemos una informaci´n m´s precisa:
                                      o    a

        >> who

        Your variables are:

        a   b       c

        >> whos a
       r
        Name      Size                           Bytes   Class

        a               1x1                          8   double array

        Grand total is 1 element using 8 bytes

 Para borrar una variable se utiliza la instrucci´n clear, por ejemplo,
                                                 o

                                            17
2.3 Variables                                                                             ´
                                                                                      LECCION I

         >> a=4;
         >> whos a

            Name         Size                            Bytes      Class

              a            1x1                                  8   double array
Bo
          Grand total is 1 element using 8 bytes

         >> clear a
         >> whos a
         >>
 borra la variable (es decir, whos no devuelve nada). Con la orden
         >> clear all
 se borran todas las variables declaradas hasta el momento.
  rra
 Nota. En Matlab es correcto declaraciones de este tipo
         >> sin=1;
         >> sin+1

         ans=

              2
 De esta forma sin pasa a ser una variable que sobrescribe el valor original que ten´ como
                                                                                    ıa
 funci´n seno. Para recuperar el valor original basta ejecutar
      o
         >> clear sin
     do
 Almacenamiento de variables en ficheros
    Matlab ofrece la posibilidad de grabar las variables que deseemos en un fichero. De esta
 forma, podemos recuperarlas m´s adelante, ya sea en la misma sesi´n o en otra diferente3 .
                                 a                                  o
 Por ejemplo
         >>   a=4+i;% numero complejo
         >>   b1=cos(2);
         >>   b2=sin(2);
         >>   save datos a b1 b2
       r
 graba dentro del directorio de trabajo, en un fichero de nombre datos.mat, las variables
 indicadas. Para recuperar, basta ejecutar
         >> load     datos
    3
     Se entiende por sesi´n el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar el
                         o
 programa, todas las variables locales se pierden.

                                                  18
´
 LECCION I                                                         ıtulo 2. Matlab: Primeros pasos
                                                                Cap´

 2.4.         Ficheros script y funciones
     La forma m´s eficiente de empaquetar series de instrucciones simples y mec´nicas es
                 a                                                               a
 utilizando ficheros script. Tareas m´s elaboradas, con, por ejemplo, variables de entrada
                                     a
 y salida, requieren del uso de funciones.
Bo
 2.4.1.        Ficheros script
     Un fichero script es un simple documento de texto que contiene una sucesi´n de co-
                                                                                  o
 mandos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamente
 en la ventana de comandos.
     Describiremos el manejo de este tipo de ficheros mediante un sencillo ejemplo. Comen-
 zamos creando un fichero tecleando en modo comando la orden4
           >> edit prueba
 Se despliega as´ en una ventana aparte el editor de Matlab con el fichero prueba.m (“.m”es
                ı
 la extensi´n est´ndar de Matlab). Es importante saber cu´l es el directorio de trabajo5 ,
           o      a                                          a
 pues es donde se guardar´ por defecto el fichero.
                           a
  rra
     Tecleamos ahora en el editor
           a=1+i; b=1-i;
           disp(’a*b=’)
           disp(a*b)
           disp(’a/b=’)
           disp(a/b)
           disp(’sqrt(a)=’)
           disp(sqrt(a))
 El comando disp (de display) muestra vectores por pantalla de forma compacta. Dado que
 para Matlab un cadena de caracteres es simplemente un vector de car´cteres, se consigue
                                                                      a
 con ello mostrar por pantalla mensajes de forma concisa.
     Una vez que el documento est´ grabado, para ejecutar las ´rdenes que contiene basta
                                   a                          o
     do
 teclear el nombre del fichero en la ventana de comandos:
           >> prueba
 Se puede modificar las veces que se precise las variables a y b en el fichero script sin tener
 que teclear de nuevo todas las instrucciones.

 2.4.2.        Funciones
      En principio existen dos tipos de funciones: las funciones inline, que se insertan en
 la l´
     ınea de comandos y las que se escriben en un documento de texto externo. Esta ultima
                                                                                      ´
       r
 forma, que es la evoluci´n natural de los ficheros script, es m´s flexible y es en la que nos
                          o                                     a
 centraremos a continuaci´n. Dejaremos pendiente para la Lecci´n III la descripci´n de las
                            o                                     o                 o
 funciones inline.
      Como antes, para crear un fichero que contenga a una funci´n se puede teclear:
                                                                   o
   4
       Tambi´n es posible crear este fichero a golpe de rat´n.
             e                                            o
   5
       Por defecto es C:MATLAB6p5work.

                                                     19
2.4 Ficheros script y funciones                                                 ´
                                                                            LECCION I

              >> edit mifuncion

 En el editor puedes insertar este simple ejemplo:

 01           % MIFUNCION
 02           %
Bo
 03           % Y=MIFUNCION(X) devuelve
 04           %
 05           %     Y=X^2-COS(X)
 06           %
 07           function y=mifuncion(x)
 08
 09           y=x^2-cos(x);
 10
 11           return

 La funci´n se declara con function, la variable de entrada es x y se declara como variable
          o
 de salida y. Se termina la ejecuci´n de la funci´n cuando se ejecuta un return o bien se
                                   o              o
 llega al final de la funci´n6 .
                          o
  rra
     Ahora, para calcular el valor de π 2 − cos(π) podemos ejecutar la orden:

              >> mifuncion(pi)

              ans =

                     10.8696

 Nota. Los n´meros correlativos situados a la izquierda no forman parte del c´digo
               u                                                                  o
 de la funci´n. Han sido insertados con el fin de numerar las l´
             o                                                 ıneas y as´ facilitar los
                                                                         ı
 comentarios que podamos hacer sobre el programa.
    Una funci´n puede no tener salidas, por ejemplo,
              o
     do
 01           % INFORMACION
 02           %
 03           % INFORMACION devuelve informacion sobre
 04           % la precision de la maquina
 05           %
 06           function informacion
 07
 08           disp(’precision de la maquina’)
 09           disp(eps)
       r
 10           disp (’mayor numero real’)
 11           disp(realmax)
 12           disp (’menor numero real’)
 13           disp(realmin)
 14           return
      6
          En este sentido, el return del ejemplo anterior es superfluo.

                                                        20
´
 LECCION I                                             ıtulo 2. Matlab: Primeros pasos
                                                    Cap´

 o bien devolver m´ltiples salidas:
                  u
 01     % MIFUNCION2
 02     %
 03     % [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve
 04     %
Bo
 05     % Y1=X1+X2+X3;
 06     % Y2=X1-X2+X3;
 07     %
 08     function [y1,y2]= mifuncion2(x1,x2,x3)
 09
 10     y1=x1+x2+x3;
 11     y2=x1-x2+x3;
 12
 13     return
 Observa c´mo se recogen los resultados
          o
        >> [z1,z2]=mifuncion2(1,2,3);
  rra
        >> z1

            ans=

                 6

        >> z2

            ans=

                 2

        >> z=mifuncion2(1,2,3);       % Ahora solo devuelve el primero
     do
            ans=

                 6
 La cabecera que hemos introducido en el pre´mbulo de las funciones, es decir las l´
                                                a                                     ıneas
 anteriores a la declaraci´n de la funci´n y precedidas con “%”, constituyen la ayuda de la
                          o             o
 funci´n:
      o
        >> help mifuncion2
       r
         MIFUNCION2

         [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve

         Y1=X1+X2+X3;
         Y2=X1-X2+X3;

                                            21
2.5 Vectores y matrices                                                                   ´
                                                                                      LECCION I

 Aunque muy recomendables7 , su inclusi´n en una funci´n es opcional. La ayuda puede
                                        o               o
 estar antes o despu´s de la declaraci´n de la funci´n. En cualquiera de los dos casos,
                     e                o             o
 Matlab despliega como ayuda todas las l´ıneas que esten precedidas con % hasta que se
 encuentra con la primera l´
                           ınea no comentada.
Bo
 Nota. Para ser consecuentes, lo correcto es denominar de igual modo a la funci´n y       o
 al archivo que la contiene. Sin embargo esto no es obligatorio, es decir, se pueden dar
 nombres distintos, pero en este caso Matlab da preferencia al nombre del archivo.
     Aunque Matlab distingue entre may´sculas y min´sculas en sus comandos, esto no es
                                            u            u
 extensible para funciones programadas en m-files, al menos en Windows. Es decir, para
 ejecutar una funci´n en un archivo, digamos, operaciones, se puede utilizar OPERACIONES,
                    o
 Operaciones y cualquier combinaci´n con may´sculas y min´sculas. Esto es debido a que
                                      o            u            u
 el sistema de archivos de Windows tampoco hace esa distinci´n8 . Versiones m´s avanzadas
                                                                o                a
 de Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordancia
 exacta min´sculas-may´sculas entre el nombre del fichero y el comando utilizado para
              u           u
 llamarlo.
  rra
     Todas las variables se env´ por valor, no por referencia. Es decir, si una funci´n
                                 ıan                                                         o
 modifica una variable de entrada, esta modificaci´n se pierde cuando finalice su ejecuci´n,
                                                     o                                      o
 recuperando el valor original.
     Por ultimo, en un fichero se pueden incluir varias funciones. En este caso s´lo la primera
          ´                                                                     o
 funci´n es accesible desde el exterior (l´
       o                                  ınea de comandos, otras funciones,...) mientras que
 el resto de funciones presentes en ese fichero son internas, es decir, utilizables unicamente
                                                                                   ´
 por las funciones presentes en el archivo. Esto es importante a la hora de realizar una
 programaci´n modular. Si un conjunto de funciones son s´lo utilizadas por una funci´n
              o                                               o                              o
 principal, se pueden insertar en el mismo fichero que ´sta. Evitamos as´ llenar la carpeta
                                                         e                  ı
 de trabajo, o de nuestro proyecto, con ficheros y m´s ficheros.
                                                       a


 2.5.       Vectores y matrices
     do
     Dado que principalmente trabajaremos s´lo con arrays de una y dos dimensiones
                                              o
 hablaremos en lo que sigue de los objetos matem´ticos correspondientes: vectores y ma-
                                                  a
 trices. Todo lo que sigue se puede adaptar a arrays con m´s dimensiones, aunque por
                                                             a
 simplificar, nos centraremos ahora en el manejo de vectores y matrices y dejaremos pen-
 diente para la Lecci´n IV el uso de arrays multidimensionales (tensores).
                     o


 2.5.1.      Definici´n de matrices y vectores
                    o
    Un vector o una matriz se puede definir dando sus elementos entre corchetes y sepa-
       r
 rando filas mediante “;”. Por ejemplo, las instrucciones
    7
      No hay que subestimar nunca la capacidad de olvido de uno mismo: el c´digo claro y legible de hoy
                                                                            o
 es ilegible semanas despu´s. Las ayudas facilitan la edici´n de los programas no s´lo para un usuario
                           e                               o                       o
 externo sino para el propio programador.
    8
      Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombre
 Operaciones.m

                                                  22
´
 LECCION I                                                      ıtulo 2. Matlab: Primeros pasos
                                                             Cap´

         >> a=[1 3 -1; 2 3 4; 4 5 1];
         >> a2=[1 2 4; -1 0 1; 2 1 5];
         >> b=[1; 3; 1]; b2=[-1 1 -2 2];
 definen las    matrices y vectores
                                                              
         1     3 −1                1 2 4                         1
Bo
   a=   2     3 4  , a2 =  −1 0 1  ,                   b =  3 ,    b2 =    −1 1 −2 2 .
         4     5 1                 2 1 5                         1
 Matlab distingue entre vectores fila y columna por lo que habr´ que tenerlo en cuenta por
                                                              a
 ejemplo cuando se desee hacer operaciones como sumas o productos.
    Desde una vertiente pr´ctica, si se va a trabajar con una matriz grande, por ejemplo
                           a
 de tama˜o 20 × 10, y sus valores se van a introducir m´s adelante, se puede empezar con
         n                                              a
         >> a=zeros(20,10);
 A partir de este instante se pueden insertar los elementos, accediendo a cada posici´n
                                                                                     o
 mediante par´ntesis
              e
         >> a(4,5)=9; a(2,1)=6; a(1,1)=-3.4;
  rra
         >> a(4,5)

         ans=

               9
 En cualquier caso, si tratamos de introducir un valor en una posici´n no definida de la
                                                                    o
 matriz, Matlab ir´ adaptando el tama˜o seg´n juzgue apropiado9 , y no dar´ ning´ n
                   a                    n      u                             a      u
 error. El siguiente ejemplo ilustra esta caracter´
                                                  ıstica
         >> clear c % c esta borrado
         >> c(1,2)=4 % c es ahora 1 x 2

         c =
     do
                   0               4

         >> c(3,3)=2       % c pasa a ser 3 x 3

         c =

                   0               4                   0
                   0               0                   0
                   0               0                   2
       r
 Esta habilidad, aunque permite una programaci´n muy flexible y descuidada, debe uti-
                                                 o
 lizarse con mesura dado que puede provocar errores de ejecuci´n muy dif´
                                                              o         ıciles de detectar.
    9
     Ello obliga a que haya que redimensionar constantemente la memoria otorgada a la variable a. Esto
 supone un costo adicional, inapreciable con ejemplos peque˜os, pero importante para grandes cantidades
                                                           n
 de memoria. Por tanto es mejor declarar primero las dimensiones de la matriz e informar as´ a Matlab de
                                                                                           ı
 cu´nta memoria tiene que reservar.
   a

                                                  23
2.5 Vectores y matrices                                                          ´
                                                                             LECCION I

 2.5.2.     Operaciones
     Todas las operaciones habituales entre matrices, tales como la suma, producto, poten-
 ciaci´n, c´lculo de determinantes, inversas..., est´n ya implementadas en Matlab. No hay
      o    a                                        a
 por tanto necesidad de programarse estas tareas. Por ejemplo, si a y a2 son matrices de
 tama˜os compatibles, las instrucciones
       n
Bo
        a*a2         a^2         a+a2
 devuelven el producto matricial de a y a2, el cuadrado de a (es decir, a*a) y la suma de
 a y a2.
    Es importante observar la diferencia con estas l´ıneas
        a.*a2         a.^2
 En el primer caso, se devuelve la matriz resultado de multiplicar elemento a elemento
 a y a2 (por tanto deben tener el mismo tama˜o) y en el segundo, una matriz cuyas
                                                n
 entradas son el cuadrado de las de a. Esto es una constante en Matlab: el signo “.”
 indica que la operaci´n (un producto, una potencia o una divisi´n) se hace elemento a
                      o                                          o
 elemento, mientras que en caso contrario se calcula la operaci´n matem´tica, en este
                                                               o         a
 caso el producto matricial.
  rra
 Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tama˜o. Observa el resultado de
                                                             n
 ejecutar
        a+a2         a*a2          a.*a2
 Define un vector b fila o columna y ejecuta
        b.^3         b’
 Comprueba si estas operaciones est´n bien definidas
                                   a
        a*2         a+1
 ¿Qu´ hacen exactamente? ¿Por qu´ crees que no es necesario “.” en la primera instrucci´n?.
    e                           e                                                      o
     do
    Otros comandos importantes son
        det         inv        /                  /.       .
 Los dos primeros son el determinante y la inversa de una matriz cuadrada. Los operadores
 “/” y “” (slash y backslash) son ciertamente especiales:
      a/a2 es equivalente a a*inv(a2),              aa2 es equivalente a inv(a)*a2
 En cuanto a su relaci´n con ./ y . es la misma que ha surgido antes, esto es, aplicado
                      o
 sobre matrices procede a realizar los cocientes elemento a elemento. Requiere por tanto
 que ambas matrices tengan el mismo tama˜o. n
       r
 Ejercicio 2.5 Ejecuta las instrucciones
        >> 3/5
        >> 35
 y observa el resultado. ¿Tiene sentido desde el punto de vista anterior?.
 Ejercicio 2.6 Dado b una matriz, ¿qu´ hace 1/b?.
                                     e

                                              24
´
 LECCION I                                             ıtulo 2. Matlab: Primeros pasos
                                                    Cap´

 Nota. El operador backslash “” se utiliza profusamente para resolver sistemas de ecua-
 ciones lineales, bajo la idea de que

                                   Ax = b   ⇔    x = A−1 b.

 As´ si b es n × 1 y a es n × n,
   ı,
Bo
        >> x=ab;

 devuelve en x la soluci´n del sistema correspondiente.
                        o
     El funcionamiento real de  dista mucho de ser tan simple. Esto es, no calcula la
 inversa de a para multiplicarla por b, sino que resuelve el sistema de ecuaciones por
 alguna variante del m´todo de Gauss. Se puede utilizar helpwin mldivide (o helpwin
                       e
 mrdivide para /) para leer en detalle c´mo procede este comando.
                                         o
     Las funciones propias de Matlab trabajan de forma natural sobre vectores y matrices.
 El resultado final es equivalente a aplicar el comando elemento a elemento. Por ejemplo,

        >> a=[0 pi/3; -pi/3 0];
        >> cos(a)
  rra
        ans =

          1.0000       0.5000
          0.5000       1.0000

 es equivalente a

        >> [cos(0) cos(pi/3); cos(-pi/3) cos(0)]

        ans =

          1.0000       0.5000
     do
          0.5000       1.0000

 2.5.3.    Detalles adicionales
 C´mo obtener las dimensiones de vectores y matrices
  o
    Los comandos de Matlab size y length nos proporcionan esta informaci´n:
                                                                        o

        >> a3=[1 2; 3 6; 5 -1];
        >> size(a3)
       r
        ans =

              3       2

        >> length(a3)


                                            25
2.5 Vectores y matrices                                                         ´
                                                                            LECCION I

         ans =

          3

        >> a3=a3’; % cambiamos la forma de a3
        >> size(a3)
Bo
         ans =

          2       3

        >> [m,n]=size(a3); % m son las filas y n las columnas
        >> m

         ans =

          2
  rra
        >> n

         ans =

          3

        >> length(a3)

         ans =

          3
     do
     El comando size devuelve un vector de tama˜o 2×1 con el n´mero de filas y columnas
                                                   n              u
 del vector/matriz. El resultado es diferente seg´n se aplique a vectores fila o columna. La
                                                 u
 orden length devuelve la longitud de una matriz o vector. Su significado en el caso de un
 vector est´ clara mientras que para matrices devuelve el m´ximo entre el n´mero de filas
           a                                                 a                u
 y el n´mero de columnas.
       u

 Matrices especiales
     Matlab dispone de una serie de comandos que permiten construir matrices con una
 estructura particular. Cabe se˜alar las siguientes ´rdenes:
                               n                    o
       r
      eye(n) es la matriz identidad de orden n;

      ones(m,n) es una matriz m x n de 1s;

      zeros(m,n) es una matriz m x n de 0s, esto es, igual que ones pero con ceros;

      y algunas m´s ex´ticas como hilb, invhilb, pascal, magic.
                 a    o

                                            26
´
 LECCION I                                                      ıtulo 2. Matlab: Primeros pasos
                                                             Cap´

    Existen dos formas de introducir vectores cuyos valores siguen una distribuci´n regular
                                                                                 o

      a:b:c construye el vector de valores [a a+b a+2*b .... a+k*b] donde a+k*b es
      el mayor n´mero natural que cumple a+k*b≤ c. La instrucci´n a:c toma b = 1.
                u                                              o

      linspace(a,b,n) devuelve una partici´n uniforme de [a, b] en n puntos.
                                          o
Bo
    Por ejemplo,

        >> 0:10

        ans=

            0 1 2 3 4 5 6 7 8 9 10

        >> 10:-1:0

        ans=
  rra
             10    9   8   7    6   5   4   3   2    1   0

        >> 0.1:0.3:1.5

        ans =

               0.1000      0.4000           0.7000       1.0000       1.3000

        >> linspace(0,2,4)

        ans =
     do
               0       0.6667       1.3333      2.0000

        >> linspace(2,0,4)

        ans =

               2.0000      1.3333           0.6667              0

 Nota. Cuando Matlab tiene que devolver un vector y no se le especifica el formato,
 devuelve una fila.
       r
 2.5.4.    Acceso a partes de matrices
    El manejo de partes de vectores y matrices, as´ como la eliminaci´n de filas o columnas,
                                                  ı                  o
 cambios de tama˜o, etc, se hace v´ instrucciones muy simples en Matlab. Aunque pueda
                   n                 ıa
 resultar algo extra˜o al principio, un poco de pr´ctica es suficiente para que el usuario se
                     n                            a

                                                27
2.5 Vectores y matrices                                                             ´
                                                                                LECCION I

 adapte a la nueva sintaxis, tan diferentes a la de un lenguaje tradicional, y pueda utilizarlo
 en sus c´digos.
         o
    Comencemos viendo un ejemplo:

        >> a=[1 2 3; 4 5 6; 7 8 9; 10 11 12];
        >> a(2,3)    % elemento (2,3) de a
Bo
        ans =

                6

        >>a(2,:)        % fila 2 de a

        ans =

                4   5   6

        >>a(:,1)        % columna 1
  rra
        ans =

               1
               4
               7
              10

        >>a(:,2)=0 % columna 2 es ahora 0

        a =
     do
            1       0        3
            4       0        6
            7       0        9
           10       0       12

 Podemos acceder a partes de una fila o columna:

        >> a(1,2:3)         % vector [a(1,2) a(1,3)]

        ans =
       r
                0       3

        >> a(2:4,3)         % vector columna [a(2,3); a(3,3); a(4,3)]

        ans =


                                              28
´
 LECCION I                                                ıtulo 2. Matlab: Primeros pasos
                                                       Cap´

               6
               9
              12

        >> a(1:2,2:3) % matriz [a(1,2) a(1,3); a(2,2) a(2,3)]
Bo
        ans =

               0      3
               0      6

 En general, si p es un vector de n´meros enteros, v(p) devuelve [v(p(1)), v(p(2)),
                                   u
 ..., v(p(n))]. Por ejemplo,

        >> v=[0.1 0.2 0.3 0.4 0.5 0.6];
        >> v(4:-1:2)

        ans=
  rra
            0.4000        0.300    0.2000

        >> p=[5 1 2 3 3 3];        % no importa que esten repetidos
        >> v(p)

        ans=

            0.5000        0.1000     0.2000         0.3000    0.3000     0.3000

 Ejercicio 2.7 Ejecuta las siguientes l´
                                       ıneas

        >> a=[1 2 3 4; 5 6 7 8; 9 10 11 12];
     do
        >> p=[1 3 2]; q=[1 2 1];
        >> a(p,q)

 ¿Qu´ hacen exactamente?.
    e

    Igualmente es f´cil a˜adir filas y columnas a una matriz:
                   a     n

        >> a=[1 2 3 4; 5 6 7 8]

        a =
       r
               1      2      3       4
               5      6      7       8

        >> a=[a; [1 -1 2 4]]       % adosamos una fila nueva

        a =

                                               29
2.6 Bucles y estructuras de decisi´n
                                   o                                                 ´
                                                                                LECCION I


               1      2       3         4
               5      6       7         8
               1     -1       2         4

        >> a=[a [0; 2; 4] ]         % una nueva columna
Bo
        a =

               1      2       3         4         0
               5      6       7         8         2
               1     -1       2         4         4

    Si se desea eliminar una fila o columna se puede utilizar el s´
                                                                 ımbolo vac´ []. Por
                                                                           ıo
 ejemplo,

        >> a(:,2)=[]       % suprime la segunda columna
  rra
        a =

              1      3       4      0
              5      7       8      2
              1      2       4      4

 Ejercicio 2.8 Programa una funci´n cuyas entradas sean una matriz cuadrada y un t´rmino
                                     o                                                  e
 independiente compatible y que devuelva la matriz ampliada del sistema de ecuaciones lineales.
 Esto es, una matriz con la matriz original y una ultima columna con el t´rmino independiente.
                                                  ´                      e


 2.6.      Bucles y estructuras de decisi´n
                                         o
     do
     Claves en cualquier lenguaje de programaci´n, Matlab dispone de varias de ellas entre
                                                o
 las que sobresalen for e if, un est´ndar en el mundo de la inform´tica.
                                    a                             a

 2.6.1.     Bucles: el comando for
    En Matlab, la estructura

        for j=inicio:paso:final
        .....
        end
       r
 implementa un bucle donde las l´
                                ıneas de c´digo entre for y end son ejecutadas repetida-
                                          o
 mente con j tomando los valores del vector inicio:paso:final (v´ase la Secci´n 2.5.3)
                                                                   e           o
    Por ejemplo,

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

                                                  30
´
 LECCION I                                                  ıtulo 2. Matlab: Primeros pasos
                                                         Cap´


            2

            3

        >> for j=6:-2:2;      disp(j-2);     end
Bo
           4

            2

            0


 En general, si v es un vector,
        for j=v
        .....
        end
  rra
 procede a ejecutar las l´
                         ıneas internas con j tomando los valores del vector v. Por ejemplo,
        >> v=[2 5 3 1];for j=v;          disp(j);    end
           2

            5

            3

            1
 Asociados a for, y en general a cualquier bucle, encontramos los comandos break y
 continue. El primero fuerza la salida inmediata del bucle mientras que el segundo reini-
     do
 cializa la iteraci´n con el siguiente valor del ´
                   o                             ındice.

 Ejercicio 2.9 La matriz de Hilbert de orden n es
                                    1 1 ··· ···              1
                                                                  
                                        2                    n
                                 1 1 ··· ···                1     
                                 2 3                       n+1    
                           A= . .
                                 . .. ... ...               .     
                                 .                          .
                                                             .
                                                                   
                                                                   
                                     1                1       1
                                     n              2n−2    2n−1

 Construye la matriz anterior mediante un fichero script y el uso de dos “for” anidados.
       r
 2.6.2.    Operadores l´gicos y estructuras de decisi´n
                       o                             o
    Los operadores l´gicos m´s b´sicos en Matlab son
                    o       a a
        == igualdad,      ~= desigualdad,            >      mayor,        <   menor,
        >= mayor o igual, <= menor o igual,          &      “y” l´gico,
                                                                 o        |   “o” l´gico
                                                                                   o

                                             31
2.6 Bucles y estructuras de decisi´n
                                   o                                                   ´
                                                                                  LECCION I

 El resultado de una comparaci´n es 1 si es verdadero, 0 si es falso:
                              o
           >> a=1; b=2; c=3;
           >> a>0

           ans =
Bo
                  1

           >> a>0 & b<3

           ans =

                  1

           >> a<0     |   b<1

           ans =
  rra
                  0

           >> test= (a~=0)

           ans =

                  1

           >> whos test

           Name           Size                            Bytes   Class
     do
           test           1x1                                 1   logical array

           Grand total is 1 element using 1 bytes
 Estos “0” y “1” no son valores num´ricos sino l´gicos como se comprueba con la ultima
                                      e           o                                ´
 instrucci´n10 . Cuando se aplica a un vector, devuelve un vector de verdadero/falso de la
          o
 misma longitud que el vector original:
           >> b=[1 2 -3 -1 2 -4];            p=(b>=1)     % entradas de b>=1

               p=
       r
                1         1      0       0       1        0
 En el ejemplo anterior, p(i)==1 si b(i)≥1 y cero en caso contrario. Ahora, podemos
 aislar los elementos mayores o iguales que 1 simplemente con
  10
       Ocupan un unico byte mientras que un n´mero real utiliza ocho bytes.
                 ´                           u

                                                     32
´
 LECCION I                                               ıtulo 2. Matlab: Primeros pasos
                                                      Cap´

        >> b(p)

            1        2     2

 Desde este punto de vista es correcta y recomendable utilizar la instrucci´n
                                                                           o

        >> b(b>=1)       % elementos de b mayores o iguales que 1
Bo
            1        2     2

 que adem´s resulta muy natural (y f´cil de entender).
         a                          a


 Nota. El comando logical puede utilizarse para construir vectores y estructuras l´gicas
                                                                                  o
 a partir de vectores de n´meros enteros:
                          u

        >> b=[2 4 6 8 10]; p=[1 0 0 1           1];
        >> b(p) % Dara error
  rra
        ??? Subscript indices must either be real positive integers or logicals.

        >> p=logical(p);
        >> b(p)

        ans =

              2      8      10


     La estructura de decisi´n, como en muchos otros lenguajes, es if. Su sintaxis es la
                            o
 siguiente:
     do
      if simple: si la operaci´n l´gica efectuada es verdadera, se ejecutan las l´
                              o o                                                ıneas de
      c´digo comprendidas entre if y end
       o

             if (x<-1 | x>1)
                 disp(’valor absoluto de x mayor que 1’)
             end

      if compuesto: como el anterior, pero un nuevo conjunto de l´ ıneas, comprendidas
      entre else y end son ejecutadas en caso de que la operaci´n l´gica efectuada en el
                                                               o o
      if sea falsa:
       r
             if (x<0 & x>-10)
                f=x^2;      % x entre -10 y 0
             else
                f=sin(x^2); % x menor que -10 o mayor que 0
             end

                                           33
2.6 Bucles y estructuras de decisi´n
                                   o                                               ´
                                                                              LECCION I

       if de decisi´n m´ltiple:
                   o   u

              if (x<0)
                 f=x.^2;
                 disp(’x menor que cero’)
              elseif (x<sqrt(pi))
Bo
                 f=sin(x^2);
                 disp(’x en [0,sqrt(pi))’)
              elseif (x<2*sqrt(pi))
                 f=(x-sqrt(pi))^2;
                 disp(’x en [sqrt(pi),2*sqrt(pi))’)
              else
                 f=pi*cos(x^2);
                 disp(’x en [2*pi,infinito)’)
              end

       Esta ultima instrucci´n es equivalente a anidar diferentes estructuras if, de la sigu-
             ´              o
       iente forma
  rra
              if (x<0)
                 f=x.^2;
                 disp(’x menor que cero’)
              else
                 if (x<sqrt(pi))
                     f=sin(x^2);
                     disp(’x en [0,sqrt(pi))’)
                 else
                     if (x<2*sqrt(pi))
                        f=(x-sqrt(pi))^2;
                        disp(’x en [sqrt(pi),2*sqrt(pi))’)
     do
                     else
                        f=pi*cos(x.^2);
                        disp(’x en [2*pi,infinito)’)
                     end
                 end
              end

       Obviamente, la primera forma es m´s clara y concisa.
                                        a

 Nota. Con la instrucci´n switch se puede implementar una estructura de decisi´n que
                          o                                                         o
       r
 es esencialmente equivalente a un if anidado.
     Est´ disponible tambi´n el bucle while que procede a ejecutar un bucle (que se cierra
        a                  e
 tambi´n con un end) mientras una condici´n sea verdadera. Por tanto, es algo m´s flexible
       e                                   o                                     a
 que un for.
     En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. El
 uso de break y continue es exactamente el mismo.

                                             34
´
 LECCION I                                             ıtulo 2. Matlab: Primeros pasos
                                                    Cap´

     Por ultimo, y volviendo a end, este comando tiene una curiosa funcionalidad extra:
         ´
 sirve para referenciar el ultimo elemento de una fila o columna de una matriz. Por ejemplo
                           ´
 b(4:end) selecciona todos los elementos de b desde la posici´n cuarta en adelante.
                                                              o

 Ejercicio 2.10 ¿Qu´ hace el siguiente fragmento de c´digo?
                   e                                 o
Bo
 01     r=[]; aux=0;
 02     while aux<0.8
 03           aux=rand(1);
 04           r=[r aux];
 05     end
 06     r(end)=[];

 Ejercicio 2.11 Con la ayuda de Matlab, programa un par de ejemplos donde utilices switch
 y while.

 Ejercicio 2.12 (Un poco de todo) Implementa una funci´n de nombre findnonzeros
                                                           o
 que dado un vector de entrada devuelva el n´mero de elementos no nulos y un vector que
                                            u
 contenga dichos elementos.
  rra
 Soluci´n. Una implementaci´n posible es la siguiente
       o                   o
 01     % FINDNONZEROS
 02     %
 03     % [N,P]=FINDNONZEROS(X) devuelve
 04     %
 05     % N el numero de elementos no nulos en el vector X
 06     % P un vector con los elementos no nulos de X
 07     %
 08     function [n,p]=findnonzeros(x)
 09
     do
 10     p=[]; % p es vacio
 11     for i=1:length(x)
 12         if (x(i)~=0) % si x(i) no es cero
 13             p=[p x(i)]; % apuntamos i al vector p
 14         end
 15     end
 16     n=length(p);
 17     return
 Observa como se recogen los resultados de la funci´n, n y p,
                                                   o
       r
        >> a=[0.1 0. 0.3 0.1 0.6 0 0.1 0.2 0.4]; % vector!!
        >> [n,p]=findnonzeros(a)

        n =

              7

                                            35
2.6 Bucles y estructuras de decisi´n
                                   o                                              ´
                                                                             LECCION I


        p =

           Columns 1 through 5

           0.1000      0.3000       0.1000        0.6000    0.1000
Bo
           Columns 6 through 7

           0.2000      0.4000

 Otra posible implementaci´n (mucho m´s elaborada y m´s propia de Matlab) es la sigu-
                          o          a               a
 iente

 01     % FINDNONZEROS
 02     %
 03     % [N,P]=FINDNONZEROS(X) devuelve
 04     %
  rra
 05     % N el numero de elementos no nulos en el vector X
 06     % P un vector con los elementos no nulos de X
 07     %
 08     function [n,p]=findnonzeros(x)
 09
 10     p=x(x~=0);
 11     n=length(p);
 12     return

     Haz un esfuerzo en entender bien los comandos anteriores. Tras la suficiente pr´ctica,
                                                                                      a
 esta versi´n se ve m´s clara y natural que la anterior. Observa c´mo se toman los elementos
           o         a                                            o
 no nulos del vector x (l´ınea 10).
     do
       r
                                             36
Cap´
    ıtulo 3
Bo
 M´todos directos para sistemas de
   e
 ecuaciones lineales

 3.1.         M´todo de Gauss
               e
     El m´todo de Gauss, tambi´n conocido como eliminaci´n gaussiana, es el algoritmo
          e                      e                          o
  rra
 m´s sencillo para la resoluci´n de sistemas de ecuaciones lineales. Consta de dos partes
   a                          o
 bien diferenciadas:

    i) Transformaci´n del sistema lineal en otro equivalente, es decir, con la misma solu-
                    o
       ci´n, donde la matriz es triangular superior.
         o

   ii) Resoluci´n del sistema triangular por sustituci´n regresiva.
               o                                      o

        El paso i) se acomete v´ dos operaciones elementales:
                               ıa

  (a) Sumar a una ecuaci´n otra multiplicada por un n´mero.
                        o                            u

  (b) Intercambiar dos ecuaciones.
     do
     Si s´lo utilizamos la operaci´n (a) hablaremos del m´todo de Gauss sin pivotaje, y
         o                        o                       e
 con pivotaje parcial si tambi´n realizamos las operaciones (b)1 cuando la elecci´n de
                                  e                                                  o
 las filas que se conmutan sea una muy particular.
     Representando el sistema de ecuaciones en la forma matricial, todo lo anterior se
 reescribe en t´rminos de operaciones matriciales (sumar a una fila otra fila e intercambiar
               e
     2
 filas ). En lo que sigue expresaremos el sistema en la forma

                               Ax = b,         A ∈ Rn×n ,      x, b ∈ Rn ,

 donde A es la matriz de coeficientes, b el t´rmino independiente y x el vector de soluciones.
                                            e
       r
 Los elementos de A se denotar´n por aij , y con bi los de b.
                                a
    1
      Existe una tercera operaci´n (c), que consiste simplemente en multiplicar filas por constantes no
                                  o
 nulas. Esta operaci´n recibe el nombre de reescalado (de filas) y en problemas pr´cticos se suele utilizar
                     o                                                            a
 con el fin de mejorar la estabilidad del sistema frente a errores de redondeo.
    2
      Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las inc´gnitas). En este
                                                                                         o
 caso se habla de pivotaje total.

                                                   37
3.1 M´todo de Gauss
      e                                                                                 ´
                                                                                   LECCION I

 3.1.1.           M´todo de Gauss sin pivotaje
                   e
          El pseudoc´digo se expone a continuaci´n
                    o                           o

          M´todo de Gauss
           e
Bo
             01   for i = 1 : n − 1
             02       for k = i + 1 : n
             03             ki = aki /aii
             04            for j = i + 1 : n
             05                  akj = akj − ki aij
             06            end
             07            bk = bk − ki bi
             08       end
             09   end
             10
             11   xn = bn /ann
             12   for i = n − 1 : −1 : 1
  rra
                                      n
             13         x i = bi −           aij xj /aii
                                     j=i+1
             15   end



     Las l´
          ıneas 01--09 se corresponden con la reducci´n a la forma triangular de la matriz
                                                       o
 y las l´
        ıneas 11--15 con la resoluci´n del sistema triangular resultante. El elemento aii se
                                    o
 denomina pivote y debe ser distinto de cero para que el algoritmo funcione, dado que en
 caso contrario la operaci´n en 03 est´ mal definida.
                          o           a
     El algoritmo efect´a O(n /3) productos3 y otras tantas sumas para la reducci´n a la
                       u      3
                                                                                    o
 forma triangular y O(n2 /2) sumas y productos para la resoluci´n del sistema triangular.
                                                                 o
     do
 Por tanto el costo se concentra en la primera fase del algoritmo y duplicar la dimensi´no
 del sistema exige multiplicar por ocho el tiempo de c´lculo (y por cuatro el costo en
                                                         a
 memoria).

 Ejercicio 3.1 Implementa una funci´n cuyas entradas sean la matriz de coeficientes y el
                                       o
 t´rmino independiente y devuelva la soluci´n del sistema por el m´todo de Gauss.
  e                                        o                      e

 Soluci´n. El siguiente programa es una soluci´n del ejercicio
       o                                      o

 01          % GAUSS
       r
 02          %
 03          %
 04          % X=GAUSS(A,B)          Solucion del sistema Ax=b con el metodo
 05          %                       de Gauss sin pivotaje
      3
     es decir, el n´mero de multiplicaciones es n3 /3 + αn2 + βn + γ, donde α, β y γ son constantes
                   u
 adecuadas. Con n creciente, el primer t´rmino es el dominante.
                                        e

                                                           38
´
 LECCION I                  ıtulo 3. M´todos directos para sistemas de ecuaciones lineales
                         Cap´         e

 06
 07           function x = gauss(a,b)
 08           n=length(a);
 09
 10           % transformacion del sistema en uno triangular
 11           for i=1:n-1
Bo
 12               for k=i+1:n
 13                   l=a(k,i)/a(i,i);
 14                   for j=i+1:n
 15                       a(k,j)=a(k,j)-l*a(i,j);
 16                   end
 17                   b(k)=b(k)-l*b(i);
 18               end
 19           end
 20
 21           % resolucion del sistema triangular
 22           x=zeros(n,1); % tambien vale x=b*0;
 23           x(n)=b(n)/a(n,n);
  rra
 24           for i=n-1:-1:1
 25               s=0;
 26               for j=i+1:n
 27                   s=s+a(i,j)*x(j); % sumatorio
 28               end
 29               x(i)=(b(i)-s)/a(i,i);
 30           end
 31           return



     El c´digo anterior es correcto y ciertamente recuerda a la sintaxis que usar´
         o                                                                       ıamos en una
     do
 programaci´n en un lenguaje tradicional como C o Pascal. Sin embargo desde el punto de
             o
 vista de Matlab es claramente redundante y muy mejorable. Los siguientes ejercicios
 ahondan en estos aspectos por lo que resolverlos es muy recomendable.

 Ejercicio 3.2 Reescribe el programa utilizando instrucciones y sintaxis propia de Matlab.

 Soluci´n. Las filas 14-16 del programa (04--06 del algoritmo) se pueden implementar
        o
 como una diferencia de dos vectores, a(k,i+1:n) y a(i,i+1:n), con cualquiera de estas
 dos instrucciones
       r
              a(k,i+1:n) =a(k,i+1:n) - l*a(i,i+1:n)
              a(k,:) =a(k,:) - m*a(i,:)

 La segunda es m´s c´moda de utilizar pero multiplica por dos el n´mero de operaciones
                  a o                                             u
                           4
 en la ejecuci´n del m´todo .
              o       e
      4
          ¿Por qu´?.
                 e

                                              39
3.1 M´todo de Gauss
      e                                                                                      ´
                                                                                        LECCION I

     De forma an´loga, el sumatorio de las l´
                  a                          ıneas 25-29 del c´digo (13 del algoritmo del
                                                              o
 m´todo de Gauss) es simplemente el producto escalar, y de hecho tambi´n matricial, de
   e                                                                     e
 dos vectores, el vector fila a(i,i+1:n) y el vector columna x(i+1:n). Esto es el c´digo
                                                                                    o
 de las l´
         ıneas 25--29 se puede sustituir por
         x(i)=(b(i)- a(i,i+1:n)*x(i+1:n))/a(i,i);
Bo
 Ejercicio 3.3 (Avanzado) Podemos avanzar a´n m´s hacia la consecuci´n de algoritmos
                                             u a                    o
 matriciales. Consideremos la partici´n de A
                                     o
                                          a11 c1                    b1
                                A=                     ,    b=
                                          d1 A11                    b1
 donde c1 , d1 son vectores (n − 1) × 1 y A11 una matriz (n − 1) × (n − 1). Entonces, el primer
 paso del m´todo de Gauss se puede escribir
             e
                     a11        c1                                       b1
                                                   ,        b=
                      0 A11 − (a11 )−1 c1 d1                        b1 − a−1 b1 d1 .
                                                                          11
  rra
                                   A(1)                                  b(1)
 El segundo paso del m´todo de Gauss se aplica ahora sobre la matriz A(1) (de tama˜o (n−1)×
                        e                                                          n
 (n − 1)) y el vector b(1) (de tama˜o (n − 1) × 1) y as´ se procede sucesivamente. Implementa
                                    n                  ı
 esta resoluci´n alternativa del m´todo de Gauss.
              o                   e
 (Ayuda. Observa estas tres instrucciones
        l=a(i+1:n,i)/a(i,i)            a(i+1:n,i+1:n)-l*a(i,i+1:n)              b(i+1:n)-l*b(i)
 ¿Qu´ hacen?)
    e

 Nota sobre la vectorizaci´n
                          o
     La noci´n de vectorizaci´n, trabajar con vectores y matrices en lugar de elemento a ele-
             o               o
     do
 mento, no es nueva ni en el An´lisis Num´rico ni en la computaci´n a alto nivel. El objetivo
                               a          e                       o
 que se persigue es que las todas las operaciones se reduzcan a operaciones matem´ticasa
 sencillas, como productos escalares, productos matriciales, b´squeda de m´ximos y m´
                                                               u              a           ıni-
 mos en un vector/matriz, suma de vectores y matrices... cuya implementaci´n se opti-
                                                                                  o
 miza tomando en consideraci´n el entorno en el que se trabaja, tanto en software como
                               o
 en hardware. Este conjunto de instrucciones se conocen como BLAS (basic linear algebra
 subprograms). Se distinguen tres niveles. El nivel uno est´ formada por operaciones entre
                                                           a
 vectores, tales como la suma o el producto escalar de dos vectores, de O(n) operaciones, el
 nivel dos se ocupa de operaciones matriz-vector con O(n2 ) operaciones y el nivel tres son
 operaciones entre matrices, O(n3 ) operaciones. En m´quinas con m´ltiples procesadores
                                                         a             u
       r
 estos subprogramas deben adaptarse a dividir la tarea entre los procesadores disponibles
 de forma ´ptima y a buscar algoritmos que soporten este tipo de trabajo5 .
            o
    5
     Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareas
 equiparables, y de forma que finalicen en tiempos similares puesto que basta con que una de las subtareas
 se retrase respecto a las dem´s para que el conjunto de procesadores deba parar a esperar al rezagado
                              a
 con la consiguiente p´rdida de tiempo (y dinero).
                       e

                                                   40
´
 LECCION I                 ıtulo 3. M´todos directos para sistemas de ecuaciones lineales
                        Cap´         e

    Uno de los detalles m´s sencillos que hay que plantear es la estrategia de almace-
                          a
 namiento de las matrices en memoria. Se puede optar por un almacenamiento por filas,
 como hace C,

                   a11 a12 a13
           A=                             ⇒       a11 → a12 → a13 → a21 → a22 → a23
                   a21 a22 a23
Bo
 donde con la notaci´n anterior queremos decir que aij y aij+1 ocupan posiciones consec-
                    o
 utivas en memoria.
     Sin embargo Fortran o Matlab proceden por columnas

                  a11 a12 a13
          A=                             ⇒        a11 → a21 → a12 → a22 → a13 → a23 .
                  a21 a22 a23

 Seg´n sea el caso se trata de primar algoritmos que accedan a la matriz por filas o por
     u
 columnas para que el procesador trabaje con posiciones consecutivas de memoria6 . En esta
  rra
 din´mica, la resoluci´n del sistema triangular seg´n el algoritmo expuesto en el Ejercicio
    a                 o                            u
 3.3 est´ mejor adaptado a la arquitectura de Matlab puesto que todas las operaciones se
        a
 hacen sobre columnas de la matriz a.



 3.1.2.     M´todo de Gauss con pivotaje parcial
             e

     Para evitar que el m´todo de Gauss se colapse, es decir, que encuentre en un paso i
                          e
 que el elemento aii es nulo (l´
                               ınea 03 del algoritmo), se introduce la noci´n de pivotaje. La
                                                                           o
 idea es muy sencilla: en el caso de que en el i–´simo paso el pivote sea nulo, se procede a
                                                  e
 intercambiar la fila i por una fila k tal que aki = 0 para cierto k > i. Si esto no es posible,
     do
 el sistema no es compatible determinado, es decir, o no tiene soluci´n o tiene infinitas
                                                                         o
 soluciones.
     Desde un punto de vista pr´ctico, el m´todo de Gauss con pivotaje procede a inter-
                                  a           e
 cambiar siempre filas de forma que en cada paso


                                         |aki | = m´x |a i |,
                                                   a
                                                  =i,...,n



 esto es, el pivote es el mayor posible. Ello dota al sistema de una mayor estabilidad frente
 a los errores de redondeo. El algoritmo resultante es el siguiente (denotamos por a ↔ b el
       r
 intercambio de valores de a y b).


   6
     Cuando un procesador moderno lee algo en memoria, suele cargar a su memoria internar, la memoria
 cach´, posiciones adicionales y consecutivas de memoria bajo la convicci´n de que es probable que las
     e                                                                   o
 requiera en el siguiente paso.

                                                  41
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico
Matlab en cinco lecciones para aprender Numérico

Más contenido relacionado

Similar a Matlab en cinco lecciones para aprender Numérico

Matlab y su lista de comandos
Matlab y su lista de comandosMatlab y su lista de comandos
Matlab y su lista de comandosCarlos Aparicio
 
Introduccion_al_Albebra_Lineal_3ra_Edici.pdf
Introduccion_al_Albebra_Lineal_3ra_Edici.pdfIntroduccion_al_Albebra_Lineal_3ra_Edici.pdf
Introduccion_al_Albebra_Lineal_3ra_Edici.pdfValentinMamaniArroyo3
 
Guia rapida de matlab (comandos basicos, graficacion y programacion)
Guia rapida de matlab (comandos basicos, graficacion y programacion)Guia rapida de matlab (comandos basicos, graficacion y programacion)
Guia rapida de matlab (comandos basicos, graficacion y programacion)morones.om
 
Calculadora Ti 84
Calculadora Ti 84Calculadora Ti 84
Calculadora Ti 84guest325d3e
 
Avanse de proyecto de calculo
Avanse de proyecto de calculoAvanse de proyecto de calculo
Avanse de proyecto de calculoRoque Macias E.
 
Public espacio de matricesfasc3
Public espacio de matricesfasc3Public espacio de matricesfasc3
Public espacio de matricesfasc3magniez
 
De la aritmética al álgebra: funciones …
De la aritmética al álgebra: funciones …De la aritmética al álgebra: funciones …
De la aritmética al álgebra: funciones …Juan Carreón
 
Proyecto metodos-definitivo
Proyecto metodos-definitivoProyecto metodos-definitivo
Proyecto metodos-definitivorubhendesiderio
 
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdfÁlgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdfPinta p
 
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdfÁlgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdfPinta p
 
Matlab guia introductoria_2001_09_10
Matlab guia introductoria_2001_09_10Matlab guia introductoria_2001_09_10
Matlab guia introductoria_2001_09_10damari_paty
 
Manual de-java
Manual de-javaManual de-java
Manual de-javaeliseorm
 
Materiales relacionados con la clase
Materiales relacionados con la claseMateriales relacionados con la clase
Materiales relacionados con la claseRoque Macias E.
 

Similar a Matlab en cinco lecciones para aprender Numérico (20)

Libro matlabweb
Libro matlabwebLibro matlabweb
Libro matlabweb
 
Libro matlabweb
Libro matlabwebLibro matlabweb
Libro matlabweb
 
Matlab y su lista de comandos
Matlab y su lista de comandosMatlab y su lista de comandos
Matlab y su lista de comandos
 
Introduccion_al_Albebra_Lineal_3ra_Edici.pdf
Introduccion_al_Albebra_Lineal_3ra_Edici.pdfIntroduccion_al_Albebra_Lineal_3ra_Edici.pdf
Introduccion_al_Albebra_Lineal_3ra_Edici.pdf
 
Algebra_Lineal_ HOWARD Anton.pdf
Algebra_Lineal_ HOWARD Anton.pdfAlgebra_Lineal_ HOWARD Anton.pdf
Algebra_Lineal_ HOWARD Anton.pdf
 
Problemario av
Problemario avProblemario av
Problemario av
 
Guia rapida de matlab (comandos basicos, graficacion y programacion)
Guia rapida de matlab (comandos basicos, graficacion y programacion)Guia rapida de matlab (comandos basicos, graficacion y programacion)
Guia rapida de matlab (comandos basicos, graficacion y programacion)
 
Calculadora Ti 84
Calculadora Ti 84Calculadora Ti 84
Calculadora Ti 84
 
Avanse de proyecto de calculo
Avanse de proyecto de calculoAvanse de proyecto de calculo
Avanse de proyecto de calculo
 
Public espacio de matricesfasc3
Public espacio de matricesfasc3Public espacio de matricesfasc3
Public espacio de matricesfasc3
 
De la aritmética al álgebra: funciones …
De la aritmética al álgebra: funciones …De la aritmética al álgebra: funciones …
De la aritmética al álgebra: funciones …
 
Proyecto de-metodos
Proyecto de-metodosProyecto de-metodos
Proyecto de-metodos
 
Proyecto metodos-definitivo
Proyecto metodos-definitivoProyecto metodos-definitivo
Proyecto metodos-definitivo
 
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdfÁlgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
 
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdfÁlgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
Álgebra - Arturo Márquez, Fabián Valapai Bravo - 1ra Edición.pdf
 
Matlab guia introductoria_2001_09_10
Matlab guia introductoria_2001_09_10Matlab guia introductoria_2001_09_10
Matlab guia introductoria_2001_09_10
 
Informe matlab
Informe matlabInforme matlab
Informe matlab
 
Informe matlab
Informe matlabInforme matlab
Informe matlab
 
Manual de-java
Manual de-javaManual de-java
Manual de-java
 
Materiales relacionados con la clase
Materiales relacionados con la claseMateriales relacionados con la clase
Materiales relacionados con la clase
 

Matlab en cinco lecciones para aprender Numérico

  • 1. Matlab en cinco lecciones de Num´rico e V´ ıctor Dom´ ınguez B´guena a Ma Luisa Rap´n Banzo u Febrero de 2006 Disponible en http://www.unavarra.es/personal/victor dominguez/
  • 2.
  • 3. Prefacio Bo El origen de este libro es una asignatura de libre elecci´n que uno de los autores im- o parti´ durante los cursos 2004–2005 y 2005–2006 en la Universidad P´blica de Navarra. o u Nuestra intenci´n original era tratar temas algo avanzados de C´lculo Cient´ o a ıfico y utilizar Matlab como v´ para su aprendizaje. Los alumnos, obviamente, estaban m´s interesados ıa a en aprender Matlab y ve´ el Num´rico como forma de probar y ensayar las diferentes ıan e herramientas de Matlab que se iban exponiendo en clase. Desafortunadamente, la forma- ci´n en Num´rico de nuestros alumnos nos oblig´ a relajar considerablemente el contenido o e o matem´tico del curso y a ser m´s modestos, desde el punto de vista te´rico, en nuestros a a o rra objetivos. El resultado final en su vertiente matem´tica se podr´ enmarcar sin problemas a ıa en un curso introductorio de C´lculo Num´rico. En cuanto a Matlab, creemos que hemos a e tratado todos sus aspectos fundamentales aunque en ocasiones sea de forma superficial. Nuestro objetivo era conseguir no tanto un conocimiento muy profundo de Matlab como el de colocar al alumno en una buena posici´n de arranque para un autoaprendizaje. o El enfoque y los temas tratados son consecuencia de diversos factores entre los que conviene citar nuestro propio bagaje matem´tico1 , el uso que hemos tenido que hacer de a Matlab en nuestra carrera investigadora y, como ya hemos mencionado, los conocimientos de partida que ten´ nuestros propios alumnos. Hemos insistido bastante en la manip- ıan o o ´ ulaci´n de vectores y matrices y a la programaci´n en forma vectorizada. Esta es una de las diferencias m´s acusadas con los lenguajes de programaci´n tradicionales y una a o implementaci´n eficiente en Matlab pasa necesariamente por la vectorizaci´n. o o Los apuntes est´n organizados en torno a temas o lecciones, cada cual dividido en dos a do partes, la primera de Matlab y la segunda con un tema espec´ ıfico de C´lculo Num´rico. a e En la primera parte se presentan los aspectos instrumentales de Matlab que utilizaremos en la implementaci´n de los algoritmos de la parte de Num´rico. La longitud de cada o e parte es variable, y dependiente de la dificultad tratada ya sea en la parte instrumental (Matlab) o en la parte matem´tica. De tanto en tanto nos hemos permitido hacer algo de a Matem´ticas tratando de presentarlas en la forma m´s simple posible. a a A lo largo de estas p´ginas el lector podr´ encontrar ejercicios, algunos de ellos resuel- a a tos, que tratan de ahondar en puntos espec´ ıficos, matem´ticos e inform´ticos. Finalmente a a se han introducido algunas notas hist´ricas que describen brevemente la evoluci´n que han o o r tenido las ideas a lo largo del tiempo. Con ello tratamos de combatir la idea gaussiana, demasiado extendida, de las Matem´ticas como un mundo est´tico, monol´ a a ıtico y perfecto donde la teor´ se presenta cerrada y completa. Las Matem´ticas en general y el C´lculo ıa a a Cient´ıfico en particular recorren un largo trecho antes de llegar a este estado, durante el cual brotan ideas constantemente, siempre prometedoras en un primer momento, que 1 modelado por nuestra formaci´n cient´ o ıfica, com´n en muchos aspectos. u i
  • 4. evolucionan con los a˜os, con muchas de ellas desechadas finalmente e incluso algunas n rescatadas a˜os despu´s de considerarse como v´ muertas. n e ıas Hemos adjuntado al final una bibliograf´ utilizada en este texto. Nos gustar´ resaltar ıa ıa tres textos sobre los dem´s. En primer lugar, Numerical Computing with Matlab, de Cleve a Moler, que descubrimos cuando and´bamos en la redacci´n de la Lecci´n II. Su sencillez a o o y la buena elecci´n de ejemplos ha ejercido una influencia considerable en estas notas. o Bo El segundo libro es ya un cl´sico entre los que aprendimos Matlab hace algunos a˜os. a n And´bamos entonces en la b´squeda de recursos en la web cuando nos encontramos con a u unos apuntes muy completos de libre divulgaci´n. Nos referimos al libro de Garc´ de o ıa Jal´n y sus colaboradores, Aprenda Matlab ?.? como si estuviera en primero. Diferentes o versiones de estos apuntes llevan cubriendo de forma incansable la evoluci´n de Matlab o desde la versi´n 4.0. o Por ultimo, aunque no es un texto propiamente, la enciclopedia libre on line Wikipedia2 ´ ha sido utilizada profusamente para obtener datos y fuentes utilizadas en la redacci´n de o este texto. Debemos se˜alar que estas informaciones han sido debidamente contrastadas. n A pesar de algunos problemas iniciales, es seguro que la influencia de esta enciclopedia libre crecer´ exponencialmente en el futuro. a Finalmente, queremos dejar patente nuestro agradecimiento al Profesor Javier Sayas rra que se ofreci´ muy generosamente a revisar este libro. Sus numerosas y acertadas indica- o ciones y sugerencias han contribuido, y mucho, en la redacci´n final de este texto. o do Pamplona, Febrero de 2006 V´ ıctor Dom´ ınguez B´guena a a M Luisa Rap´n Banzo u r 2 http://www.wikipedia.org ii
  • 5. Bo A Javier Amigo y maestro. rra do r
  • 6. r do rra Bo
  • 7. Cap´ ıtulo 1 Bo Introducci´n o ... and the first lesson of all was the basic trust that he could learn. It is shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult. rra Dune Frank Herbert 1.1. ¿Qu´ es? e Matlab es un entorno de trabajo para el c´lculo cient´ a ıfico. Programado originalmente por Cleve Moler a finales de los a˜os 70, su finalidad original era proporcionar una forma n sencilla de acceder a las librer´ LINPACK y EISPACK donde est´n implementadas de una ıas a forma altamente eficiente los algoritmos clave del an´lisis matricial1 . De hecho, Matlab es a una abreviatura de Matrix Laboratory Su primera implementaci´n se hizo en Fortran que era, y en buena medida a´n sigue o u si´ndolo, el lenguaje est´ndar en la implementaci´n de m´todos num´ricos2 . Posterior- e a o e e do mente se reimplement´ en C, que es como se encuentra en la actualidad. o Las aplicaciones de Matlab se fueron extendiendo a otras ramas del c´lculo cient´ a ıfico y de las ciencias aplicadas en general, dot´ndole de una gran popularidad en ambientes a cient´ ıficos (especialmente en Ingenier´ Dichas extensiones se consiguieron en gran parte ıa). mediante la implementaci´n de toolboxes, librer´ escritas en el lenguaje de programaci´n o ıas o propio de Matlab y que ampliaban el rango de problemas que pod´ resolverse. ıan Sin miedo a equivocarse, se pueden enunciar las siguientes ´reas donde Matlab muestra a un gran potencial: a ´lgebra lineal num´rica; e r procesamiento de se˜ales (an´lisis, compresi´n de datos,..); n a o 1 por ejemplo, el m´todo de Gauss, el c´lculo de las descomposiciones m´s habituales del ´lgebra e a a a matricial num´rica (LU , LL , QR), m´todos iterativos,... e e 2 Fortran significa Formula translation. Desarrollado por IBM en 1954, es considerado como el primer lenguaje de alto nivel. Las ultimas actualizaciones (Fortran 95 y Fortran 2003) han dado nuevo vigor a ´ este veterano lenguaje de programaci´n. o 1
  • 8. dise˜o de sistemas de control; n salidas gr´ficas; a estad´ ıstica; Bo simulaci´n de sistemas din´micos. o a La extensa gama de problemas que cubre hace de Matlab un lenguaje dif´ de entender ıcil y manejar en su completitud. Esto no quiere decir que sea inarbodable: el conocimiento base que permite empezar a trabajar es muy sencillo. No obstante el elevado n´mero de u 3 comandos que se encuentra a disposici´n del usuario provoca que en ocasiones existan o problemas no s´lo para encontrar los comandos adecuados sino tambi´n para tener una o e idea de qu´ posibilidades exactamente ofrece Matlab en un problema o tarea en particular. e 1.2. ¿C´mo trabaja? o rra El lenguaje de programaci´n de Matlab es bastante m´s flexible que el de los lenguajes o a tradicionales. No es preciso la declaraci´n inicial de variables, ´stas se pueden introducir o e en el momento que se necesiten, y por ejemplo, vectores y matrices pueden declararse sin especificar sus dimensiones e incluso cambiar sus tama˜os sobre la marcha. Ello per- n mite una programaci´n algo m´s desordenada, aunque debe tenerse bien claro que una o a programaci´n cl´sica, m´s al uso, suele generar c´digo m´s eficiente. o a a o a Por otro lado, una gran cantidad de m´todos num´ricos se encuentran implementados e e de una forma muy eficiente y son accesibles como simples comandos. De esta forma, Mat- lab se puede utilizar como una caja negra: el usuario pregunta y el ordenador responde sin que ´ste tenga que preocuparse de qu´ tipo de operaciones se han efectuado por el camino. e e De todas formas es conveniente tener una idea de qu´ m´todos se est´n utilizando para e e a as´ ser conscientes de en qu´ condiciones van a funcionar, cu´l es en cada caso el m´to- ı e a e do do adecuado, y especialmente el significado de los, posiblemente, numerosos argumentos opcionales que controlan el funcionamiento del algoritmo. A priori se pueden distinguir dos tipos de funciones en Matlab: funciones compiladas (Built in functions) y funciones no compiladas. Las primeras est´n optimizadas, son pro- a gramas ya compilados y con el c´digo no accesible para el usuario. Como ejemplos se o pueden citar operaciones fundamentales +, *,. . . . las funciones matem´ticas b´sicas (sin, cos, exp, log,. . . ) a a r ´ algoritmos b´sicos del Algebra Lineal (inv, det, lu, chol, qr,...) a s´lidas gr´ficas (plot, surf,...) a a 3 A modo de ejemplo, estos comandos cubren salidas gr´ficas: plot, line, ezplot, ezsurf, surf, a surfc, line, patch, plot3, contour, contourf, ezcontour, pcolor, trimesh, trisurf,... 2
  • 9. Las funciones no compiladas est´n escritas siguiendo el lenguaje de programaci´n a o propio de Matlab. Estos comandos se guardan en ficheros *.m que es la extensi´n est´ndar o a de los ficheros de Matlab4 . Originalmente, Matlab funcionaba como un interprete. Es decir, cada l´ınea de c´digo o era traducido antes de su ejecuci´n. Ello hac´ que una programaci´n similar a lenguajes o ıa o cl´sicos de programaci´n diera lugar a c´digo poco eficiente. a o o Bo Este problema se puede subsanar en gran medida recurriendo a la programaci´n vec- o torizada. El siguiente ejemplo muestra las diferencias con una programaci´n est´ndar o a No vectorizada Vectorizada y=zeros(1,1000); y=sin(linspace(0,2*pi,1000)); h=2*pi/999; for i=0:999 y(i+1)=sin(h*i); rra end En la primera parte del c´digo, encontramos una estructura t´ o ıpica en los lenguajes de programaci´n: el comando for. Su significado es claro: las l´ o ıneas comprendidas entre el for y end se repiten 1000 veces con la variable i tomando valores de 0 a 999. El resultado final es el vector fila y que recoge el valor del seno en 1000 puntos uniformemente espaciados en [0, 2π]. Por otro lado, el comando linspace devuelve un array que contiene 1000 puntos equidistantes entre 0 y 2π. La funci´n seno es aplicada sobre todo el array devolviendo o un vector con estos valores que se guarda en y. La diferencia entre ambas formas de programar es ahora patente. Mientras que en la primera realizamos 1000 llamadas a la do funci´n seno con un argumento por llamada, en la segunda hay una unica llamada donde o ´ se requiere el c´lculo del seno en 1000 puntos, y el resultado se devuelve en un vector con a estos valores (y por tanto tambi´n de longitud 1000). e Desde el punto de vista de Matlab el segundo c´digo es m´s eficiente. Habitualmente, o a la vectorizaci´n lleva consigo una reducci´n del c´digo a la vez que se incrementan las o o o necesidades de memoria. Con Matlab 6.5 se inici´ un proyecto a m´s largo plazo consistente en la aceleraci´n o a o (Performance Acceleration) de las versiones no vectorizadas dirigida a estrechar las difer- encias con los lenguajes cl´sicos de alto nivel como Fortran, C o Pascal5 . En cualquier caso, a r la posibilidad de ejecutar instrucciones en bloque sobre vectores o matrices, en contraste con operaciones elemento a elemento como en los lenguajes tradicionales, es algo que conviene explotar por las importantes ventajas que proporciona. 4 Tambi´n est´ la extensi´n *.mat, propia de ficheros de datos. e a o 5 De hecho en la version 6.5 apenas hay diferencias en tiempo de ejecuci´n entre los dos c´digos o o expuestos. 3
  • 10. 1.3. ¿C´mo aprenderemos? o Como ya hemos se˜alado anteriormente, aprender a manejar Matlab en su totalidad n est´ fuera de los contenidos de un curso introductorio como ´ste. No as´ aprender los a e ı fundamentos y preparar el terreno para un autoaprendizaje de las partes en las que cada uno est´ interesado. Encontramos en este punto dos dificultades que salvar: saber de la e Bo existencia del comando adecuado y aprender a utilizarlo. En no pocas ocasiones, la primera es la mayor dificultad. No obstante los comandos llevan siempre nombres nemot´cnicos e para facilitar su memorizaci´n. Las funciones de ayuda tambi´n echan una mano. o e Como a programar se aprende programando, comenzaremos escribiendo c´digo desde o los primeros pasos. Los esquemas num´ricos que implementaremos se encuentran pr´cti- e a camente en cualquier curso introductorio de An´lisis Num´rico. En cada lecci´n imple- a e o mentaremos dichos algoritmos, introduciendo ´rdenes, estructuras de decisi´n, datos,... o o seg´n sea necesario. u En los apuntes se incluyen m´ltiples ejercicios cuya realizaci´n ayudar´ al aprendizaje u o a de la asignatura. Estos apuntes no deben tomarse como un manual en el estilo usual, sino como una forma de aprender Matlab y repasar o aprender el An´lisis Num´rico b´sico. a e a Ya existen manuales extensos y concienzudos, en la bibliograf´ citamos algunos de ellos, ıa rra que pueden servir para ese fin. do r 4
  • 11. Bo Lecci´n I o Primeros pasos en Matlab. rra M´todos directos para sistemas de ecuaciones e lineales do r 5
  • 12. r do rra Bo
  • 13. Introducci´n o Bo When asked whether a programming language supports matrices, many people will think of two-dimensional arrays and respond, “Yes.” Yet matrices are more than two-dimensional arrays -they are arrays with operations. It is the operations that cause matrices to feature so prominently in science and engineering G.W. Stewart, Matrix Algorithms rra Comenzaremos en la primera parte de esta lecci´n tratando nociones b´sicas de Matlab, o a introduciendo el entorno de trabajo y las estructuras b´sicas de programaci´n. En segundo a o lugar entraremos en uno de los detalles fuertes de Matlab, la manipulaci´n de vectores y o matrices. En la parte matem´tica estudiaremos m´todos directos para la resoluci´n de sis- a e o temas de ecuaciones lineales. En la implementaci´n de estos algoritmos repasaremos los o conocimientos de Matlab expuestos en la primera parte. do r 7
  • 14. r do rra Bo
  • 15. Cap´ ıtulo 2 Bo Matlab: Primeros pasos 2.1. Entorno de trabajo En las primeras secciones comenzaremos explorando Matlab de la forma m´s simple, en a modo comando: el usuario pregunta y Matlab responde. El interfaz de Matlab es bastante pobre, con un aspecto est´tico que en modo alguno es comparable al de programas como e rra Maple o Mathematica. El modo interactivo de trabajar es sencillo aunque algo inc´modo. A o modo de ejemplo, requiere algo de esfuerzo editar instrucciones ejecutadas con anterioridad ´ y manejarse con bloques de comandos es muy engorroso. Este y otros problemas del modo interactivo se subsanan en gran medida empaquetando instrucciones con ficheros script y/o programando en funciones (subrutinas) que es la forma natural de trabajar en Matlab. En un segundo paso, se puede implementar un interfaz gr´fica, las guides de Matlab, que a hacen m´s amigable la comunicaci´n con el usuario. a o En la Figura 2.1 podemos ver el aspecto inicial de Matlab. Distinguimos las siguientes ventanas Command window: ventana donde podemos ejecutar los comandos; do Ventanas auxiliares: command history, workspace, current directory que informan sobre (y permiten editar) los comandos insertados, las variables declaradas y el directorio en el que estamos trabajando. Ventana de ayuda: en una ventana independiente proporciona un acceso completo a las funciones de ayuda de Matlab, incluyendo b´squedas, demostraciones, etc. u ´ Estas son las caracter´ ısticas b´sicas que debemos considerar: a El prompt de Matlab es >>. El usuario escribe a continuaci´n. o r Para ejecutar se pulsa la tecla Enter. Se pueden recuperar comandos anteriores navegando con las flechas ↑ y ↓. Cuando se trabaje en Matlab, debemos tener muy en cuenta que: Se distinguen may´sculas y min´sculas. u u 9
  • 16. 2.1 Entorno de trabajo ´ LECCION I Bo rra Figura 2.1: Pantalla Principal. Todos los comandos de Matlab se escriben en min´sculas y los argumentos se env´ u ıan entre par´ntesis separados por comas. e do El car´cter % se utiliza para insertar comentarios. Todo lo que sigue (en la misma a l´ ınea) es ignorado por Matlab. Si se teclea al final de una instrucci´n ’;’ ´sta se ejecuta pero el resultado no se o e visualiza por pantalla. Dos comandos se pueden insertar en la misma l´ ınea separados por “,” o por “;”. La diferencia entre los dos es que con “,” se muestran los resultados de las operaciones mientras que con “;” la operaci´n se ejecuta pero no se visualiza. o r Ejercicio 2.1 Ejecuta las instrucciones >> 4+4 % mi primera operacion >> 3^4, 4/9 >> 3^4; 4/9 >> 3^4, 4/9; >> 3^4; 4/9; 10
  • 17. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ y observa la salida. Haremos algunos comentarios sobre el ejercicio anterior. El circunflejo ^ es la poten- ciaci´n: o >> 3^5 Bo ans= 243 El t´rmino ans es la primera variable que vemos de Matlab. Concretamente, guarda la e ultima salida dada por Matlab (answer): ´ >> 4+6 ans = 10 rra >> ans*2 ans = 20 >> ans*2 ans = 40 do La ra´ cuadrada se puede calcular bien elevando a 1/2 (^(1/2)) o bien utilizando sqrt. ız Ejercicio 2.2 Comprueba la diferencia entre 4/4+6 4/(4+6) 3^5*2 3^(5*2) Nota. La prioridad de ejecuci´n entre operaciones matem´ticas es la habitual: primero o a se calcula la potenciaci´n ^, posteriormente los productos y divisiones *, / y en ultimo o ´ lugar, las sumas y restas + y -. Este orden se puede cambiar utilizando los par´ntesis. e La regla es sencilla: dada una expresi´n, lo primero que se calcula es lo que est´ dentro o a r de cada par´ntesis. Esta regla es recursiva, es decir, si dentro de un par´ntesis hay otros e e par´ntesis, para evaluar el primero se empezar´ con los par´ntesis interiores. e a e Los n´meros reales se pueden insertar tambi´n en notaci´n cient´ u e o ıfica, muy adecuada si se trata de n´meros grandes o muy peque˜os (en valor absoluto). As´ se tiene la siguiente u n ı, regla de construcci´n: o m · 10r m er 11
  • 18. 2.1 Entorno de trabajo ´ LECCION I Por ejemplo 0.005 5e − 3 115 · 1012 115e12 −1201200000 −1.2012e009 0.00031415 3.1415e − 004 Existen adem´s dos n´meros especiales: inf y NaN. El primer signo representa la can- a u Bo tidad infinita (∞). El segundo es una abreviatura de “no es un n´mero” (Not a Number) u y es el resultado que se devuelve ante una operaci´n indefinida como 0/0. Este s´ o ımbolo se puede utilizar en ´mbitos, en principio tan extra˜os, como en el dibujo de superficies a n (v´r la Lecci´n V). e o En general los resultados num´ricos se presentan con cuatro cifras decimales correctas, e aunque todas las operaciones se ejecutan en doble precisi´n1 . Si se desean las salidas con o toda la precisi´n disponible se debe insertar la instrucci´n o o >> format long A partir de este punto, el resultado de cualquier operaci´n se mostrar´ con 16 cifras o a significativas. La instrucci´n o rra >> format short devuelve a la forma est´ndar con cuatro cifras decimales. Existen m´s opciones con format. a a Las siguiente l´ ıneas muestran algunas de ellas: >> pi % el numero pi ans = 3.1416 >> format long % mayor precision >> pi do ans = 3.14159265358979 >> format compact % compacto >> pi ans = 3.14159265358979 >> format bank %No fijo de cifras decimales r >> pi ans = 3.14 1 Aproximadamente 16 cifras decimales correctas. En el momento de redactar estas l´ ıneas, los proce- sadores de 32 bits dominan todav´ el parqu´ de ordenadores. Las nuevas generaciones, con procesadores ıa e con 64 bits, duplican la precisi´n de trabajo. o 12
  • 19. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ >> format rat %salidas en forma fraccionaria >> pi ans = 355/113 >> format loose % mas espaciada >> pi Bo ans = 355/113 Observa la diferencia de espaciamiento que se obtiene con las opciones compact y loose. N´ meros complejos u La √aritm´tica compleja se encuentra tambi´n integrada en Matlab. La unidad imagi- e e naria ( −1) se representa en Matlab con i ´ j: o >> clear i j % borramos posibles valores de i y j rra >> i^2 ans= -1 >> j^2 ans= -1 do El signo i suele ser habitual en Matem´ticas mientras que en diversas ramas de la F´ a ısica y en Ingenier´ de Telecomunicaciones o El´ctrica se prefiere el s´ ıa e ımbolo j (en este caso para no confundir con la intensidad de corriente el´ctrica). De ah´ que Matlab permita e ı ambas representaciones. Todas las operaciones matem´ticas incluyen la aritm´tica compleja en el sentido usual a e >> 1+i +5-6i % suma de dos numeros complejos ans = r 6.0000 - 5.0000i >> (5+3i)*(5-3i), (1+2i)/(3-4i) ans = 13
  • 20. 2.2 Comandos de ayuda ´ LECCION I 34.00 ans = -0.20 Bo + >> conj(3e-3+2e-4i) % conjugado ans = 0.0030 - 0.0002i >> abs(3+4i), angle(2i) % modulo y argumento ans = 5 rra ans = 1.5708 2.2. Comandos de ayuda La ayuda de Matlab es ciertamente muy clara y completa. Los comandos siempre dispuestos a echarnos una mano son: help: muestra una ayuda por pantalla, en la ventana de comandos, con la informa- do ci´n esencial sobre un comando concreto. o helpwin: similar a help pero despliega la ayuda en una ventana auxiliar, permitien- do as´ una navegaci´n, estilo web, muy c´moda. ı o o lookfor: permite buscar una cadena en la primera l´ ınea de todos los ficheros de ayuda. Por ejemplo, si deseamos ayuda sobre la funci´n sin, podemos ejecutar o >> help sin r SIN Sine. SIN(X) is the sine of the elements of X. Overloaded methods help sym/sin.m 14
  • 21. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ Bo rra Figura 2.2: Pantalla de ayuda. o bien >> helpwin sin do y obtener la pantalla que se muestra en la Figura 2.3. Adem´s, si aparece el enlace “Go to a online doc for ...”, ´ste nos permite navegar entre una ayuda mucho m´s completa e a donde se muestran ejemplos y detalles sobre la implementaci´n del comando (ver la Figura o 2 2.4 ). Ejercicio 2.3 Utilizando las funciones de ayuda, obtener informaci´n de alguna de estas o funciones elementales de Matem´ticas a sin cos tan asin acos atan sec csc cot asec acsc acot r sinh cosh tanh asinh acosh atanh exp log log10 log2 sign Mediante la instrucci´n o 2 Para que esta opci´n est´ disponible es necesario que se haya instalado la ayuda completa de Matlab. o e A partir de la versi´n 6.0 la instalaci´n consta de (al menos) dos CDs, el primero con el programa y las o o librer´ habituales y el segundo con la documentaci´n de la ayuda. ıas o 15
  • 22. 2.3 Variables ´ LECCION I Bo rra Figura 2.3: Ayuda con helpwin. Comprueba si aparece la opci´n Go to online doc... o >> help + se pueden adem´s visualizar las operaciones “elementales” seg´n Matlab. a u do 2.3. Variables Matlab no necesita la declaraci´n de variables como en un lenguaje tradicional. En prin- o cipio todas las variables son reales, y basta hacer uso de ellas para que queden declaradas: >> a=1; b=2; c=3; >> a-b ans = r -1 >> a*b*c ans = 16
  • 23. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ Bo rra Figura 2.4: Ayuda on line. 6 do El comando who sirve para conocer los nombres de las variables declaradas, mientras que con whos obtenemos una informaci´n m´s precisa: o a >> who Your variables are: a b c >> whos a r Name Size Bytes Class a 1x1 8 double array Grand total is 1 element using 8 bytes Para borrar una variable se utiliza la instrucci´n clear, por ejemplo, o 17
  • 24. 2.3 Variables ´ LECCION I >> a=4; >> whos a Name Size Bytes Class a 1x1 8 double array Bo Grand total is 1 element using 8 bytes >> clear a >> whos a >> borra la variable (es decir, whos no devuelve nada). Con la orden >> clear all se borran todas las variables declaradas hasta el momento. rra Nota. En Matlab es correcto declaraciones de este tipo >> sin=1; >> sin+1 ans= 2 De esta forma sin pasa a ser una variable que sobrescribe el valor original que ten´ como ıa funci´n seno. Para recuperar el valor original basta ejecutar o >> clear sin do Almacenamiento de variables en ficheros Matlab ofrece la posibilidad de grabar las variables que deseemos en un fichero. De esta forma, podemos recuperarlas m´s adelante, ya sea en la misma sesi´n o en otra diferente3 . a o Por ejemplo >> a=4+i;% numero complejo >> b1=cos(2); >> b2=sin(2); >> save datos a b1 b2 r graba dentro del directorio de trabajo, en un fichero de nombre datos.mat, las variables indicadas. Para recuperar, basta ejecutar >> load datos 3 Se entiende por sesi´n el tiempo que transcurre entre que se abre y se cierra Matlab. Al cerrar el o programa, todas las variables locales se pierden. 18
  • 25. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ 2.4. Ficheros script y funciones La forma m´s eficiente de empaquetar series de instrucciones simples y mec´nicas es a a utilizando ficheros script. Tareas m´s elaboradas, con, por ejemplo, variables de entrada a y salida, requieren del uso de funciones. Bo 2.4.1. Ficheros script Un fichero script es un simple documento de texto que contiene una sucesi´n de co- o mandos de Matlab. Esencialmente es equivalente a teclear estas instrucciones directamente en la ventana de comandos. Describiremos el manejo de este tipo de ficheros mediante un sencillo ejemplo. Comen- zamos creando un fichero tecleando en modo comando la orden4 >> edit prueba Se despliega as´ en una ventana aparte el editor de Matlab con el fichero prueba.m (“.m”es ı la extensi´n est´ndar de Matlab). Es importante saber cu´l es el directorio de trabajo5 , o a a pues es donde se guardar´ por defecto el fichero. a rra Tecleamos ahora en el editor a=1+i; b=1-i; disp(’a*b=’) disp(a*b) disp(’a/b=’) disp(a/b) disp(’sqrt(a)=’) disp(sqrt(a)) El comando disp (de display) muestra vectores por pantalla de forma compacta. Dado que para Matlab un cadena de caracteres es simplemente un vector de car´cteres, se consigue a con ello mostrar por pantalla mensajes de forma concisa. Una vez que el documento est´ grabado, para ejecutar las ´rdenes que contiene basta a o do teclear el nombre del fichero en la ventana de comandos: >> prueba Se puede modificar las veces que se precise las variables a y b en el fichero script sin tener que teclear de nuevo todas las instrucciones. 2.4.2. Funciones En principio existen dos tipos de funciones: las funciones inline, que se insertan en la l´ ınea de comandos y las que se escriben en un documento de texto externo. Esta ultima ´ r forma, que es la evoluci´n natural de los ficheros script, es m´s flexible y es en la que nos o a centraremos a continuaci´n. Dejaremos pendiente para la Lecci´n III la descripci´n de las o o o funciones inline. Como antes, para crear un fichero que contenga a una funci´n se puede teclear: o 4 Tambi´n es posible crear este fichero a golpe de rat´n. e o 5 Por defecto es C:MATLAB6p5work. 19
  • 26. 2.4 Ficheros script y funciones ´ LECCION I >> edit mifuncion En el editor puedes insertar este simple ejemplo: 01 % MIFUNCION 02 % Bo 03 % Y=MIFUNCION(X) devuelve 04 % 05 % Y=X^2-COS(X) 06 % 07 function y=mifuncion(x) 08 09 y=x^2-cos(x); 10 11 return La funci´n se declara con function, la variable de entrada es x y se declara como variable o de salida y. Se termina la ejecuci´n de la funci´n cuando se ejecuta un return o bien se o o llega al final de la funci´n6 . o rra Ahora, para calcular el valor de π 2 − cos(π) podemos ejecutar la orden: >> mifuncion(pi) ans = 10.8696 Nota. Los n´meros correlativos situados a la izquierda no forman parte del c´digo u o de la funci´n. Han sido insertados con el fin de numerar las l´ o ıneas y as´ facilitar los ı comentarios que podamos hacer sobre el programa. Una funci´n puede no tener salidas, por ejemplo, o do 01 % INFORMACION 02 % 03 % INFORMACION devuelve informacion sobre 04 % la precision de la maquina 05 % 06 function informacion 07 08 disp(’precision de la maquina’) 09 disp(eps) r 10 disp (’mayor numero real’) 11 disp(realmax) 12 disp (’menor numero real’) 13 disp(realmin) 14 return 6 En este sentido, el return del ejemplo anterior es superfluo. 20
  • 27. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ o bien devolver m´ltiples salidas: u 01 % MIFUNCION2 02 % 03 % [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve 04 % Bo 05 % Y1=X1+X2+X3; 06 % Y2=X1-X2+X3; 07 % 08 function [y1,y2]= mifuncion2(x1,x2,x3) 09 10 y1=x1+x2+x3; 11 y2=x1-x2+x3; 12 13 return Observa c´mo se recogen los resultados o >> [z1,z2]=mifuncion2(1,2,3); rra >> z1 ans= 6 >> z2 ans= 2 >> z=mifuncion2(1,2,3); % Ahora solo devuelve el primero do ans= 6 La cabecera que hemos introducido en el pre´mbulo de las funciones, es decir las l´ a ıneas anteriores a la declaraci´n de la funci´n y precedidas con “%”, constituyen la ayuda de la o o funci´n: o >> help mifuncion2 r MIFUNCION2 [Y1,Y2]=MIFUNCION2(X1,X2,X3) devuelve Y1=X1+X2+X3; Y2=X1-X2+X3; 21
  • 28. 2.5 Vectores y matrices ´ LECCION I Aunque muy recomendables7 , su inclusi´n en una funci´n es opcional. La ayuda puede o o estar antes o despu´s de la declaraci´n de la funci´n. En cualquiera de los dos casos, e o o Matlab despliega como ayuda todas las l´ıneas que esten precedidas con % hasta que se encuentra con la primera l´ ınea no comentada. Bo Nota. Para ser consecuentes, lo correcto es denominar de igual modo a la funci´n y o al archivo que la contiene. Sin embargo esto no es obligatorio, es decir, se pueden dar nombres distintos, pero en este caso Matlab da preferencia al nombre del archivo. Aunque Matlab distingue entre may´sculas y min´sculas en sus comandos, esto no es u u extensible para funciones programadas en m-files, al menos en Windows. Es decir, para ejecutar una funci´n en un archivo, digamos, operaciones, se puede utilizar OPERACIONES, o Operaciones y cualquier combinaci´n con may´sculas y min´sculas. Esto es debido a que o u u el sistema de archivos de Windows tampoco hace esa distinci´n8 . Versiones m´s avanzadas o a de Matlab, 7.0 en adelante, muestran sin embargo un aviso si no existe una concordancia exacta min´sculas-may´sculas entre el nombre del fichero y el comando utilizado para u u llamarlo. rra Todas las variables se env´ por valor, no por referencia. Es decir, si una funci´n ıan o modifica una variable de entrada, esta modificaci´n se pierde cuando finalice su ejecuci´n, o o recuperando el valor original. Por ultimo, en un fichero se pueden incluir varias funciones. En este caso s´lo la primera ´ o funci´n es accesible desde el exterior (l´ o ınea de comandos, otras funciones,...) mientras que el resto de funciones presentes en ese fichero son internas, es decir, utilizables unicamente ´ por las funciones presentes en el archivo. Esto es importante a la hora de realizar una programaci´n modular. Si un conjunto de funciones son s´lo utilizadas por una funci´n o o o principal, se pueden insertar en el mismo fichero que ´sta. Evitamos as´ llenar la carpeta e ı de trabajo, o de nuestro proyecto, con ficheros y m´s ficheros. a 2.5. Vectores y matrices do Dado que principalmente trabajaremos s´lo con arrays de una y dos dimensiones o hablaremos en lo que sigue de los objetos matem´ticos correspondientes: vectores y ma- a trices. Todo lo que sigue se puede adaptar a arrays con m´s dimensiones, aunque por a simplificar, nos centraremos ahora en el manejo de vectores y matrices y dejaremos pen- diente para la Lecci´n IV el uso de arrays multidimensionales (tensores). o 2.5.1. Definici´n de matrices y vectores o Un vector o una matriz se puede definir dando sus elementos entre corchetes y sepa- r rando filas mediante “;”. Por ejemplo, las instrucciones 7 No hay que subestimar nunca la capacidad de olvido de uno mismo: el c´digo claro y legible de hoy o es ilegible semanas despu´s. Las ayudas facilitan la edici´n de los programas no s´lo para un usuario e o o externo sino para el propio programador. 8 Es decir, si existe un fichero llamado operaciones.m no es posible crear otro con nombre Operaciones.m 22
  • 29. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ >> a=[1 3 -1; 2 3 4; 4 5 1]; >> a2=[1 2 4; -1 0 1; 2 1 5]; >> b=[1; 3; 1]; b2=[-1 1 -2 2]; definen las matrices y vectores       1 3 −1 1 2 4 1 Bo a=  2 3 4  , a2 =  −1 0 1  , b =  3 , b2 = −1 1 −2 2 . 4 5 1 2 1 5 1 Matlab distingue entre vectores fila y columna por lo que habr´ que tenerlo en cuenta por a ejemplo cuando se desee hacer operaciones como sumas o productos. Desde una vertiente pr´ctica, si se va a trabajar con una matriz grande, por ejemplo a de tama˜o 20 × 10, y sus valores se van a introducir m´s adelante, se puede empezar con n a >> a=zeros(20,10); A partir de este instante se pueden insertar los elementos, accediendo a cada posici´n o mediante par´ntesis e >> a(4,5)=9; a(2,1)=6; a(1,1)=-3.4; rra >> a(4,5) ans= 9 En cualquier caso, si tratamos de introducir un valor en una posici´n no definida de la o matriz, Matlab ir´ adaptando el tama˜o seg´n juzgue apropiado9 , y no dar´ ning´ n a n u a u error. El siguiente ejemplo ilustra esta caracter´ ıstica >> clear c % c esta borrado >> c(1,2)=4 % c es ahora 1 x 2 c = do 0 4 >> c(3,3)=2 % c pasa a ser 3 x 3 c = 0 4 0 0 0 0 0 0 2 r Esta habilidad, aunque permite una programaci´n muy flexible y descuidada, debe uti- o lizarse con mesura dado que puede provocar errores de ejecuci´n muy dif´ o ıciles de detectar. 9 Ello obliga a que haya que redimensionar constantemente la memoria otorgada a la variable a. Esto supone un costo adicional, inapreciable con ejemplos peque˜os, pero importante para grandes cantidades n de memoria. Por tanto es mejor declarar primero las dimensiones de la matriz e informar as´ a Matlab de ı cu´nta memoria tiene que reservar. a 23
  • 30. 2.5 Vectores y matrices ´ LECCION I 2.5.2. Operaciones Todas las operaciones habituales entre matrices, tales como la suma, producto, poten- ciaci´n, c´lculo de determinantes, inversas..., est´n ya implementadas en Matlab. No hay o a a por tanto necesidad de programarse estas tareas. Por ejemplo, si a y a2 son matrices de tama˜os compatibles, las instrucciones n Bo a*a2 a^2 a+a2 devuelven el producto matricial de a y a2, el cuadrado de a (es decir, a*a) y la suma de a y a2. Es importante observar la diferencia con estas l´ıneas a.*a2 a.^2 En el primer caso, se devuelve la matriz resultado de multiplicar elemento a elemento a y a2 (por tanto deben tener el mismo tama˜o) y en el segundo, una matriz cuyas n entradas son el cuadrado de las de a. Esto es una constante en Matlab: el signo “.” indica que la operaci´n (un producto, una potencia o una divisi´n) se hace elemento a o o elemento, mientras que en caso contrario se calcula la operaci´n matem´tica, en este o a caso el producto matricial. rra Ejercicio 2.4 Introduce en a y a2 dos matrices de igual tama˜o. Observa el resultado de n ejecutar a+a2 a*a2 a.*a2 Define un vector b fila o columna y ejecuta b.^3 b’ Comprueba si estas operaciones est´n bien definidas a a*2 a+1 ¿Qu´ hacen exactamente? ¿Por qu´ crees que no es necesario “.” en la primera instrucci´n?. e e o do Otros comandos importantes son det inv / /. . Los dos primeros son el determinante y la inversa de una matriz cuadrada. Los operadores “/” y “” (slash y backslash) son ciertamente especiales: a/a2 es equivalente a a*inv(a2), aa2 es equivalente a inv(a)*a2 En cuanto a su relaci´n con ./ y . es la misma que ha surgido antes, esto es, aplicado o sobre matrices procede a realizar los cocientes elemento a elemento. Requiere por tanto que ambas matrices tengan el mismo tama˜o. n r Ejercicio 2.5 Ejecuta las instrucciones >> 3/5 >> 35 y observa el resultado. ¿Tiene sentido desde el punto de vista anterior?. Ejercicio 2.6 Dado b una matriz, ¿qu´ hace 1/b?. e 24
  • 31. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ Nota. El operador backslash “” se utiliza profusamente para resolver sistemas de ecua- ciones lineales, bajo la idea de que Ax = b ⇔ x = A−1 b. As´ si b es n × 1 y a es n × n, ı, Bo >> x=ab; devuelve en x la soluci´n del sistema correspondiente. o El funcionamiento real de dista mucho de ser tan simple. Esto es, no calcula la inversa de a para multiplicarla por b, sino que resuelve el sistema de ecuaciones por alguna variante del m´todo de Gauss. Se puede utilizar helpwin mldivide (o helpwin e mrdivide para /) para leer en detalle c´mo procede este comando. o Las funciones propias de Matlab trabajan de forma natural sobre vectores y matrices. El resultado final es equivalente a aplicar el comando elemento a elemento. Por ejemplo, >> a=[0 pi/3; -pi/3 0]; >> cos(a) rra ans = 1.0000 0.5000 0.5000 1.0000 es equivalente a >> [cos(0) cos(pi/3); cos(-pi/3) cos(0)] ans = 1.0000 0.5000 do 0.5000 1.0000 2.5.3. Detalles adicionales C´mo obtener las dimensiones de vectores y matrices o Los comandos de Matlab size y length nos proporcionan esta informaci´n: o >> a3=[1 2; 3 6; 5 -1]; >> size(a3) r ans = 3 2 >> length(a3) 25
  • 32. 2.5 Vectores y matrices ´ LECCION I ans = 3 >> a3=a3’; % cambiamos la forma de a3 >> size(a3) Bo ans = 2 3 >> [m,n]=size(a3); % m son las filas y n las columnas >> m ans = 2 rra >> n ans = 3 >> length(a3) ans = 3 do El comando size devuelve un vector de tama˜o 2×1 con el n´mero de filas y columnas n u del vector/matriz. El resultado es diferente seg´n se aplique a vectores fila o columna. La u orden length devuelve la longitud de una matriz o vector. Su significado en el caso de un vector est´ clara mientras que para matrices devuelve el m´ximo entre el n´mero de filas a a u y el n´mero de columnas. u Matrices especiales Matlab dispone de una serie de comandos que permiten construir matrices con una estructura particular. Cabe se˜alar las siguientes ´rdenes: n o r eye(n) es la matriz identidad de orden n; ones(m,n) es una matriz m x n de 1s; zeros(m,n) es una matriz m x n de 0s, esto es, igual que ones pero con ceros; y algunas m´s ex´ticas como hilb, invhilb, pascal, magic. a o 26
  • 33. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ Existen dos formas de introducir vectores cuyos valores siguen una distribuci´n regular o a:b:c construye el vector de valores [a a+b a+2*b .... a+k*b] donde a+k*b es el mayor n´mero natural que cumple a+k*b≤ c. La instrucci´n a:c toma b = 1. u o linspace(a,b,n) devuelve una partici´n uniforme de [a, b] en n puntos. o Bo Por ejemplo, >> 0:10 ans= 0 1 2 3 4 5 6 7 8 9 10 >> 10:-1:0 ans= rra 10 9 8 7 6 5 4 3 2 1 0 >> 0.1:0.3:1.5 ans = 0.1000 0.4000 0.7000 1.0000 1.3000 >> linspace(0,2,4) ans = do 0 0.6667 1.3333 2.0000 >> linspace(2,0,4) ans = 2.0000 1.3333 0.6667 0 Nota. Cuando Matlab tiene que devolver un vector y no se le especifica el formato, devuelve una fila. r 2.5.4. Acceso a partes de matrices El manejo de partes de vectores y matrices, as´ como la eliminaci´n de filas o columnas, ı o cambios de tama˜o, etc, se hace v´ instrucciones muy simples en Matlab. Aunque pueda n ıa resultar algo extra˜o al principio, un poco de pr´ctica es suficiente para que el usuario se n a 27
  • 34. 2.5 Vectores y matrices ´ LECCION I adapte a la nueva sintaxis, tan diferentes a la de un lenguaje tradicional, y pueda utilizarlo en sus c´digos. o Comencemos viendo un ejemplo: >> a=[1 2 3; 4 5 6; 7 8 9; 10 11 12]; >> a(2,3) % elemento (2,3) de a Bo ans = 6 >>a(2,:) % fila 2 de a ans = 4 5 6 >>a(:,1) % columna 1 rra ans = 1 4 7 10 >>a(:,2)=0 % columna 2 es ahora 0 a = do 1 0 3 4 0 6 7 0 9 10 0 12 Podemos acceder a partes de una fila o columna: >> a(1,2:3) % vector [a(1,2) a(1,3)] ans = r 0 3 >> a(2:4,3) % vector columna [a(2,3); a(3,3); a(4,3)] ans = 28
  • 35. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ 6 9 12 >> a(1:2,2:3) % matriz [a(1,2) a(1,3); a(2,2) a(2,3)] Bo ans = 0 3 0 6 En general, si p es un vector de n´meros enteros, v(p) devuelve [v(p(1)), v(p(2)), u ..., v(p(n))]. Por ejemplo, >> v=[0.1 0.2 0.3 0.4 0.5 0.6]; >> v(4:-1:2) ans= rra 0.4000 0.300 0.2000 >> p=[5 1 2 3 3 3]; % no importa que esten repetidos >> v(p) ans= 0.5000 0.1000 0.2000 0.3000 0.3000 0.3000 Ejercicio 2.7 Ejecuta las siguientes l´ ıneas >> a=[1 2 3 4; 5 6 7 8; 9 10 11 12]; do >> p=[1 3 2]; q=[1 2 1]; >> a(p,q) ¿Qu´ hacen exactamente?. e Igualmente es f´cil a˜adir filas y columnas a una matriz: a n >> a=[1 2 3 4; 5 6 7 8] a = r 1 2 3 4 5 6 7 8 >> a=[a; [1 -1 2 4]] % adosamos una fila nueva a = 29
  • 36. 2.6 Bucles y estructuras de decisi´n o ´ LECCION I 1 2 3 4 5 6 7 8 1 -1 2 4 >> a=[a [0; 2; 4] ] % una nueva columna Bo a = 1 2 3 4 0 5 6 7 8 2 1 -1 2 4 4 Si se desea eliminar una fila o columna se puede utilizar el s´ ımbolo vac´ []. Por ıo ejemplo, >> a(:,2)=[] % suprime la segunda columna rra a = 1 3 4 0 5 7 8 2 1 2 4 4 Ejercicio 2.8 Programa una funci´n cuyas entradas sean una matriz cuadrada y un t´rmino o e independiente compatible y que devuelva la matriz ampliada del sistema de ecuaciones lineales. Esto es, una matriz con la matriz original y una ultima columna con el t´rmino independiente. ´ e 2.6. Bucles y estructuras de decisi´n o do Claves en cualquier lenguaje de programaci´n, Matlab dispone de varias de ellas entre o las que sobresalen for e if, un est´ndar en el mundo de la inform´tica. a a 2.6.1. Bucles: el comando for En Matlab, la estructura for j=inicio:paso:final ..... end r implementa un bucle donde las l´ ıneas de c´digo entre for y end son ejecutadas repetida- o mente con j tomando los valores del vector inicio:paso:final (v´ase la Secci´n 2.5.3) e o Por ejemplo, >> for j=1:3; disp(j); end 1 30
  • 37. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ 2 3 >> for j=6:-2:2; disp(j-2); end Bo 4 2 0 En general, si v es un vector, for j=v ..... end rra procede a ejecutar las l´ ıneas internas con j tomando los valores del vector v. Por ejemplo, >> v=[2 5 3 1];for j=v; disp(j); end 2 5 3 1 Asociados a for, y en general a cualquier bucle, encontramos los comandos break y continue. El primero fuerza la salida inmediata del bucle mientras que el segundo reini- do cializa la iteraci´n con el siguiente valor del ´ o ındice. Ejercicio 2.9 La matriz de Hilbert de orden n es 1 1 ··· ··· 1   2 n  1 1 ··· ··· 1   2 3 n+1  A= . .  . .. ... ... .   . . .   1 1 1 n 2n−2 2n−1 Construye la matriz anterior mediante un fichero script y el uso de dos “for” anidados. r 2.6.2. Operadores l´gicos y estructuras de decisi´n o o Los operadores l´gicos m´s b´sicos en Matlab son o a a == igualdad, ~= desigualdad, > mayor, < menor, >= mayor o igual, <= menor o igual, & “y” l´gico, o | “o” l´gico o 31
  • 38. 2.6 Bucles y estructuras de decisi´n o ´ LECCION I El resultado de una comparaci´n es 1 si es verdadero, 0 si es falso: o >> a=1; b=2; c=3; >> a>0 ans = Bo 1 >> a>0 & b<3 ans = 1 >> a<0 | b<1 ans = rra 0 >> test= (a~=0) ans = 1 >> whos test Name Size Bytes Class do test 1x1 1 logical array Grand total is 1 element using 1 bytes Estos “0” y “1” no son valores num´ricos sino l´gicos como se comprueba con la ultima e o ´ instrucci´n10 . Cuando se aplica a un vector, devuelve un vector de verdadero/falso de la o misma longitud que el vector original: >> b=[1 2 -3 -1 2 -4]; p=(b>=1) % entradas de b>=1 p= r 1 1 0 0 1 0 En el ejemplo anterior, p(i)==1 si b(i)≥1 y cero en caso contrario. Ahora, podemos aislar los elementos mayores o iguales que 1 simplemente con 10 Ocupan un unico byte mientras que un n´mero real utiliza ocho bytes. ´ u 32
  • 39. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ >> b(p) 1 2 2 Desde este punto de vista es correcta y recomendable utilizar la instrucci´n o >> b(b>=1) % elementos de b mayores o iguales que 1 Bo 1 2 2 que adem´s resulta muy natural (y f´cil de entender). a a Nota. El comando logical puede utilizarse para construir vectores y estructuras l´gicas o a partir de vectores de n´meros enteros: u >> b=[2 4 6 8 10]; p=[1 0 0 1 1]; >> b(p) % Dara error rra ??? Subscript indices must either be real positive integers or logicals. >> p=logical(p); >> b(p) ans = 2 8 10 La estructura de decisi´n, como en muchos otros lenguajes, es if. Su sintaxis es la o siguiente: do if simple: si la operaci´n l´gica efectuada es verdadera, se ejecutan las l´ o o ıneas de c´digo comprendidas entre if y end o if (x<-1 | x>1) disp(’valor absoluto de x mayor que 1’) end if compuesto: como el anterior, pero un nuevo conjunto de l´ ıneas, comprendidas entre else y end son ejecutadas en caso de que la operaci´n l´gica efectuada en el o o if sea falsa: r if (x<0 & x>-10) f=x^2; % x entre -10 y 0 else f=sin(x^2); % x menor que -10 o mayor que 0 end 33
  • 40. 2.6 Bucles y estructuras de decisi´n o ´ LECCION I if de decisi´n m´ltiple: o u if (x<0) f=x.^2; disp(’x menor que cero’) elseif (x<sqrt(pi)) Bo f=sin(x^2); disp(’x en [0,sqrt(pi))’) elseif (x<2*sqrt(pi)) f=(x-sqrt(pi))^2; disp(’x en [sqrt(pi),2*sqrt(pi))’) else f=pi*cos(x^2); disp(’x en [2*pi,infinito)’) end Esta ultima instrucci´n es equivalente a anidar diferentes estructuras if, de la sigu- ´ o iente forma rra if (x<0) f=x.^2; disp(’x menor que cero’) else if (x<sqrt(pi)) f=sin(x^2); disp(’x en [0,sqrt(pi))’) else if (x<2*sqrt(pi)) f=(x-sqrt(pi))^2; disp(’x en [sqrt(pi),2*sqrt(pi))’) do else f=pi*cos(x.^2); disp(’x en [2*pi,infinito)’) end end end Obviamente, la primera forma es m´s clara y concisa. a Nota. Con la instrucci´n switch se puede implementar una estructura de decisi´n que o o r es esencialmente equivalente a un if anidado. Est´ disponible tambi´n el bucle while que procede a ejecutar un bucle (que se cierra a e tambi´n con un end) mientras una condici´n sea verdadera. Por tanto, es algo m´s flexible e o a que un for. En general todos los bucles y estructuras que requieran cerrarse, lo hacen con end. El uso de break y continue es exactamente el mismo. 34
  • 41. ´ LECCION I ıtulo 2. Matlab: Primeros pasos Cap´ Por ultimo, y volviendo a end, este comando tiene una curiosa funcionalidad extra: ´ sirve para referenciar el ultimo elemento de una fila o columna de una matriz. Por ejemplo ´ b(4:end) selecciona todos los elementos de b desde la posici´n cuarta en adelante. o Ejercicio 2.10 ¿Qu´ hace el siguiente fragmento de c´digo? e o Bo 01 r=[]; aux=0; 02 while aux<0.8 03 aux=rand(1); 04 r=[r aux]; 05 end 06 r(end)=[]; Ejercicio 2.11 Con la ayuda de Matlab, programa un par de ejemplos donde utilices switch y while. Ejercicio 2.12 (Un poco de todo) Implementa una funci´n de nombre findnonzeros o que dado un vector de entrada devuelva el n´mero de elementos no nulos y un vector que u contenga dichos elementos. rra Soluci´n. Una implementaci´n posible es la siguiente o o 01 % FINDNONZEROS 02 % 03 % [N,P]=FINDNONZEROS(X) devuelve 04 % 05 % N el numero de elementos no nulos en el vector X 06 % P un vector con los elementos no nulos de X 07 % 08 function [n,p]=findnonzeros(x) 09 do 10 p=[]; % p es vacio 11 for i=1:length(x) 12 if (x(i)~=0) % si x(i) no es cero 13 p=[p x(i)]; % apuntamos i al vector p 14 end 15 end 16 n=length(p); 17 return Observa como se recogen los resultados de la funci´n, n y p, o r >> a=[0.1 0. 0.3 0.1 0.6 0 0.1 0.2 0.4]; % vector!! >> [n,p]=findnonzeros(a) n = 7 35
  • 42. 2.6 Bucles y estructuras de decisi´n o ´ LECCION I p = Columns 1 through 5 0.1000 0.3000 0.1000 0.6000 0.1000 Bo Columns 6 through 7 0.2000 0.4000 Otra posible implementaci´n (mucho m´s elaborada y m´s propia de Matlab) es la sigu- o a a iente 01 % FINDNONZEROS 02 % 03 % [N,P]=FINDNONZEROS(X) devuelve 04 % rra 05 % N el numero de elementos no nulos en el vector X 06 % P un vector con los elementos no nulos de X 07 % 08 function [n,p]=findnonzeros(x) 09 10 p=x(x~=0); 11 n=length(p); 12 return Haz un esfuerzo en entender bien los comandos anteriores. Tras la suficiente pr´ctica, a esta versi´n se ve m´s clara y natural que la anterior. Observa c´mo se toman los elementos o a o no nulos del vector x (l´ınea 10). do r 36
  • 43. Cap´ ıtulo 3 Bo M´todos directos para sistemas de e ecuaciones lineales 3.1. M´todo de Gauss e El m´todo de Gauss, tambi´n conocido como eliminaci´n gaussiana, es el algoritmo e e o rra m´s sencillo para la resoluci´n de sistemas de ecuaciones lineales. Consta de dos partes a o bien diferenciadas: i) Transformaci´n del sistema lineal en otro equivalente, es decir, con la misma solu- o ci´n, donde la matriz es triangular superior. o ii) Resoluci´n del sistema triangular por sustituci´n regresiva. o o El paso i) se acomete v´ dos operaciones elementales: ıa (a) Sumar a una ecuaci´n otra multiplicada por un n´mero. o u (b) Intercambiar dos ecuaciones. do Si s´lo utilizamos la operaci´n (a) hablaremos del m´todo de Gauss sin pivotaje, y o o e con pivotaje parcial si tambi´n realizamos las operaciones (b)1 cuando la elecci´n de e o las filas que se conmutan sea una muy particular. Representando el sistema de ecuaciones en la forma matricial, todo lo anterior se reescribe en t´rminos de operaciones matriciales (sumar a una fila otra fila e intercambiar e 2 filas ). En lo que sigue expresaremos el sistema en la forma Ax = b, A ∈ Rn×n , x, b ∈ Rn , donde A es la matriz de coeficientes, b el t´rmino independiente y x el vector de soluciones. e r Los elementos de A se denotar´n por aij , y con bi los de b. a 1 Existe una tercera operaci´n (c), que consiste simplemente en multiplicar filas por constantes no o nulas. Esta operaci´n recibe el nombre de reescalado (de filas) y en problemas pr´cticos se suele utilizar o a con el fin de mejorar la estabilidad del sistema frente a errores de redondeo. 2 Otra posibilidad es intercambiar columnas, que se corresponde con reordenar las inc´gnitas). En este o caso se habla de pivotaje total. 37
  • 44. 3.1 M´todo de Gauss e ´ LECCION I 3.1.1. M´todo de Gauss sin pivotaje e El pseudoc´digo se expone a continuaci´n o o M´todo de Gauss e Bo 01 for i = 1 : n − 1 02 for k = i + 1 : n 03 ki = aki /aii 04 for j = i + 1 : n 05 akj = akj − ki aij 06 end 07 bk = bk − ki bi 08 end 09 end 10 11 xn = bn /ann 12 for i = n − 1 : −1 : 1 rra n 13 x i = bi − aij xj /aii j=i+1 15 end Las l´ ıneas 01--09 se corresponden con la reducci´n a la forma triangular de la matriz o y las l´ ıneas 11--15 con la resoluci´n del sistema triangular resultante. El elemento aii se o denomina pivote y debe ser distinto de cero para que el algoritmo funcione, dado que en caso contrario la operaci´n en 03 est´ mal definida. o a El algoritmo efect´a O(n /3) productos3 y otras tantas sumas para la reducci´n a la u 3 o forma triangular y O(n2 /2) sumas y productos para la resoluci´n del sistema triangular. o do Por tanto el costo se concentra en la primera fase del algoritmo y duplicar la dimensi´no del sistema exige multiplicar por ocho el tiempo de c´lculo (y por cuatro el costo en a memoria). Ejercicio 3.1 Implementa una funci´n cuyas entradas sean la matriz de coeficientes y el o t´rmino independiente y devuelva la soluci´n del sistema por el m´todo de Gauss. e o e Soluci´n. El siguiente programa es una soluci´n del ejercicio o o 01 % GAUSS r 02 % 03 % 04 % X=GAUSS(A,B) Solucion del sistema Ax=b con el metodo 05 % de Gauss sin pivotaje 3 es decir, el n´mero de multiplicaciones es n3 /3 + αn2 + βn + γ, donde α, β y γ son constantes u adecuadas. Con n creciente, el primer t´rmino es el dominante. e 38
  • 45. ´ LECCION I ıtulo 3. M´todos directos para sistemas de ecuaciones lineales Cap´ e 06 07 function x = gauss(a,b) 08 n=length(a); 09 10 % transformacion del sistema en uno triangular 11 for i=1:n-1 Bo 12 for k=i+1:n 13 l=a(k,i)/a(i,i); 14 for j=i+1:n 15 a(k,j)=a(k,j)-l*a(i,j); 16 end 17 b(k)=b(k)-l*b(i); 18 end 19 end 20 21 % resolucion del sistema triangular 22 x=zeros(n,1); % tambien vale x=b*0; 23 x(n)=b(n)/a(n,n); rra 24 for i=n-1:-1:1 25 s=0; 26 for j=i+1:n 27 s=s+a(i,j)*x(j); % sumatorio 28 end 29 x(i)=(b(i)-s)/a(i,i); 30 end 31 return El c´digo anterior es correcto y ciertamente recuerda a la sintaxis que usar´ o ıamos en una do programaci´n en un lenguaje tradicional como C o Pascal. Sin embargo desde el punto de o vista de Matlab es claramente redundante y muy mejorable. Los siguientes ejercicios ahondan en estos aspectos por lo que resolverlos es muy recomendable. Ejercicio 3.2 Reescribe el programa utilizando instrucciones y sintaxis propia de Matlab. Soluci´n. Las filas 14-16 del programa (04--06 del algoritmo) se pueden implementar o como una diferencia de dos vectores, a(k,i+1:n) y a(i,i+1:n), con cualquiera de estas dos instrucciones r a(k,i+1:n) =a(k,i+1:n) - l*a(i,i+1:n) a(k,:) =a(k,:) - m*a(i,:) La segunda es m´s c´moda de utilizar pero multiplica por dos el n´mero de operaciones a o u 4 en la ejecuci´n del m´todo . o e 4 ¿Por qu´?. e 39
  • 46. 3.1 M´todo de Gauss e ´ LECCION I De forma an´loga, el sumatorio de las l´ a ıneas 25-29 del c´digo (13 del algoritmo del o m´todo de Gauss) es simplemente el producto escalar, y de hecho tambi´n matricial, de e e dos vectores, el vector fila a(i,i+1:n) y el vector columna x(i+1:n). Esto es el c´digo o de las l´ ıneas 25--29 se puede sustituir por x(i)=(b(i)- a(i,i+1:n)*x(i+1:n))/a(i,i); Bo Ejercicio 3.3 (Avanzado) Podemos avanzar a´n m´s hacia la consecuci´n de algoritmos u a o matriciales. Consideremos la partici´n de A o a11 c1 b1 A= , b= d1 A11 b1 donde c1 , d1 son vectores (n − 1) × 1 y A11 una matriz (n − 1) × (n − 1). Entonces, el primer paso del m´todo de Gauss se puede escribir e a11 c1 b1 , b= 0 A11 − (a11 )−1 c1 d1 b1 − a−1 b1 d1 . 11 rra A(1) b(1) El segundo paso del m´todo de Gauss se aplica ahora sobre la matriz A(1) (de tama˜o (n−1)× e n (n − 1)) y el vector b(1) (de tama˜o (n − 1) × 1) y as´ se procede sucesivamente. Implementa n ı esta resoluci´n alternativa del m´todo de Gauss. o e (Ayuda. Observa estas tres instrucciones l=a(i+1:n,i)/a(i,i) a(i+1:n,i+1:n)-l*a(i,i+1:n) b(i+1:n)-l*b(i) ¿Qu´ hacen?) e Nota sobre la vectorizaci´n o La noci´n de vectorizaci´n, trabajar con vectores y matrices en lugar de elemento a ele- o o do mento, no es nueva ni en el An´lisis Num´rico ni en la computaci´n a alto nivel. El objetivo a e o que se persigue es que las todas las operaciones se reduzcan a operaciones matem´ticasa sencillas, como productos escalares, productos matriciales, b´squeda de m´ximos y m´ u a ıni- mos en un vector/matriz, suma de vectores y matrices... cuya implementaci´n se opti- o miza tomando en consideraci´n el entorno en el que se trabaja, tanto en software como o en hardware. Este conjunto de instrucciones se conocen como BLAS (basic linear algebra subprograms). Se distinguen tres niveles. El nivel uno est´ formada por operaciones entre a vectores, tales como la suma o el producto escalar de dos vectores, de O(n) operaciones, el nivel dos se ocupa de operaciones matriz-vector con O(n2 ) operaciones y el nivel tres son operaciones entre matrices, O(n3 ) operaciones. En m´quinas con m´ltiples procesadores a u r estos subprogramas deben adaptarse a dividir la tarea entre los procesadores disponibles de forma ´ptima y a buscar algoritmos que soporten este tipo de trabajo5 . o 5 Se deben buscar en primer lugar algoritmos que permitan dividir la tarea principal en subtareas equiparables, y de forma que finalicen en tiempos similares puesto que basta con que una de las subtareas se retrase respecto a las dem´s para que el conjunto de procesadores deba parar a esperar al rezagado a con la consiguiente p´rdida de tiempo (y dinero). e 40
  • 47. ´ LECCION I ıtulo 3. M´todos directos para sistemas de ecuaciones lineales Cap´ e Uno de los detalles m´s sencillos que hay que plantear es la estrategia de almace- a namiento de las matrices en memoria. Se puede optar por un almacenamiento por filas, como hace C, a11 a12 a13 A= ⇒ a11 → a12 → a13 → a21 → a22 → a23 a21 a22 a23 Bo donde con la notaci´n anterior queremos decir que aij y aij+1 ocupan posiciones consec- o utivas en memoria. Sin embargo Fortran o Matlab proceden por columnas a11 a12 a13 A= ⇒ a11 → a21 → a12 → a22 → a13 → a23 . a21 a22 a23 Seg´n sea el caso se trata de primar algoritmos que accedan a la matriz por filas o por u columnas para que el procesador trabaje con posiciones consecutivas de memoria6 . En esta rra din´mica, la resoluci´n del sistema triangular seg´n el algoritmo expuesto en el Ejercicio a o u 3.3 est´ mejor adaptado a la arquitectura de Matlab puesto que todas las operaciones se a hacen sobre columnas de la matriz a. 3.1.2. M´todo de Gauss con pivotaje parcial e Para evitar que el m´todo de Gauss se colapse, es decir, que encuentre en un paso i e que el elemento aii es nulo (l´ ınea 03 del algoritmo), se introduce la noci´n de pivotaje. La o idea es muy sencilla: en el caso de que en el i–´simo paso el pivote sea nulo, se procede a e intercambiar la fila i por una fila k tal que aki = 0 para cierto k > i. Si esto no es posible, do el sistema no es compatible determinado, es decir, o no tiene soluci´n o tiene infinitas o soluciones. Desde un punto de vista pr´ctico, el m´todo de Gauss con pivotaje procede a inter- a e cambiar siempre filas de forma que en cada paso |aki | = m´x |a i |, a =i,...,n esto es, el pivote es el mayor posible. Ello dota al sistema de una mayor estabilidad frente a los errores de redondeo. El algoritmo resultante es el siguiente (denotamos por a ↔ b el r intercambio de valores de a y b). 6 Cuando un procesador moderno lee algo en memoria, suele cargar a su memoria internar, la memoria cach´, posiciones adicionales y consecutivas de memoria bajo la convicci´n de que es probable que las e o requiera en el siguiente paso. 41