Universidad Complutense de Madrid ——————————————————————— Laboratorio de Computación Cient́ıfica Juan Jiménez 14 de septiembre de 2020 2 El contenido de estos apuntes esté1 bajo licencia Creative Commons Atribution-ShareAlike 4.0 http://creativecommons.org/licenses/by-sa/4.0/ ©Juan Jiménez http://creativecommons.org/licenses/by-sa/4.0/ Índice general 1. Introducción al software cient́ıfico 15 1.1. Introducción a los computadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.1.1. Niveles de descripción de un ordenador . . . . . . . . . . . . . . . . . . . . 16 1.1.2. El modelo de computador de Von Neumann . . . . . . . . . . . . . . . . . . 18 1.1.3. Representación binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.2. Aplicaciones de Software Cient́ıfico . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2. Introducción a la programación en Matlab 25 2.1. El entorno de programación de Matlab . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.1. La ventana de comandos de Matlab . . . . . . . . . . . . . . . . . . . . . . 25 2.1.2. Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.1.3. Vectores y matrices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.1.4. Estructuras y células . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.2. Entrada y salida de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.2.1. Exportar e importar datos en Matlab . . . . . . . . . . . . . . . . . . . . . 41 2.3. Operaciones aritméticas, relacionales y lógicas . . . . . . . . . . . . . . . . . . . . . 47 2.3.1. Operaciones aritméticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.3.2. Precedencia de los operadores aritméticos . . . . . . . . . . . . . . . . . . . 53 2.3.3. Operaciones Relacionales y lógicas. . . . . . . . . . . . . . . . . . . . . . . . 55 2.4. Scripts y Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 2.4.1. El editor de textos de Matlab. . . . . . . . . . . . . . . . . . . . . . . . . . 67 2.4.2. Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 2.4.3. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 2.4.4. Funciones incluidas en Matlab. . . . . . . . . . . . . . . . . . . . . . . . . . 76 2.4.5. Depuración. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 2.5. Control de Flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 2.5.1. Flujo condicional. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 2.5.2. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 2.5.3. Funciones recursivas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 2.5.4. Algoritmos y diagramas de flujo. . . . . . . . . . . . . . . . . . . . . . . . . 94 2.6. Representación Gráfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 2.6.1. El comando plot y las figuras en Matlab. . . . . . . . . . . . . . . . . . . . 97 2.6.2. Gráficos en 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 2.6.3. Gráficos en 3D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 3 4 ÍNDICE GENERAL 3. Aritmética del Computador y Fuentes de error 127 3.1. Representación binaria y decimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 3.2. Representación de números en el ordenador . . . . . . . . . . . . . . . . . . . . . . 128 3.2.1. Números no enteros: Representación en punto fijo y en punto flotante . . . 130 3.3. Errores en la representación numérica. . . . . . . . . . . . . . . . . . . . . . . . . . 138 3.3.1. Error de redondeo unitario . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 3.3.2. Errores de desbordamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 3.4. Errores derivados de las operaciones aritméticas . . . . . . . . . . . . . . . . . . . . 142 3.4.1. Acumulación de errores de redondeo . . . . . . . . . . . . . . . . . . . . . . 142 3.4.2. Anulación catastrófica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 3.4.3. Errores de desbordamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 4. Cálculo de ráıces de una función 149 4.1. Ráıces de una función . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.2. Metodos iterativos locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 4.2.1. Método de la bisección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 4.2.2. Método de interpolación lineal o (Regula falsi) . . . . . . . . . . . . . . . . 152 4.2.3. Método de Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . 157 4.2.4. Método de la secante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 4.2.5. Método de las aproximaciones sucesivas o del punto fijo . . . . . . . . . . . 161 4.3. Cálculo de ráıces de funciones con Matlab. . . . . . . . . . . . . . . . . . . . . . . . 172 4.3.1. La función de Matlab fzero. . . . . . . . . . . . . . . . . . . . . . . . . . . 172 4.3.2. Cálculo de ráıces de polinomios. . . . . . . . . . . . . . . . . . . . . . . . . 177 5. Aplicaciones del cálculo cient́ıfico al álgebra lineal 181 5.1. Matrices y vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 5.2. Operaciones matriciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 5.3. Operadores vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 5.4. Tipos de matrices empleados frecuentemente . . . . . . . . . . . . . . . . . . . . . 208 5.5. Factorización de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 5.5.1. Factorizacion LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 5.5.2. Factorización de Cholesky . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 5.5.3. Diagonalización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 5.5.4. Factorización QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 5.5.5. Factorización SVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 6. Sistemas de ecuaciones lineales 239 6.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 6.2. Condicionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 6.3. Métodos directos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 6.3.1. Sistemas triangulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 6.3.2. Métodos basados en las factorizaciones . . . . . . . . . . . . . . . . . . . . . 248 6.3.3. El método de eliminación de Gauss. . . . . . . . . . . . . . . . . . . . . . . 255 6.3.4. Gauss-Jordan y matrices en forma reducida escalonada . . . . . . . . . . . . 259 6.4. Métodos iterativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 6.4.1. El método de Jacobi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 6.4.2. El método de Gauss-Seidel. . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 6.4.3. Amortiguamiento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 6.4.4. Análisis de convergencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 ÍNDICE GENERAL 5 7. Interpolación y ajuste de funciones 281 7.1. El polinomio de Taylor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 7.2. Interpolación polinómica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 7.2.1. La matriz de Vandermonde . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 7.2.2. El polinomio interpolador de Lagrange. . . . . . . . . . . . . . . . . . . . . 286 7.3. Diferencias divididas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 7.3.1. El polinomio de Newton-Gregory . . . . . . . . . . . . . . . . . . . . . . . . 290 7.4. Interpolación por intervalos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 7.4.1. Interpolación mediante splines cúbicos . . . . . . . . . . . . . . . . . . . . . 295 7.4.2. Funciones propias de Matlab para interpolación por intervalos . . . . . . . . 300 7.5. Ajuste polinómico por el método de mı́nimos cuadrados . . . . . . . . . . . . . . . 301 7.5.1. Mı́nimos cuadrados en Matlab. . . . . . . . . . . . . . . . . . . . . . . . . . 305 7.5.2. Análisis de la bondad de un ajuste por mı́nimos cuadrados. . . . . . . . . . 306 7.6. Curvas de Bézier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 8. Diferenciación e Integración numérica 315 8.1. Diferenciación numérica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 8.1.1. Diferenciación numérica basada en el polinomio de interpolación. . . . . . . 316 8.1.2. Diferenciación numérica basada en diferencias finitas . . . . . . . . . . . . . 317 8.2. Integración numérica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 8.2.1. La fórmula del trapecio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 8.3. Las fórmulas de Simpson. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 8.4. Problemas de valor inicial en ecuaciones diferenciales . . . . . . . . . . . . . . . . . 327 8.4.1. El método de Euler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 8.4.2. Métodos de Runge-Kutta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 9. Tratamiento estad́ıstico de datos 335 9.1. Secuencias de números aleatorios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 9.1.1. El generador de números aleatorios de Matlab. . . . . . . . . . . . . . . . . 339 9.2. Probabilidad y distribuciones de probabilidad . . . . . . . . . . . . . . . . . . . . . 341 9.2.1. Sucesos aleatorios discretos . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 9.2.2. Distribuciones de probabilidad continuas . . . . . . . . . . . . . . . . . . . . 344 9.3. El teorema del ĺımite central . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 9.4. Incertidumbre en las medidas experimentales . . . . . . . . . . . . . . . . . . . . . 352 9.4.1. Fuentes de incertidumbre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 9.4.2. Intervalos de confianza. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 9.4.3. Propagación de la incertidumbre: Estimación de la incertidumbre de medidas indirectas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 9.4.4. Ejemplo de estimación de la incertidumbre con Matlab. . . . . . . . . . . . 360 10.Introducción al cálculo simbólico 365 10.1. Cálculo simbólico en el entorno de Matlab . . . . . . . . . . . . . . . . . . . . . . . 365 10.2. Variables y expresiones simbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 10.2.1. Variables simbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 10.2.2. Expresiones simbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 10.2.3. Simplificación de expresiones simbólicas . . . . . . . . . . . . . . . . . . . . 369 10.2.4. Sustitución de variables por valores numéricos . . . . . . . . . . . . . . . . . 370 10.3. Cálculo infinitesimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 10.3.1. Derivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 10.3.2. Integración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 6 ÍNDICE GENERAL 10.3.3. Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 10.3.4. Ĺımites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 10.4. Representación gráfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 Índice de figuras 1.1. Descripción por niveles de un computador . . . . . . . . . . . . . . . . . . . . . . . 17 1.2. Modelo de Von Neumann . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1. Entorno de desarrollo integrado de Matlab . . . . . . . . . . . . . . . . . . . . . . . 26 2.2. El Workspace de Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.3. Aspecto de la herramienta de importación de datos . . . . . . . . . . . . . . . . . . 47 2.4. posición del botón New Script y del menú New en el IDE de Matlab (Señalados en rojo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 2.5. Vista del editor de textos de Matlab mostrando el contenido del fichero ejemplo1.m 69 2.6. Ejemplo de uso de memoria y ámbito de variables durante la ejecución de una función 73 2.7. Vista de el editor de texto de Matlab. Circulo rojo error en el código. Rodeado en azul advertencias de posible mejoras. Rodeado en verde mensaje de error en tiempo de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 2.8. Vista de el editor de texto de Matlab. Circulo rojo error en el código. Rodeado en azul advertencias de posible mejoras. Rodeado en verde mensaje de error en tiempo de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 2.9. Breakpoint activo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 2.10. Parada de programa en breakpoint y herramientas de depuración . . . . . . . . . . 82 2.11. Esquema general de la estructura de flujo condicional if los términos escritos entre paréntesis son opcionales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 2.12. Esquema general de la estructura switch-case-otherwise . . . . . . . . . . . . . . . 87 2.13. Esquema general de la estructura de un bucle for los términos escritos entre parénte- sis son opcionales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 2.14. Esquema general de la estructura de un bucle while los términos escritos entre paréntesis son opcionales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 2.15. Śımbolos empleados en diagramas de flujo . . . . . . . . . . . . . . . . . . . . . . . 94 2.16. Diagrama de flujo para el problema de los números primos . . . . . . . . . . . . . . 96 2.17. Ventana gráfica de Matlab. representación de los punto de la tabla 2.6 . . . . . . . 98 2.18. gráfico de los puntos de la tabla 2.6 obtenida con el comando plot . . . . . . . . . 99 2.19. Datos de la tabla 2.6 representados mediante distintos tipos de ĺıneas y colores . . 101 2.20. gráficas de las funciones seno y coseno en el intervalo (−π, π). Representadas en la misma figura, usando el comando hold on. . . . . . . . . . . . . . . . . . . . . . . 103 2.21. Ejemplo de empleo del comando subplot . . . . . . . . . . . . . . . . . . . . . . . . 106 2.22. Ejemplo de empleo del comando fplot . . . . . . . . . . . . . . . . . . . . . . . . . 107 2.23. Representación de la función y = log10(x) empleando el comando semilogx . . . . 108 2.24. Representación de la función y = 10x empleando el comando semilogy . . . . . . . 109 2.25. Representación de la función r = √ θ empleando el comando polar . . . . . . . . . 110 7 8 ÍNDICE DE FIGURAS 2.26. Comparción entre los comandos stem, bar y stairs representando la misma colec- ción de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 2.27. histogramas del número de automóviles por cada 1000 habitantes para 213 páıses . 111 2.28. Ejemplo de uso de la función plotyy . . . . . . . . . . . . . . . . . . . . . . . . . . 112 2.29. Ejemplo de uso de la función quiver . . . . . . . . . . . . . . . . . . . . . . . . . . 113 2.30. Datos de la tabla 2.8 representados empleando el comando errorbar . . . . . . . . 115 2.31. Gráfico en 3D y rotaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 2.32. Ret́ıcula para representar superficies. Los puntos negros son los nodos definidos por las matrices Xm e Ym. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 2.33. Superficie elemental obtenida elevando los cuatros puntos centrales de la figura 2.32. 118 2.34. Comparación entre mesh y surf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 2.35. ret́ıcula con simetŕıa circular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 2.36. Cono representado sobre una ret́ıcula circular . . . . . . . . . . . . . . . . . . . . . 122 2.37. ret́ıcula con simetŕıa circular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 2.38. Comparación entre los resultados de contour, contour3, meshc y surfc, para la obtención de las curvas de nivel de una superficie. . . . . . . . . . . . . . . . . . . 124 2.39. Curva trazada sobre una superficie . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 3.1. Posición relativa de un número no máquina x y su redondeo a número máquina por truncamiento xT y por exceso xE Si redondeamos al más próximo de los dos, el error es siempre menor o igual a la mitad del intervalo xE − xT . . . . . . . . . . . . . . . 139 3.2. Ilustración del cambio de precisión con la magnitud de los números representados. 141 3.3. Números representables y desbordamientos en el estándar IEEE 754 de precisión simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 4.1. Ejemplo de ecuación de Kepler para a = 40 y b = 2 . . . . . . . . . . . . . . . . . . 150 4.2. Ilustración del teorema de Bolzano . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 4.3. Diagrama de flujo del método de la bisección . . . . . . . . . . . . . . . . . . . . . 152 4.4. proceso de obtención de la ráız de una función por el método de la bisección . . . 153 4.5. Obtención de la recta que une los extremos de un intervalo [a, b] que contiene una ráız de la función . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 4.6. Diagrama de flujo del método de interpolación lineal . . . . . . . . . . . . . . . . . 155 4.7. Proceso de obtención de la ráız de una función por el método de interpolación lineal 156 4.8. Recta tangente a la función f(x) en el punto x0 . . . . . . . . . . . . . . . . . . . . 157 4.9. Diagrama de flujo del método de Newton-Raphson . . . . . . . . . . . . . . . . . . 158 4.10. Proceso de obtención de la ráız de una función por el método de Newton . . . . . . 160 4.11. Recta secante a la función f(x) en los puntos x0 y x1 . . . . . . . . . . . . . . . . . 161 4.12. Diagrama de flujo del método de la secante . . . . . . . . . . . . . . . . . . . . . . 162 4.13. proceso de obtención de la ráız de una función por el método de la secante . . . . . 163 4.14. Obtención gráfica del punto fijo de la función, g(x) = − √ ex . . . . . . . . . . . . . 164 4.15. Diagrama de flujo del método del punto fijo. Nótese que la ráız obtenida corresponde a la función f(x) = g(x)− x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 4.16. g(x) = ± √ ex, Solo la rama negativa tiene un punto fijo. . . . . . . . . . . . . . . . 167 4.17. proceso de obtención de la ráız de la función f(x) = ex − x2 aplicando el método del punto fijo sobre la función g(x) = − √ ex . . . . . . . . . . . . . . . . . . . . . . 168 4.18. primeras iteraciones de la obtención de la ráız de la función f(x) = ex−x2 aplicando el método del punto fijo sobre la función g(x) = ln(x2). . . . . . . . . . . . . . . . 169 4.19. proceso de obtención de la ráız de la función f(x) = ex−x2 aplicando el método del punto fijo sobre la función g(x) = ln(x2), el método oscila sin converger a la solución.170 ÍNDICE DE FIGURAS 9 4.20. proceso de obtención de la ráız de la función f(x) = ex − x2 aplicando el método del punto fijo sobre la función g(x) = ex x , el método diverge rápidamente. . . . . . 171 4.21. Gráfica de la función f(x) = ex − x2, obtenida mediante pinta funcion. . . . . . . 174 5.1. Representación gráfica de vectores en el plano . . . . . . . . . . . . . . . . . . . . . 182 5.2. Representación gráfica de vectores en el espacio . . . . . . . . . . . . . . . . . . . . 183 5.3. interpretación geométrica de la norma de un vector . . . . . . . . . . . . . . . . . . 188 5.4. efecto del producto de un escalar por un vector . . . . . . . . . . . . . . . . . . . . 197 5.5. Representación gráfica de los vectores a = (1, 2), b = (−1, 1) y algunos vectores, combinación lineal de a y b. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 5.6. Representación gráfica de los vectores a = (1,−2, 1), b = (2, 0,−1), c = (−1, 1, 1) y del vector a− b+ c. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 5.7. Representación gráfica del vector a, en las base canónica C y en la base B . . . . . 201 5.8. Transformaciones lineales del vector a = [1; 2]. D, dilatación/contracción en un factor 1,5/0,5. Rx, reflexión respecto al eje x. Ry, reflexión respecto al eje y. Rθ rotaciones respecto al origen para ángulos θ = π/6 y θ = π/3 . . . . . . . . . . . . 205 5.9. Formas cuadráticas asociadas a las cuatro matrices diagonales: |a11| = |a22| = 1, a12 = a21 = 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 5.10. Obtención de un vector ortogonal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 6.1. Sistema de ecuaciones con solución única . . . . . . . . . . . . . . . . . . . . . . . . 241 6.2. Sistema de ecuaciones sin solución . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 6.3. Sistema de ecuaciones con infinitas soluciones . . . . . . . . . . . . . . . . . . . . . 243 6.4. Diagrama de flujo general de los métodos iterativos para resolver sistemas de ecua- ciones. La función M(x) es la que especifica en cada caso el método. . . . . . . . . 262 6.5. evolución de la tolerancia (módulo de la diferencia entre dos soluciones sucesivas) para un mismo sistema resuelto mediante el método de Gauss-Seidel y el método de Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 6.6. Evolución de la tolerancia para un mismo sistema empleando el metodo de Jacobi (diverge) y el de Jacobi amortiguado (converge). . . . . . . . . . . . . . . . . . . . 279 7.1. Comparación entre resultados obtenidos para polinomios de Taylor del logaritmo natural. (grados 2, 3, 5, 10, 20) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 7.2. Polynomios de Taylor para las funciones coseno y seno . . . . . . . . . . . . . . . 284 7.3. Polinomio de interpolación de grado nueve obtenido a partir de un conjunto de diez datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 7.4. Interpolaciones de orden cero y lineal para los datos de la figura 7.3 . . . . . . . . 294 7.5. Interpolación mediante spline cúbico de los datos de la figura 7.3 . . . . . . . . . . 300 7.6. Polinomio de mı́nimos cuadrados de grado 0 . . . . . . . . . . . . . . . . . . . . . . 303 7.7. Ejemplo de uso de la ventana gráfica de Matlab para realizar un ajuste por mı́nimos cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 7.8. Comparación entre los residuos obtenidos para los ajustes de mı́nimos cuadrados de un conjunto de datos empleando polinomios de grados 1 a 4. . . . . . . . . . . . . 308 7.9. Curvas de Bézier trazadas entre los puntos P0 = (0, 0) y Pn = (2, 1), variando el número y posición de los puntos de control. . . . . . . . . . . . . . . . . . . . . . . 310 7.10. Curvas de Bézier equivalentes, construidas a partir de una curva con tres puntos de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 7.11. Curva de Bézier y su derivada con respecto al parámetro del polinomio de Bernstein que la define: t ∈ [0, 1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 7.12. Interpolación de tres puntos mediante dos curvas de Bézier . . . . . . . . . . . . . 314 10 ÍNDICE DE FIGURAS 8.1. Variación del error cometido al aproximar la derivada de una función empleando una fórmula de diferenciación de dos puntos. . . . . . . . . . . . . . . . . . . . . . 318 8.2. Comparación entre las aproximaciones a la derivada de una función obgtenidas me- diante las diferencias de dos puntos adelantada y centrada . . . . . . . . . . . . . . 319 8.3. Interpretación gráfica de la fórmula del trapecio. . . . . . . . . . . . . . . . . . . . 322 8.4. Interpretación gráfica de la fórmula extendida del trapecio. . . . . . . . . . . . . . 323 8.5. Interpretación gráfica de la fórmula 1/3 de Simpsom. . . . . . . . . . . . . . . . . . 324 8.6. Interpretación gráfica de la fórmula 3/8 de Simpsom. . . . . . . . . . . . . . . . . . 325 8.7. Circuito RC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 8.8. Comparacion entre los resultados obtenidos mediante el método de Euler para dos pasos de integración h = 0,05 y h = 0,001 y la solución anaĺıtica para el voltaje Vo de un condensador durante su carga. . . . . . . . . . . . . . . . . . . . . . . . . . . 331 9.1. Secuencia de 100 números pseudoaleatorios generada mediante el método middle square. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 9.2. Distribución de probabilidad y probabilidad acumulada de los resultados de lanzar una moneda al aire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 9.3. Distribución de probabilidad y probabilidad acumulada de los resultados de lanzar un dado al aire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 9.4. Distribución de probabilidad y probabilidad acumulada de los resultados de lanzar un dado trucado al aire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 9.5. Distribución de probabilidad uniforme para un intervalo [a, b] y probabilidad acu- mulada correspondiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 9.6. Distribución de probabilidad exponencial . . . . . . . . . . . . . . . . . . . . . . . 347 9.7. Distribución de probabilidad normal . . . . . . . . . . . . . . . . . . . . . . . . . . 348 9.8. Teorema del ĺımite central: Comparación entre histogramas normalizados para un millón de medias y la distribución normal a que pertenecen . . . . . . . . . . . . . 351 9.9. Modo correcto de expresar una medida experimental . . . . . . . . . . . . . . . . . 352 9.10. Intervalo de confianza del 68,27 % . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 9.11. Función inversa de probabilidad normal acumulada . . . . . . . . . . . . . . . . . . 356 9.12. Intervalo de probabilidad P % . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 9.13. Comparación entre las distribuciones t de Student de 1, 5, 10, 20 y 30 grados de libertad y la distribución normal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 10.1. Gráfica de la función f(x) = esin(x) obtenida a partir de su expresión simbólica con el comando ezsurf de Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 10.2. Gráfica de la curva paramétrica x(t) = t cos(t), y(t) = t sin(t) obtenida a partir de su expresión simbólica con el comando ezsurf de Matlab . . . . . . . . . . . . . . 381 10.3. Gráfica de la función f(x) = sin (√ x2 + y2 ) obtenida a partir de su expresión simbólica con el comando ezsurf de Matlab . . . . . . . . . . . . . . . . . . . . . 382 Índice de cuadros 2.1. Formatos numéricos más comunes en Matlab . . . . . . . . . . . . . . . . . . . . . 33 2.2. Operadores aritméticos definidos en Matlab . . . . . . . . . . . . . . . . . . . . . . 48 2.3. Operadores relacionales definidos en Matlab . . . . . . . . . . . . . . . . . . . . . . 56 2.4. Operadores lógicos elemento a elemento . . . . . . . . . . . . . . . . . . . . . . . . 63 2.5. Algunas funciones matemáticas en Matlab de uso frecuente . . . . . . . . . . . . . 76 2.6. Datos de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 2.7. tipos de ĺınea y color del comando plot . . . . . . . . . . . . . . . . . . . . . . . . 100 2.8. Resultados experimentales de la medida de la velocidad de un móvil . . . . . . . . 114 3.1. Representación en exceso a 127, para un exponente de 8 bits. . . . . . . . . . . . . 134 3.2. Comparación entre los estándares del IEEE para la representación en punto flotante. (bs bit de signo, mi bit de mantisa, ei bit de exponente) . . . . . . . . . . . . . . . 137 7.1. f(x) = erf(x) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 7.2. Tabla de diferencia divididas para cuatro datos . . . . . . . . . . . . . . . . . . . . 289 7.3. Tabla de diferencias para el polinomio de Newton -Gregory de cuatro datos . . . . 291 8.1. Fórmulas de derivación basadas en diferencias finitas . . . . . . . . . . . . . . . . . 320 9.1. Mediciones de temperatura y Voltaje, sobre una resistencia de prueba de 100 Ω . . 361 9.2. Medidas y varianzas estimadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 11 12 ÍNDICE DE CUADROS Prefacio Estos apuntes cubren de forma aproximada el contenido del Laboratorio de computación cient́ıfi- ca del primer curso del grado en f́ısica. La idea de esta asignatura es introducir al estudiante a las estructuras elementales de programación y al cálculo numérico, como herramientas imprescindibles para el trabajo de investigación. Casi todos los métodos que se describen en estos apuntes fueron desarrollados hace siglos por los grandes: Newton, Gauss, Lagrange, etc. Métodos que no han perdido su utilidad y que, con el advenimiento de los computadores digitales, han ganado todav́ıa más si cabe en atractivo e interés. Se cumple una vez más la famosa frase atribuida a Bernardo de Chartres: “Somos como enanos a los hombros de gigantes. Podemos ver más, y más lejos que ellos, no por que nuestra vista sea más aguda, sino porque somos levantados sobre su gran altura.” En cuanto a los contenidos, ejemplos, código, etc. Estos apuntes deben mucho a muchas perso- nas. En primer lugar a Manuel Prieto y Segundo Esteban que elaboraron las presentaciones de la asignatura Introducción al cálculo cient́ıfico y programación de la antigua licenciatura en f́ısicas, de la que el laboratorio de computación cient́ıfica es heredera. En segundo lugar a mis compañeros de los departamentos de F́ısica de la Tierra, Astronomı́a y Astrof́ısica I y Arquitectura de computadores y Automática que han impartido la asignatura durante estos años: Rosa González Barras, Belén Rodŕıguez Fonseca, Maurizio Matessini, Pablo Zurita, Vicente Carlos Rúız Mart́ınez, Encarna Serrano, Carlos Garćıa Sánchez, Jose Antonio Mart́ın, Victoria López López, Alberto del Barrio, Blanca Ayarzagüena, Javier Gómez Selles, Nacho Gómez Pérez, Marta Ávalos, Iñaqui Hidalgo, Daviz sánchez, Juan Rodriguez, Maŕıa Ramirez, Álvaro de la Cáma- ra (Espero no haberme olvidado de nadie). Muchas gracias a todos por tantas horas de trabajo compartidas. Por último, los errores y erratas que encuentres en estas notas, esos śı que son de mi exclusiva responsabilidad. Puedes —si quieres— ayudarme a corregirlos en futuras ediciones escribiendo a: juan.jimenez@fis.ucm.es Juan Jiménez. 13 14 ÍNDICE DE CUADROS Caṕıtulo 1 Introducción al software cient́ıfico En la actualidad, el ordenador se ha convertido en una herramienta imprescindible para el trabajo de cualquier investigador cient́ıfico. Su uso ha permitido realizar tareas que sin su ayuda resultaŕıan sencillamente imposibles de acometer. Entre otras, distinguiremos las tres siguientes: Adquisición de datos de dispositivos experimentales. Análisis y tratamiento de datos experimentales. Cálculo Ciéntifico. La primera de éstas tareas queda fuera de los contenidos de esta asignatura. Su objetivo es emplear el ordenador para recoger datos automáticamente de los sensores empleados en un dispo- sitivo experimental. El procedimiento habitual es emplear dispositivos electrónicos que traducen las lecturas de un sensor (un termómetro, un manómetro, un caudaĺımetro, una cámara etc.) a un voltaje. El voltaje es digitalizado, es decir, convertido a una secuencia de ceros y unos, y almacena- do en un ordenador para su posterior análisis o/y directamente monitorizado, es decir, mostrado en la pantalla del ordenador. En muchos casos el ordenador es a su vez capaz de interactuar con el dispositivo experimental: iniciar o detener un experimento, regular las condiciones en que se realiza, disparar alarmas si se producen errores, etc. De este modo, el investigador cient́ıfico, queda dispensado de la tarea de adquirir por śı mismo los datos experimentales. Tarea que en algunos casos resultaŕıa imposible, por ejemplo si necesita medir muchas variables a la vez o si debe medirlas a gran ritmo; y en la que, en general, es relativamente fácil cometer errores. El análisis y tratamiento de datos experimentales, constituye una tarea fundamental dentro del trabajo de investigación cient́ıfica. Los ordenadores permiten realizar dichas tareas, de una forma eficiente y segura con cantidades de datos que resultaŕıan imposibles de manejar hace 50 años. Como veremos más adelante, una simple hoja de cálculo puede ahorrarnos una cuantas horas de cálculos tediosos. El análisis estad́ıstico de un conjunto de datos experimentales, el cálculo –la estimación– de los errores experimentales cometidos, la posterior regresión de los datos obtenidos a una función matemática que permita establecer una ley o al menos una relación entre los datos obtenidos, formar parte del trabajo cotidiano del investigador, virtualmente en todos los campos de la ciencia. Por último el cálculo. Cabŕıa decir que constituye el núcleo del trabajo de investigación. El cient́ıfico trata de explicar la realidad que le rodea, mediante el empleo de una descripción ma- temática. Dicha descripción suele tomar la forma de un modelo matemático más o menos complejo. La validez de un modelo está ligada a que sea capaz de reproducir los resultados experimentales 15 16 CAPÍTULO 1. INTRODUCCIÓN AL SOFTWARE CIENTÍFICO obtenidos del fenómeno que pretende explicar. Si el modelo es bueno será capaz de obtener me- diante cálculo unos resultados similares a los obtenido mediante el experimento. De este modo, el modelo queda validado y es posible emplearlo para predecir cómo se comportará el sistema objeto de estudio en otras condiciones. 1.1. Introducción a los computadores Más o menos todos estamos familiarizados con lo que es un computador, los encontramos a diario continuamente y, de hecho, hay muchos aspectos de nuestra vida actual que seŕıan inimaginables sin los computadores. En términos muy generales, podemos definir un computador como una máquina que es capaz de recibir instrucciones y realizar operaciones (cálculos) a partir de las instrucciones recibidas. Precisamente es la capacidad de recibir instrucciones lo que hace del ordenador una herramienta versátil; según las instrucciones recibidas y de acuerdo también a sus posibilidades como máquina, el ordenador puede realizar tareas muy distintas, entre las que cabe destacar como más generales, las siguientes: Procesamiento de datos Almacenamiento de datos Transferencias de datos entre el computador y el exterior Control de las anteriores operaciones El computador se diseña para realizar funciones generales que se especifican cuando se pro- grama. La programación es la que concreta las tareas que efectivamente realiza un ordenador concreto. 1.1.1. Niveles de descripción de un ordenador La figura 1.1 muestra un modelo general de un computador descrito por niveles. Cada nivel, supone y se apoya en el nivel anterior. 1. Nivel F́ısico. Constituye la base del hardware del computador. Está constituido por los componentes electrónicos básicos, diodos, transistores, resistencias, etc. En un computador moderno, no es posible separar o tan siquiera observar dichos componentes: Se han fabricado directamente sobre un cristal semiconductor, y forman parte de un dispositivo electrónico conocido con el nombre de circuito integrado. 2. Circuito Digital. Los componentes del nivel f́ısico se agrupan formando circuitos digitales, (En nuestro caso circuitos digitales integrados). Los circuitos digitales trabajan solo con dos niveles de tensión (V1, V0) lo que permite emplearlos para establecer relaciones lógicas: V1=verdadero, V2=falso. Estas relaciones lógicas establecidas empleando los valores de la tensión de los circuitos digitales constituyen el soporte de todos los cálculos que el computador puede realizar. 3. Organización Hardware del sistema. Los circuitos digitales integrados se agrupan y organizan para formar el Hardware del ordenador. Los módulos básicos que constituyen el Hardware son la unidad central de procesos (CPU), La unidad de memoria y las unidades de entrada y salida de datos. Dichos componentes están conectados entre śı mediante un bus, que transfiere datos de una unidad a otra. 1.1. INTRODUCCIÓN A LOS COMPUTADORES 17 Nivel Físico Circuito Digital Hardware del sistema Arquitectura del Computador Sistema Operativo/ Compilador Lenguaje de alto nivel Aplicación Figura 1.1: Descripción por niveles de un computador 4. Arquitectura del computador. La arquitectura define cómo trabaja el computador. Por tanto, está estrechamente relacionada con la organización hardware del sistema, pero opera a un nivel de abstracción superior. Establece cómo se accede a los registros de memoria, arbitra el uso de los buses que comunican unos componentes con otros, y regula el trabajo de la CPU. Sobre la arquitectura se establece el lenguaje básico en el que trabaja el ordenador, conocido cómo lenguaje máquina. Es un lenguaje que emplea todav́ıa niveles lógicos binarios (ceros o unos) y por tanto no demasiado apto para ser interpretado por los seres humanos. Este lenguaje permite al ordenador realizar operaciones básicas como copiar el contenido de un registro de memoria en otro, sumar el contenido de dos registros de memoria, etc. El lenguaje máquina es adecuado para los computadores, pero no para los humanos, por eso, los fabricantes suministran junto con el computador un repertorio básico de instrucciones que su máquina puede entender y realizar en un lenguaje algo más asequible. Se trata del lenguaje ensamblador. Los comandos de éste lenguaje son fácilmente traducibles en una o varias instrucciones de lenguaje máquina. Aún aśı se trata de un lenguaje en el que programar directamente resulta una tarea tediosa y proclive a cometer errores. 5. Compiladores y Sistemas Operativos Los Compiladores constituyen un tipo de progra- mas especiales que permiten convertir un conjunto de instrucciones, escritas en un lenguaje de alto nivel en lenguaje máquina. El programador escribe sus instrucciones en un fichero de texto normal, perfectamente legible para el ser humano, y el compilador convierte las ins- trucciones contenidas en dicho fichero en secuencias binarias comprensibles por la máquina. 18 CAPÍTULO 1. INTRODUCCIÓN AL SOFTWARE CIENTÍFICO Los computadores primitivos solo eran capaces de ejecutar un programa a la vez. A medida que se fueron fabricando ordenadores mas sofisticados, surgió la idea de crear programas que se encargaran de las tareas básicas: gestionar el flujo de información, manejar periféricos, etc. Estos programas reciben el nombre de sistemas operativos. Los computadores modernos cargan al arrancar un sistema operativo que controla la ejecución del resto de las aplicaciones. Ejemplos de sistemas operativos son DOS (Disk Operating System), Unix y su versión para ordenadores personales Linux. 6. Lenguajes de alto nivel. Los lenguajes de alto nivel están pensados para facilitar la ta- rea del programador, desentendiéndose de los detalles de implementación del hardware del ordenador. Están compuestos por un conjunto de comandos y unas reglas sintácticas, que permiten describir las instrucciones para el computador en forma de texto. De una manera muy general, se pueden dividir los lenguajes de alto nivel en lenguajes compi- lados y lenguajes interpretados. Los lenguajes compilados emplean un compilador para con- vertir los comandos del lenguaje de alto nivel en lenguaje máquina. Ejemplos de lenguajes compilados son C , C++ y Fortran. Los lenguajes interpretados a diferencia de los anteriores no se traducen a lenguaje máquina antes de ejecutarse. Si no que utilizan otro programa –el interprete– que va leyendo los comandos del lenguaje y convirtiéndolos en instrucciones máquina a la vez que el programa se va ejecutando. Ejemplos de programas interpretado son Basic, Python y Java. 7. Aplicaciones. Se suele entender por aplicaciones programas orientados a tareas espećıficas, disponibles para un usuario final. Habitualmente se trata de programas escritos en un lenguaje de alto nivel y presentados en un formato fácilmente comprensible para quien los usa. Existen multitud de aplicaciones, entre las más conocidas cabe incluir los navegadores para Internet, como Explorer, Mocilla o Google Crome, los editores de texto, como Word, las hojas de cálculo como Excel o los clientes de correo como Outlook. En realidad, la lista de aplicaciones disponibles en el mercado seŕıa interminable. 1.1.2. El modelo de computador de Von Neumann Los computadores modernos siguen, en lineas generales, el modelo propuesto por Von Newmann. La figura 1.2 muestra un esquema de dicho modelo. En el modelo de Von Newman se pueden distinguir tres módulos básicos y una serie de elementos de interconexión. Los módulos básicos son: La Unidad Central de Procesos. CPU (Central process unit)) , esta unidad constituye el núcleo en el que el ordenador realiza las operaciones. Dentro de la CPU pueden a su vez distinguirse las siguientes partes • La unidad de proceso ó ruta de datos: Está formada por La Unidad Aritmético Lógica (ALU), capaz de realizar las operaciones aritméticas y lógicas que indican las instruc- ciones del programa. En general las ALUs se construyen para realizar aritmética entre enteros, y realizar las operaciones lógicas básicas del algebra de Boole (AND, OR, etc). Habitualmente, las operaciones para números no enteros, representados en punto flo- tante se suelen realizar empleando un procesador espećıfico que se conoce con el nombre de Coprocesador matemático. La velocidad de procesamiento suele medirse en millones de operaciones por segundo (MIPS) o millones de operaciones en punto flotante por segundo (MFLOPS). 1.1. INTRODUCCIÓN A LOS COMPUTADORES 19 Unidad de Control (UC) Unidad Aritmético Lógica ALU C P U Registros R0 R7 . . . Reg. Instr. (IR) Reg.Dir. Mem (MAR) Reg.Dat. Men (MDR) Cont. Prog. (PC) Reg. Estado (SR) Memoria E/S Bus Datos Bus Direcc. Bus Control Figura 1.2: Modelo de Von Neumann • El banco de registros: Conjunto de registros en los que se almacenan los datos con los que trabaja la ALU y los resultados obtenidos. • La unidad de control (UC) o ruta de control: se encarga de buscar las instrucciones en la memoria principal y guardarlas en el registro de instrucciones, las decodifica, las ejecuta empleando la ALU, guarda los resultados en el registro de datos, y guarda las condiciones derivadas de la operación realizada en el registro de estado. El registro de datos de memoria, contiene los datos que se están leyendo de la memoria principal o van a escribirse en la misma. El registro de direcciones de memoria, guarda la dirección de la memoria principal a las que esta accediendo la ALU, para leer o escribir. El contador del programa, también conocido como puntero de instrucciones, es un registro que guarda la posición en la que se encuentra la CPU dentro de la secuencia de instrucciones de un programa. La unidad de memoria. Se trata de la memoria principal o primaria del computador. Está dividida en bloques de memoria que se identifican mediante una dirección. La CPU tiene acceso directo a dichos bloques de memoria. 20 CAPÍTULO 1. INTRODUCCIÓN AL SOFTWARE CIENTÍFICO La unidad elemental de información digital es el bit (0,1). La capacidad de almacenamiento de datos se mide en Bytes y en sus múltiplos, calculados como potencias de 21 1 Byte = 8 bits 1 Word = 16 bits = 2B 1 KiB = 210 bits = 1024 B 1 MiB = 220 bits = 1024 KB 1 GiB = 230 bits 1 TiB = 240 bits Unidad de Entrada/Salida. Transfiere información entre el computador y los dispositivos periféricos. Los elementos de interconexión se conocen con el nombre de Buses. Se pueden distinguir tres: En bus de datos, por el que se transfieren datos entre la CPU y la memoria ó la unidad de entrada/salida. El bus de direcciones, par especificar una dirección de memoria o del registro de E/S. Y el bus de Control, por el que se env́ıan señales de control, tales como la señal de reloj, la señal de control de lectura/escrituras entre otras. 1.1.3. Representación binaria Veamos con algo más de detalle, cómo representa la información un computador. Como se ex- plicó anteriormente, La electrónica que constituye la parte f́ısica del ordenador, trabaja con dos niveles de voltaje. Esto permite definir dos estados, –alto, bajo– que pueden representarse dos śımbolos 0 y 1. Habitualmente, empleamos 10 śımbolos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, es decir, empleamos una representación decimal. Cuando queremos representar números mayores que nueve, dado que hemos agotado el número de d́ıgitos disponibles, lo que hacemos es combinarlos, agrupando canti- dades de diez en diez. Aśı por ejemplo, el numero 16, representa seis unidades más un grupo de diez unidades y el número 462 representa dos unidades más seis grupos de diez unidades más cuatro grupos de 10 grupos de 10 unidades. Matemáticamente, esto es equivalentes a emplear sumas de d́ıgitos por potencias de diez: 13024 = 1× 104 + 3× 103 + 0× 102 + 2× 101 + 4× 100 Si recorremos los d́ıgitos que componen el número de izquierda derecha, cada uno de ellos representa una potencia de diez superior, porque cada uno representa la cantidad de grupos de 10 grupos, de grupos ... de diez grupos de unidades. Esto hace que potencialmente podamos representar cantidades tan grandes como queramos, empleando tan solo diez śımbolos. Esta representación, a la que estamos habituados recibe el nombre de representación en base 10 . Pero no es la única posible. Volvamos a la representación empleada por el computador. En este caso solo tenemos dos śımbolos distintos el 0 y el 1. Si queremos emplear una representación análoga a la representación en base diez, deberemos agrupar ahora las cantidad en grupos de dos. Aśı los únicos números que admiten ser representados con un solo d́ıgito son el uno y el cero. Para representar el número dos, 1Los prefijos K(Kilo),M(Mega),G (Giga), etc., se reservan en el sistema internacional para indicar potencias de 10. Para su equivalente en potencias de 2 se deben emplear los términos Ki (Kibi), Mi (Mebi),Gi (Gibi),T i,(Tebi). Por tanto, debeŕıa decirse Kibibyte, Mebibyte, etc. Sin embargo, esta notación no está muy extendida y se habla de KB (KiloBytes), MB (Megabytes), etc aunque se realice el cálculo en potencias de 2 1.1. INTRODUCCIÓN A LOS COMPUTADORES 21 necesitamos agrupar: tendremos 0 unidades y 1 grupo de dos, con lo que la representación del número dos en base dos será 10. Para representar el número tres, tendremos una unidad más un grupo de dos, por lo que la representación será 11, y aśı sucesivamente. Matemáticamente esto es equivalente emplear sumas de d́ıgitos por potencias de 2: 10110 = 1× 24 + 0× 23 + 1× 22 + 1× 21 + 0× 20 Esta representación recibe el nombre de representación binaria o en base 2. La expansión de un número representado en binario en potencias de 2, nos da un método directo de obtener su representación decimal. Aśı, para el ejemplo anterior, si calculamos las potencias de dos y sumamos los resultados obtenemos: 1× 24 + 0× 23 + 1× 22 + 1× 21 + 0× 20 = 16 + 0 + 4 + 2 + 0 = 22 que es la representación en base 10 del número binario 10110. Para números no enteros, la representación tanto en decimal como en binario, se extiende de modo natural empleando potencias negativas de 10 y de 2 respectivamente. Aśı, 835,41 = 8× 102 + 3× 101 + 5× 100 + 4× 10−1 + 1× 10−2 y para un número en binario, 101,01 = 1× 22 + 0× 21 + 1× 20 + 0× 2−1 + 1× 2−2 De nuevo, basta calcular el término de la derecha de la expresión anterior para obtener la representación decimal del número 101,01. ¿Cómo transformar la representación de un número de decimal a binario? De nuevo nos da la clave la representación en sumas de productos de d́ıgitos por potencias de dos. Empecemos por el caso de un número entero. Supongamos un número D, representado en decimal. Queremos expandirlo en una suma de potencias de dos. Si dividimos el número por 2, podŕıamos representarlo cómo: D = 2 · C1 +R1 donde C1 representa el cociente de la división y R1 el resto. Como estamos dividiendo por dos, el resto solo puede valer cero o uno. Supongamos ahora que volvemos a dividir el cociente obtenido por dos, C1 = 2 · C2 +R2 Si sustituimos el valor obtenido para C1 en la ecuación inicial obtenemos, D = 2 · (2 · C2 +R2) +R1 = 22 · C2 +R2 · 21 +R1 · 20 Si volvemos a dividir el nuevo cociente obtenido C2 por dos, y volvemos a sustituir, C2 = 2 · C3 +R3 D = 22 · (2 · C3 +R3) +R2 · 21 +R1 · 20 = 23 · C3 +R3 · 22 +R2 · 21 +R1 · 20 Supongamos que tras repetir este proceso n veces, obtenemos un conciente Cn = 1. Lógicamente no tiene sentido seguir dividiendo ya que a partir de este punto, cualquier división posterior que hagamos nos dará cociente 0 y resto igual a Cn. Por tanto, 22 CAPÍTULO 1. INTRODUCCIÓN AL SOFTWARE CIENTÍFICO D = 1 · 2n +Rn · 2n−1 · · ·+R3 · 22 +R2 · 21 +R1 · 20 La expresión obtenida, coincide precisamente con la expansión en potencias de dos del número binario 1Rn · · ·R3R2R1. Como ejemplo,podemos obtener la representación en binario del número 234, empleando el método descrito: vamos dividiendo el número y los cocientes sucesivos entre dos, hasta obtener un cociente igual a uno y a continuación, construimos la representación binaria del número colocando por orden, de derecha a izquierda. los restos obtenidos de las sucesivas divisiones y añadiendo un uno más a la izquierda de la cifra construida con los restos: Dividendo Cociente ÷2 Resto 234 117 0 117 58 1 58 29 0 29 14 1 14 7 0 7 3 1 3 1 1 Por tanto, la representación en binario de 234 es 11101010. Supongamos ahora un número no entero, representado en decimal, de la forma 0, d . Si lo multiplicamos por dos: E1, d1 = 0, d · 2 (1.1) Donde E1 representa la parte entera y d1 la parte decimal del número calculado. Podemos entonces representar 0, d como, 0, d = (E1, d1) · 2−1 = E1 · 2−1 + 0, d1 · 2−1 (1.2) Si volvemos a multiplicar 0, d1 por dos, E2, d2 = 0, d1 · 2 (1.3) 0, d1 = E2 · 2−1 + 0, d2 · 2−1 (1.4) y sustituyendo en 1.2 0, d = E1 · 2−1 + E2 · 2−2 + 0, d2 · 2−2 (1.5) ¿Hasta cuando repetir el proceso? En principio hasta que obtengamos un valor cero para la parte decimal, 0, dn = 0. Pero esta condición puede no cumplirse nunca. Puede darse el caso –de hecho es lo más probable– de que un número que tiene una representación exacta en decimal, no la tenga en binario. El criterio para detener el proceso será entonces obtener un determinado número de decimales o bien seguir el proceso hasta que la parte decimal obtenida vuelva a repetirse. Puesto que los ordenadores tienen un tamaño de registro limitado, también está limitado el número de d́ıgitos con el que pueden representar un número decimal. Por eso, lo habitual será truncar el número asumiendo el error que se comete al proceder aśı. De este modo, obtenemos la expansión del número original en potencias de dos, 0, d · 2 = E1 · 2−1 + E2 · 2−2 + · · ·+ En · 2−3 + · · · (1.6) 1.2. APLICACIONES DE SOFTWARE CIENTÍFICO 23 Donde los valores E1 · · ·En son precisamente los d́ıgitos correspondientes a la representación del número en binario: 0.E1E2 · · ·En. (Es trivial comprobar que solo pueden valer 0 ó 1). Veamos un ejemplo de cada caso, obteniendo la representación binaria del número 0, 625, que tiene representación exacta, y la del número 0, 626, que no la tiene. En este segundo caso, calcula- remos una representación aproximada, tomando 8 decimales. P decimal ×2 P entera P decimal ×2 P entera 0,625 1,25 1 0,623 1,246 1 0,25 0,5 0 0,246 0,492 0 0,5 1,0 1 0,492 0,984 0 0,984 1,968 1 0,968 1,936 1 0,936 1,872 1 0.872 1.744 1 0.744 1.488 1 Para construir la representación binaria del primero de los números, nos basta tomar las partes enteras obtenidas, por orden, de derecha a izquierda y añadir un 0 y la coma decimal a la izquierda. Por tanto la representación binaria de 0, 625 es 0, 101. Si expandimos su valor en potencias de dos, volvemos a recuperar el número original en su representación decimal. En el segundo caso, la representación binaria, tomando nueve decimales de 0, 623 es 0,10011111. Podemos calcular el error que cometemos al despreciar el resto de los decimales, volviendo a convertir el resultado obtenido a su representación en base diez, 0 · 20 + 1 · 2−1 + 0 · 2−2 + 0 · 2−3 + 1 · 2−4 + 1 · 2−5 + 1 · 2−6 + 1 · 2−7 + 1 · 2−8 = 0, 62109375 El error cometido es, en este caso: Error = 0, 623− 0, 62109375 = 0, 00190625. 1.2. Aplicaciones de Software Cient́ıfico Dentro del mundo de las aplicaciones, merecen una mención aparte las dedicadas al cálculo cient́ıfico, por su conexión con la asignatura. Es posible emplear lenguajes de alto nivel para construir rutinas y programas que permitan resolver directamente un determinado problema de cálculo. En este sentido, el lenguaje FORTRAN se ha empleado durante años para ese fin, y todav́ıa sigue empleándose en muchas disciplinas cient́ıficas y de la Ingenieŕıa. Sin embargo, hay muchos aspectos no triviales del cálculo con un computador, que obligaŕıan al cient́ıfico que tuviera que programar sus propios programas a ser a la vez un experto en computadores. Por esta razón, se han ido desarrollando aplicaciones espećıficas para cálculo cient́ıfico que permiten al investigador centrarse en la resolución de su problema y no en el desarrollo de la herramienta adecuada para resolverlo. En algunos casos, se trata de aplicaciones a medida, relacionadas directamente con algún área cient́ıfica concreta. En otros, consisten en paquetes de funciones espećıficos para realizar de forma eficiente determinados cálculos, como por ejemplo el paquete SPSS para cálculo estad́ıstico. Un grupo especialmente interesante lo forman algunos paquetes de software que podŕıamos situar a mitad de camino entre los lenguajes de alto nivel y las aplicaciones: Contienen extensas libreŕıas de funciones, que pueden ser empleadas de una forma directa para realizar cálculos y además permiten realizar programas espećıficos empleando su propio lenguaje. Entre estos podemos destacar Mathematica, Maple , Matlab, Octave y Scilab y Python. El uso de estas herramientas 24 CAPÍTULO 1. INTRODUCCIÓN AL SOFTWARE CIENTÍFICO se ha extendido enormemente en la comunidad cient́ıfica. Algunas como Matlab constituyen casi un estándar en determinadas áreas de conocimiento. Caṕıtulo 2 Introducción a la programación en Matlab Este caṕıtulo presenta una introducción general a la programación. Para su desarrollo, vamos a emplear una de las aplicaciones informáticas para cálculo cient́ıfico que más aceptación ha tenido en los últimos años: el entorno de programación de Matlab. Matlab es el acrónimo de MATrix LABboratory. El nombre está relacionado con el empleo de matrices como elemento básico para el cálculo numérico. Usaremos esta herramienta, entre otras motivos, porque nos ofrece la posibilidad de realizar programas similares a los que podŕıamos desarrollar con un lenguaje de programación de alto nivel, nos permite resolver problemas de cálculo cient́ıfico directamente, empleando las herramientas que incluye y, además, nos permite combinar ambas cosas. Este caṕıtulo no pretende ser exhaustivo, –cosa que por otro lado resulta imposible en el caso de Matlab–, sino tan solo dar una breve introducción a su uso. Afortunadamente, Matlab cuenta con una muy buena documentación, accesible a través de la ’ayuda’, eso śı, en inglés. 2.1. El entorno de programación de Matlab Cuando iniciamos Matlab en el computador, se abre una ventana formada por uno o más pane- les. Esta ventana, constituye lo que en programación se llama un entorno de desarrollo integrado o, abreviadamente, IDE (acrónimo tomado de su nombre en Inglés: integrated development envi- ronment. El IDE de Matlab, contiene todo los elementos necesarios para programar. La figura 2.1 muestra el aspecto del IDE de Matlab. Según como se configure, el IDE de Matlab puede mostrar un número mayor o menor de paneles y una disposición de los mismos distinta a la mostrada en la figura. La mejor manera de aprender estos y otros detalles del IDE es usarlo. Aqúı nos centraremos solo en algunos aspectos fundamentales. 2.1.1. La ventana de comandos de Matlab De los paneles mostrados en la ventana de la figura 2.1, vamos a empezar examinando el situado en la parte inferior central. Se trata de la ventana de comandos (command window) de Matlab. La ventana muestra el simbolo >>, que recibe el nombre de prompt y, a continuación, una barra vertical | parpadeante. La ventana de comandos permite al usuario interactuar directamente con Matlab: Matlab puede recibir instrucciones directamente a través de la ventana de comandos, 25 26 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB Figura 2.1: Entorno de desarrollo integrado de Matlab ejecuta las instrucciones recibidas, y devuelve los resultados de nuevo en la ventana de comandos. Veamos un ejemplo muy sencillo: si escribimos en la ventana de comandos: >> a=18 + 3 Matlab calcula la suma pedida, devuelve el resultado y, por último, vuelve a presentar el prompt, para indicarnos que está preparado para recibir otro comando. a = 21 >> De este modo, podemos emplear Matlab de un modo análogo a como empleaŕıamos una calcu- ladora: realizamos una operación, obtenemos el resultado, realizamos otra operación, obtenemos el resultado y aśı sucesivamente. 2.1.2. Variables. En el el ejemplo que acabamos de ver, Matlab calcula el resultado pedido, y lo presenta en pantalla usando la expresión, a =21 ¿Por qué hace falta escribir a = 18 + 3 en lugar de escribir directamente 18 + 3? La razón tiene que ver con el modo de trabajo de Matlab, y de otros lenguajes de alto nivel. Esto nos lleva al concepto de variable. Podemos ver una variable como una región de la memoria del computador, donde un programa guarda una determina información; números, letras, etc. Una caracteŕıstica fundamenta de una 2.1. EL ENTORNO DE PROGRAMACIÓN DE MATLAB 27 variable es su nombre, ya que permite identificarla. Como nombre para una variable se puede escoger cualquier combinación de letras y números, empezando siempre con una letra, en el caso de Matlab1. Se puede además emplear el signo ” ”. Matlab distingue entre mayúsculas y minúsculas, por lo que si elegimos como nombres de variable Pino, PINO y PiNo, Matlab las considerará como variables distintas. En algunos lenguaje, es preciso indicar al ordenador qué tipo de información se guardará en una determinada variable, antes de poder emplearlas. Esto permite manejar la memoria del computador de una manera más eficiente, asignando zonas adecuadas a cada variable, en función del tamaño de la información que guardarán. A este proceso, se le conoce con el nombre de declaración de variables. En Matlab no es necesario declarar las variables antes de emplearlas. El método más elemental de emplear una variable es asignarle la información para la que se creó. Para hacerlo, se emplea el śımbolo de asignación , que coincide con el signo = empleado en matemáticas. Como veremos más adelante la asignación en programación y la igualdad en matemáticas no representan exáctamente lo mismo. La manera de asignar directamente información a una variable es escribir el nombre de la variable, a continuación el signo de asignación y, por último, la información asignada, Nombre_variable = 4 Si escribimos en la ventana de comandos la expresión anterior y pulsamos el retorno de carro. Matlab devuelve el siguiente resultado: >> Nombre_variable=4 Nombre_variable = 4 >> Matlab ejecuta las instrucciones indicadas y nos confirma que ha creado en la memoria una variable Nombre variable y que ha guardado en ella el número 4. En Matlab podemos emplear el śımbolo de asignación para construir variables que guarden distintos tipos de datos, 1. Enteros positivos y negativos >> a=4 a = 4 >>b=-4 b = -4 2. Números con parte entera y parte decimal separadas por un punto, positivos y negativos. 1Como se verá más adelante, Matlab tiene un conjunto de nombres de instrucciones y comandos ya definidos. Se debe evitar emplear dichos nombres, ya que de hacerlo se pierde acceso al comando de Matlab que representan 28 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB >> a=13.4568 a = 13.4568 >> b=-13.4568 b = -13.4568 3. Números expresados como potencias de 10 (la potencia de 10 se representa con la letra e seguida del valor del exponente). >> f=3e10 f = 3.0000e+010 >> g=-3e10 g = -3.0000e+010 >> h=3e-10 h = 3.0000e-010 >> t=-3e-10 t = -3.0000e-010 4. Números complejos. Para indicar la parte imaginaria se puede emplear la letra i o la letra j. >> s=2+3i s = 2.0000 + 3.0000i >> w=4-5j w = 4.0000 - 5.0000i 5. Caracteres, letras o números; manejados estos últimos como śımbolos. Se indica a Matlab que se trata de un carácter escribiéndolo entre comillas simples, >> p=’a’ 2.1. EL ENTORNO DE PROGRAMACIÓN DE MATLAB 29 p = a >> k=’1’ k = 1 6. Cadenas de caracteres. >> m=’hola amigos’ m = hola amigos La forma que hemos visto de asignar un valor a una variable es la más sencilla pero no es la única. También podemos asignar un valor a una variable a partir de una expresión aritmética, como hemos visto antes. Ademas podemos asignar un valor a una variable copiando el contenido de otra variable: >> a=18 a = 18 >> b=a b = 18 >> Por último, podemos asignar a una variable el valor de una función en un punto: >> x=0 x = 0 >> y=cos(x) y = 1 >> La variable y contiene el valor de la función coseno en el punto x=0. Más adelante estudiaremos cómo manejar funciones en Matlab. 30 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB Si escribimos directamente en la ĺınea de comandos de Matlab, un número, una expresión algebraica o una función, sin asignarlas a una variable, Matlab crea automáticamente una variable para guardar el resultado, Aśı por ejemplo: >> 3 + 5 ans = 8 >> Matlab guarda el resultado de la operación realizada: 3+5, en la variable ans. Se trata del nombre de variable por defecto; es una abreviatura de al palabra inglesa answer (respuesta). En cualquier caso es recomendable asignar los resultados de las operaciones expĺıcitamente a una variable. La razón para ello tiene que ver con lo que llamaremos reasignación de variables. Imaginemos que creamos en Matlab una variable asignándole un valor: >> a=34 a = 34 >> Si a continuación, asignamos a esa misma variable el resultado de una operación, >> a=12+5 a = 17 >> El valor inicialmente asignado a la variable a se pierde. Sencillamente hemos reasignado a la variable un nuevo valor sobreescribiendo el anterior. Si en la ĺınea de comandos escribimos operaciones sin asignar el resultado a una variable concreta, Matlab lo asignará a la variable ans pero esto significa que cada nueva operación reasigna su resultado a la variable ans, con lo que solo conservaremos al final el resultado de la última de las operaciones realizadas. Es posible en Matlab crear una variable que no contenga nada. Para ello hay que emplear dos śımbolos especiales: [ y ]. Aśı, si escribimos en la ĺınea de comandos: >> variable_vacia=[] variable_vacia = [] >> obtenemos una variable que no contiene nada. Más adelante veremos la utilidad de hacerlo. 2.1. EL ENTORNO DE PROGRAMACIÓN DE MATLAB 31 Hasta ahora, siempre que hemos realizado una operación en la ventana de comandos, Matlab nos ha respondido escribiendo en pantalla el resultado de la misma. En muchas ocasiones, no nos interesa que Matlab nos muestre por pantalla el resultado de una operación; por ejemplo, porque se trata de un resultado intermedio, o porque es un resultado de gran tamaño y su visualización por pantalla no es útil y sin embargo śı que consume mucho tiempo. Podemos omitir la visualización por pantalla del resultado de una operación, si terminamos la operación, añadiendo al final un punto y coma (;), >> A=3+5; >> B=A+1 B = 9 En la primera operación hemos añadido (;) al final de la ĺınea, Matlab no muestra el resultado. Sin embargo, śı que ha realizado la operación pedida y guardado el resultado en la variable A. Por eso es posible emplearla en la segunda operación para crear la variable B. Recursión. Hemos indicado antes cómo el śımbolo de asignación = en programación no coinci- de exactamente con la igualdad matemática. Un ejemplo claro de estas diferencias lo constituye la recursión. Esta se produce cuando la misma variable aparece a los dos lados del śımbolo de asignación: >> a=3 a = 3 >> a=a+1 a = 4 La expresión anterior no tiene sentido matemáticamente, ya que una variable no puede ser igual a śı misma más la unidad. Sin embargo, en programación, es una sentencia válida; el ordenador toma el valor almacenado en la variable a, le suma 1 y guarda el resultado en la variable a, sobreescribiendo el valor anterior. La recursión se emplea muy a menudo en programación, entre otras aplicaciones, permite crear contadores, –variables que van incrementando o decrementando su valor progresivamente– y permi- te ahorrar espacio de memoria cuando se realizan operaciones que requieren cálculos intermedios. El espacio de trabajo de Matlab Workspace. Matlab guarda en memoria las variables que creamos en la ventana de comandos y las asocia a lo que se conoce como el espacio de trabajo de Matlab. Dicho espacio de trabajo contiene una relación de las variables creadas de modo que podamos volver a utilizarlas en la ventana de comandos. Uno de los paneles que el IDE de Matlab puede mostrarnos es precisamente el Workspace. La figura 2.2 muestra dicho panel. En el se mues- tran los nombres de las variables contenidas en el espacio de trabajo, aśı como información relativa a su valor, tamaño en memoria etc. 32 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB Figura 2.2: El Workspace de Matlab Además del panel que acabamos de describir, es posible listar el contenido de las variables presentes en el Workspace empleando dos comandos especiales de Matlab; se trata de los comandos who y whos. El primero de ellos nos devuelve en la ventana de comandos los nombres de las variables contenidas en el Workspace. El segundo nos devuelve los nombres de las variables junto con información adicional sobre su contenido, tamaño, etc. >> who Your variables are: Nombre_variable b y a x >> whos Name Size Bytes Class Attributes Nombre_variable 1x1 8 double a 1x1 8 double b 1x1 8 double x 1x1 8 double y 1x1 8 double >> Para eliminar una variable del Workspace, se emplea el comando clear. Si escribimos en la ventana de comandos el comando clear, seguido del nombre de una variables, Matlab la elimina del Workspace. Si escribimos el comando clear, sin añadir nada más, Matlab eliminará TODAS las variables contenidas en el Workspace. Formatos de visualización Hemos visto en los ejemplos anteriores cómo al realizar una opera- ción en Matlab, se nos muestra el resultado en la ventana de comandos. Además podemos examinar el contenido de cualquier variable contenida en el workspace sin más que escribir su nombre en la ventana de comandos y pulsar la tecla intro. Matlab permite elegir la forma en que los resultados se presenta por pantalla. Para ello se emplea el comando format. La siguiente tabla, resume los formatos más comúnmente empleados. 2.1. EL ENTORNO DE PROGRAMACIÓN DE MATLAB 33 Cuadro 2.1: Formatos numéricos más comunes en Matlab Comando formato Comentario format short 12,3457 coma fija. Cuatro decimales format shortE 1,2346e+ 01 coma flotante. Cuatro decimales format long 12,345678901234500 coma fija. Quince decimales format longE 1,234567890123450e+ 01 coma flotante. Quince decimales 2.1.3. Vectores y matrices. Una de las caracteŕıstica más interesantes de Matlab, es la posibilidad de crear fácilmente matrices. Se pueden crear de muchas maneras, la más elemental de todas ellas, emplea el operador de asignación =, y los śımbolos especiales [, ], el punto y coma ; y la coma ,. Las matrices se crean introduciendo los valores de sus elementos por filas, separados por comas o espacios. Una vez introducidos todos los elementos de una fila, se añade un punto y coma, o se pulsa la tecla intro, y se añaden los elementos de la fila siguiente. El siguiente ejemplo muestra como crear una matriz de de dos filas y tres columnas: >> matriz23 =[ 1 3 4 ;3 5 -1] matriz23 = 1 3 4 3 5 -1 o también: >> matriz23 =[ 1 3 4 3 5 -1] matriz23 = 1 3 4 3 5 -1 En el primer caso, se empleado el punto y coma para separar las filas y en el segundo se ha empleado la tecla intro. En ambos se emplea el śımbolo [ para indicar a Matlab que queremos empezar a construir una matriz, y el śımbolo ] para indicar a Matlab que hemos terminado de construirla. Una vez construida, Matlab nos devuelve en la ventana de comandos la Matriz com- pleta. Matlab nos permite además emplear cada elemento de una matriz como si se tratase de una variable, es decir, se puede asignar a los elementos de una matriz un valor numérico, el resultados de una operación o un valor guardado en otra variable: >> a=1 a = 1.00 >> b=2 34 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB b = 2.00 >> mtr=[ a a+b a-b; 1 0.5 cos(0)] mtr = 1.00 3.00 -1.00 1.00 0.50 1.00 >> Matlab considera las matrices como la forma básica de sus variables, aśı para Matlab un escalar es una matriz de una fila por una columna. Un vector fila de 3 elementos es una matriz de una fila por tres columnas y un vector columna de tres elementos es una matriz de tres filas y una columna. Indexación. Al igual que se hace en álgebra, Matlab es capaz de referirse a un elemento cual- quiera de una matriz empleando ı́ndices para determinar su posición (fila y columna) dentro de la matriz. a = a11 a12 a13 a21 a22 a23 a31 a32 a33  El criterio para referirse a un elemento concreto de una matriz, en Matlab es el mismo: se indica el nombre de la variable que contiene la matriz y a continuación, entre paréntesis y separados por una coma, el ı́ndice de su fila y después él de su columna: >> a=[1 2 3; 4 5 6; 7 8 9] a = 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00 >> a(1,2) ans = 2.00 >> a(2,1) ans = 4.00 >> 2.1. EL ENTORNO DE PROGRAMACIÓN DE MATLAB 35 Es interesante observar de nuevo cómo Matlab asigna por defecto el valor del elemento buscado a la variable ans. Como ya se ha dicho, es mejor asignar siempre una variable a los resultados, para asegurarnos de que no los perdemos al realizar nuevas operaciones: >> a12=a(1,2) a12 = 2.00 >> a21=a(2,1) a21 = 4.00 >> Ahora hemos creado dos variables nuevas que contienen los valores de los elementos a12 y a21 de la matriz a. Matlab puede seleccionar dentro de una matriz no solo elementos aislados, sino también sub- matrices completas. Para ello, emplea un śımbolo reservado, el śımbolo dos puntos :. Este śımbolo se emplea para recorrer valores desde un valor inicial hasta un valor final, con un incremento o paso fijo. La sintaxis es: inicio:paso:fin, por ejemplo podemos recorrer los números enteros de cero a 8 empleando un paso 2: >> 0:2:8 ans = 0 2.00 4.00 6.00 8.00 >> El resultado nos da la lista de los números 0, 2, 4, 6, 8. Además, si no indicamos el tamaño del paso, Matlab tomará por defecto un paso igual a uno. En este caso basta emplear un único śımbolo dos puntos para separar el valor de inicio del valor final: >> 1:5 ans = 1.00 2.00 3.00 4.00 5.00 >> Podemos emplear el śımbolo dos puntos, para obtener submatrices de una matriz dada. Aśı por ejemplo si construimos una matriz de cuatro filas por cinco columnas: >> matriz=[1 2 4 5 6 3 5 -6 0 2 36 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB 4 5 8 9 0 3 3 -1 2 0] matriz = 1.00 2.00 4.00 5.00 6.00 3.00 5.00 -6.00 0.00 2.00 4.00 5.00 8.00 9.00 0.00 3.00 3.00 -1.00 2.00 0.00 >> Podemos obtener el vector formado por los tres últimos elementos de su segunda fila: >> fil=matriz(2,3:5) fil = -6.00 0 2.00 >> o la submatriz de tres filas por tres columnas formada por los elementos que ocupan las filas 2 a 4 y las columnas 3 a 5: >> subm=matriz(2:4,3:5) subm = -6.00 0 2.00 8.00 9.00 0 -1.00 2.00 0 >> o el vector columna formado por su segunda columna completa: >> matriz(1:4,2) ans = 2.00 5.00 5.00 3.00 >> De hecho, si deseamos seleccionar todos los elementos en una fila o una columna, podemos emplear el śımbolo : directamente sin indicar principio ni fin, 2.1. EL ENTORNO DE PROGRAMACIÓN DE MATLAB 37 >> matriz(:,2) ans = 2.00 5.00 5.00 3.00 >> matriz(3,:) ans = 4.00 5.00 8.00 9.00 0.00 A parte de la indexación t́ıpica del álgebra de los elementos de una matriz indicando su fila y columna, en Matlab es posible referirse a un elemento de una matriz empleando un único ı́ndice. En este caso, Matlab cuenta los elementos por columnas, de arriba abajo y de izquierda a derecha, A = a1 a4 a7 a2 a5 a8 a3 a6 a9  Aśı por ejemplo, en una matriz A de 3 filas y 4 columnas, >> A=[3 0 -1 0; 2 1 5 7; 1 3 9 8] A = 3 0 -1 0 2 1 5 7 1 3 9 8 las expresiones, >> A(2,3) ans = 5 y >> A(8) ans = 5 hacen referencia al mismo elemento de la matriz A. Aunque el concepto de función no se explicará hasta la sección 2.4, vamos a hacer uso de un par de funciones sencillas relacionadas con el tamaño de una matriz. En primer lugar, tenemos la función length; esta función nos calcula el número total de elementos que contiene un vector, sea este fila o columna. Aśı, si tenemos un vector guardado en la variable a, para saber su longitud escribimos en matlab el nombre de la función seguida del nombre de la variable entre paréntesis length(a), 38 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB >> a = [ 1 -2 0 6 8] a = 1 -2 0 6 8 >> length(a) ans = 5 >> La segunda función es la función size, esta función permite obtener el número de filas y columnas de una matriz o vector. size nos da como resultado de aplicarlo a una matriz un vector cuyo primer elemento es el número de filas de la matriz, y cuyo segundo elemento el número de columnas, >> A = [1 3 4 -5; 2 3 0 -2; -2 1 7 7] A = 1 3 4 -5 2 3 0 -2 -2 1 7 7 >> size(A) ans = 3 4 2.1.4. Estructuras y células Se trata de dos tipos de variables especiales. Ambas comparten la propiedad de poder combinar dentro de śı variables de distintos tipos. Estructuras. Una estructura es una variable que guarda la información divida en campos. Por ejemplo, si escribimos en la ventana de matlab, >> est.nombre=’Ana’ est = nombre: ’Ana’ >> est.edad=25 est = nombre: ’Ana’ edad: 25 obtenemos una estructura con dos campos, el primero de ellos es el campo nombre, y guarda dentro una cadena de caractéres ’Ana’, el segundo es el campo edad y guarda dentro el valor 25. La estructura que acabamos de definir es una sola variable llamada est y podemos aplicar cualquier comando de matlab cuyo resultado no dependa del contenido espećıfico de la variable. Podemos copiarla en otra estructura, 2.1. EL ENTORNO DE PROGRAMACIÓN DE MATLAB 39 >> est2=est est2 = nombre: ’ana’ edad: 25 podemos borrarla, >> clear est >> who Your variables are: est2 >> No podemos realizar sobre ella, como un todo, operaciones aritméticas o relacionales, pero śı sobre sus campos, >> x=est.edad+12 x = 37 El número de campos de una estructura puede aumentarse añadiendo a su nombre, el nombre del nuevo campo separado por un punto y asignando un valor o una variable a dicho campo. >> est.campo_nuevo=[1 2;3 4; 6 7] est = nombre: ’ana’ edad: 25 campo_nuevo: [3x2 double] >> y=[1 2 3] y = 1 2 3 >> est.campo_nuevo2=y est = nombre: ’ana’ edad: 25 campo_nuevo: [3x2 double] campo_nuevo2: [1 2 3] Podemos tambien eliminar campos de una estructura mediante el comando rmfield, >> est=rmfield(est,’edad’) est = nombre: ’ana’ campo_nuevo: [3x2 double] campo_nuevo2: [1 2 3] Por último, una estructura nos permite definir y utilizar varios niveles de campos. Para ello, basta ir definiendo los nombres de los campos de un nivel separados por un punto del nombre del nivel anterior, 40 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB >> multinivel.datos_personales.nombre=’Ana’ multinivel = datos_personales: [1x1 struct] >> multinivel.datos_personales.primer_apellido=’Jiménez’ multinivel = datos_personales: [1x1 struct] >> multinivel.datos_personales.segundo_apellido=’Lasarte’ multinivel = datos_personales: [1x1 struct] >> multinivel.domicilio.calle=’Ponzano’ multinivel = datos_personales: [1x1 struct] domicilio: [1x1 struct] >> multinivel.domicilio.numero=724 multinivel = datos_personales: [1x1 struct] domicilio: [1x1 struct] >> multinivel.valor=[3 4 5; 3.5 2 3] multinivel = datos_personales: [1x1 struct] domicilio: [1x1 struct] valor: [2x3 double] La información se encuentra ahora estructurada en niveles. Aśı por ejemplo, >> multinivel.domicilio ans = calle: ’Ponzano’ numero: 724 Me devuelve el contenido del campo domicilio que es a su vez una estructura formada por dos campos calle y numero. La información queda estructurada en niveles que pueden ramificarse tanto como se desee. Para obtener la información contenida al final de una rama, es preciso indicar todos los campos que se atraviesan hasta llegar a ella, >> multinivel.datos_personales.segundo_apellido ans = Lasarte Matlab tiene definidas funciones propias para conseguir un manejo eficiente de las estructuras. A parte de la función rmfield de la que hemos hablado anteriormente, cabe destacar la función struct que permite crear directamente una estructura. Su sintaxis es, s= struct(’field1’, values1, ’field2’, values2, ...) donde s representa el nombre de la estructura, field1,field2, etc son los nombres correspon- dientes a cada campo, introducidos entre comillas, y values1, etc los valores contendidos en cada campo. Para un conocimiento más profundo del uso de las estructuras se aconseja consultar la ayuda de Matlab. 2.2. ENTRADA Y SALIDA DE DATOS 41 Células. Las células, cells en Matlab, son objetos que almacenan datos de diversos tipos en una misma variable. A diferencia de las estructuras, las células no expanden un árbol de campos sino que guardan cada dato en una çelda”. Para referirse a una celda concreta, empleamos un ı́ndice, de modo análogo a como hacemos con un vector. Para construir una célula, procedemos de modo análogo a como hacemos con un vector, pero en lugar de emplear corchetes como delimitadores, empleamos llaves. Aśı, por ejemplo, >> a={[1 2 3; 4 5 6; 7 8 9],’cadena’, -45;’pepe’, [1 2 3], ’cadena2’} a = [3x3 double] ’cadena’ [ -45] ’pepe’ [1x3 double] ’cadena2’ Hemos creado una célula a, cuyos elementos son, una matriz 3 × 3, la cadena de caracteres cadena, el número −45, otra cadena de caracteres pepe, el vector [1, 2, 3] y una última cadena de caracteres cadena2. Los elementos separados por espacios o por comas simples, pertenecen a la misma fila dentro de la célula. Los elementos pertenecientes a distintas filas están separados por un punto y coma. Podemos obtener el tamaño de la célula —su número de filas y columnas— empleando el comando size , igual que hicimos para el caso de vectores o matrices, >> size(a) ans = 2 3 Y podemos referirnos a una celda cualquiera de la célula, y obtener su contenido indicando entre llaves la fila y la columna a la que pertenece. Aśı por ejemplo, para obtener el vector [1, 2, 3] de la célula a del ejemplo anterior hacemos, >> vector=a{2,2} vector = 1 2 3 Las celdas, de modo análogo a como suced́ıa con las estructuras, nos permiten agrupar datos de distinto tipo empleando una sola variable. Además, el hecho de que los datos ester ordenados por celdas en filas y columna, hace sencillo que se puede acceder a ellos. 2.2. Entrada y salida de Datos Matlab posee una amplia colección de métodos para importar datos desde y exportar datos a un fichero. A continuación describimos algunos de los más usuales. 2.2.1. Exportar e importar datos en Matlab Datos en formato propio de Matlab Matlab posee un formato de archivo propio para manejar sus datos. Los archivos de datos propios de Matlab, emplean la extensión .mat. Si tenemos un conjunto de variables en el workspace, podemos guardarlas en un fichero em- pleando el comando save, seguido del nombre del fichero donde queremos guardarlos. No es preciso incluir la extensión .mat, Matlab la añade automáticamente: >> save datos 42 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB Matlab creará en el directorio de trabajo un nuevo fichero datos.mat en el que quedarán guardadas todas las variables contenidas en el workspace. Los ficheros .mat generados por Matlab están escritos en binario. No se puede examinar su contenido empleando un editor de textos. Matlab almacena toda la información necesaria —nombre de las variables, tipo, etc— para poder volver a reconstruir las variables en el workspace tal y como estaban cuando se generó el archivo. Es posible guardar tan solo algunas de las variables contenidas en el workspace en lugar de guardarlas todas. Para ello, basta añadir al comando save, detrás del nombre del archivo, el nombre de las variables que se desean guardar, separadas entre śı por un espacio >>save datos1 A matriz_1 B La instrucción anterior guarda en un archivo —llamado datos1.mat— las variables A, matriz1 y B. Los datos contenidos en cualquier fichero .mat generado con el comando save de Matlab, pueden volver a cargarse en el workspace empleando el comando load, seguido del nombre del fichero cuyos datos se desean cargar: load datos.mat carga en el workspace las variables contenidas en el fichero datos.mat, la extensión del fichero puede omitirse al emplear la función load. Si conocemos los nombres de las variables contenidas en un archivo .mat, podemos cargar en Matlab solo una o varias de las variables contenidas en el archivo, escribiendo sus nombres, separados por espacios, detrás del nombre del archivo: >>load datos A G matriz1 cargará tan solo las variables A, G y matriz1, de entre las que contenga el ficheros datos.mat Datos en Formato ASCII e puede emplear también el comando save para exportar datos en formato ASCII. Pare ello es preciso añadir al comando modificadores, >>save datos.txt A -ASCII Este comando guardará la variable A en el fichero datos.txt. Matlab no añade ninguna ex- tensión por defecto al nombre del fichero cuando empleamos el comando save con el modificador -ASCII. En este caso, hemos añadido expĺıcitamente la extensión .txt, esto facilita que el archivo resultante se pueda examinar luego empleando un sencillo editor de texto o una hoja de cálculo. Cuando se exportan datos desde Matlab en formato ASCII, Matlab guarda tan solo los valores numéricos contenidos en las variables, pero no los nombres de éstas. Por otro lado, guarda tan solo ocho d́ıgitos, por lo que habitualmente se pierde precisión. Es posible guardar datos en formato ASCII, conservando toda la precisión, si añadimos al comando save el modificador -DOUBLE, >>save nombre_Archivo matriz_1, matriz2, ... -ASCII -DOUBLE Supongamos que en workspace tenemos guardada la siguiente matriz, a = ( 1,300236890000000e+ 000 3,456983000000000e+ 000 4,321678000000000e+ 006 4,000230000000000e+ 003 1,245677000000000e+ 001 1,231565670000000e+ 002 ) Si ejecutamos en Matlab, >>save datos.txt a -ASCII El fichero resultante tendrá el aspecto siguiente, 2.2. ENTRADA Y SALIDA DE DATOS 43 1.3002369e+00 3.4569830e+00 4.3216780e+05 4.0002300e+03 1.2456770e+01 1.2315657e+02 es decir, los elementos de una misma fila de la matriz a se guardan en una fila separados por espacios, las filas de la matriz se separan empleando retornos de carro —cada una ocupa una ĺınea nueva— y los valores cuyos d́ıgitos significativos exceden de 8 se han truncado, redondeando el último d́ıgito representado. Este último es el caso de los elementos a11 y a33 de la matriz del ejemplo. Cuando se guardan varias variables o todo el workspace en un mismo fichero con formato ASCII, es preciso tener en cuenta que Matlab se limitará a guardar los contenidos de las variables, uno debajo de otro, en el orden en que las escribamos detrás del comando save (en el caso de que guardemos todas las variables del workspace las guardará una debajo de otra por orden alfabético), por lo que resulta dif́ıcil distinguir las variables originales. Aśı por ejemplo, si tenemos en el workspace las variables, A = 3 5 2 1 8 0  a = 1 3 4 4 5,6 2 3 0 1  c = ( 3 2 ) La orden, >>save datos.txt c a A -ASCII produce el un archivo con el siguiente contenido, 3.0000000e+00 2.0000000e+00 1.0000000e+00 3.0000000e+00 4.0000000e+00 4.0000000e+00 5.6000000e+00 2.0000000e+00 3.0000000e+00 0.0000000e+00 1.0000000e+00 3.0000000e+00 5.0000000e+00 2.0000000e+00 1.0000000e+00 8.0000000e+00 0.0000000e+00 El comando load, presenta algunas limitaciones para cargar datos contenidos en un fichero ASCII. Solo funciona correctamente si el contenido del fichero puede cargarse en una única matriz, es decir, cada fila de datos en el fichero debe contener el mismo número de datos. Aśı, en el ejemplo anterior, los datos guardados en el fichero datos.txt, no pueden volver a cargarse en Matlab usando el comando load. Para el caso de un fichero cuyos contenido pueda adaptarse a una matriz, el comando load carga todos los datos en una única matriz a la que asigna el nombre del fichero sin extensión. Lectura y escritura de datos con formato Matlab puede también escribir y leer datos, empleando formatos y procedimientos similares a los de el lenguaje C. Para ello, es preciso emplear varios comandos2: En primer lugar es preciso crear —o si ya existe abrir— el archivo en que se quiere guardar o del que se quieren leer los datos. En ambos casos se emplea para ello el comando fopen. La sintaxis de este comando es de la forma, fid=fopen(nombre de fichero, permisos) 2Lo que se ofrece a continuación es solo un resumen del uso de los comandos y formatos más frecuentes. Para obtener una información completa, consultar la ayuda de Matlab. 44 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB El nombre del fichero debe ser una cadena de caracteres, es decir, debe ir escrito entre apóstrofos. Hay al menos ocho tipos de permisos distintos. Aqúı describiremos tan solo tres de ellos, ’w’ — write— abre o crea un archivo con permiso de escritura. Si el archivo ya exist́ıa su contenido anterior se sobreescribe. Si se quiere añadir datos a un archivo sin perder su contenido se emplea el permiso ’a’ —append— los nuevos datos introducidos se escriben al final del fichero, a continuación de los ya existentes. ’r’ —read— permiso de lectura, es la opción por defecto, permite leer el contenido de un archivo. Cuando se trabaja en el sistema operativo Windows, es común emplear los permisos en la forma ’wt’ y ’rt’, de este modo, los archivos se manejan en el denominado formato ’texto’. La variable fid, es un identificador del fichero abierto y es también la forma de referirnos a él —en un programa, o en la ĺınea de comandos— mientras permanece abierto. Supongamos que hemos abierto —o creado— un archivo para escribir en él, datos contenidos en el workspace, fichero1=fopen(’mi_fichero’,’wt’) Para escribir en él emplearemos el comando fprintf. La sintaxis de este comando necesita un identificador de archivo –en nuestro caso seŕıa fichero1–, un descriptor del formato con el que se desean guardar los datos y el nombre de la variable que se desea guardar. control=fprintf(fichero1,formato,nombre_de_variable,...) Los descriptores de formato se escriben entre apóstrofos. Empiezan siembre con el carácter %, seguido de un número con formato e.d. Donde e recibe el nombre de anchura de campo y d recibe el nombre de precisión. Por último se añade un carácter, conocido como carácter de conversión, que permite ajustar el formato numérico de los datos. Los más usuales son: f —notación de punto fijo—, e —notación exponencial— y g —la notación que resulte más compacta de las dos anteriores—. La anchura de campo representa en número mı́nimo de caracteres que se emplearán para representar el número. La precisión depende del carácter de conversión; para f y e, representa el número de d́ıgitos a la derecha del punto decimal, para g el número de d́ıgitos significativos. Aqúı hemos incluido solo los caracteres de conversión más usuales para el caso de datos numéri- cos. Cabe añadir que para el caso de una cadena de caracteres se emplea como carácter de conversión la letra s. Por ejemplo: >>A=’mi cadena de caracteres’ >>num=fprinf(fid,’%s’, A) Escribe el texto contenido en el vector A en el archivo indicado por fid. Matlab, almacena los datos consecutivamente uno detrás de otro. Si se trata de matrices, los va leyendo por columnas y una variable tras otra en el orden en que se hayan introducido al llamar a la función fprintf. Para separar entre śı los datos se puede añadir a los descriptores de formatos, espacios y también caracteres de escape como Retornos de carro \r, indicadores de salto de ĺınea \n o tabuladores \t, entre otros. Por ejemplo, supongamos que tenemos en Matlab las siguiente matrices A = 3,25 5,22 23,1 130,5 8 0  a = 1,2345 3,0879 4234,2 40 5000,6 223 3 0 1  c = ( 30 2 ) Si empleamos, >>num=fprinf(fid,’%2.1f’, A, a, c) Los datos se guardarán en el archivo indicado por fid en la siguiente forma: 2.2. ENTRADA Y SALIDA DE DATOS 45 3.223.18.05.2130.50.01.240.03.03.15000.60.04234.2223.01.030.02.0 Guardados en este formato resulta bastante dif́ıcil reconocerlos. Si probamos, >>num=fprinf(fid,’%2.1f ’, A, a, c) El resultado seŕıa, 3.2 23.1 8.0 5.2 130.5 0.0 1.2 40.0 3.0 3.1 5000.6 0.0 4234.2 223.0 1.0 30.0 2.0 El formato es de punto fijo y los datos aparecen separados por un espacio —nótese que en el descriptor de formato se ha incluido un espacio entre la f y el apóstrofo—. Los datos de las tres matrices aparecen uno detrás de otro, y se han ido escribiendo en el archivo por columnas Si cambiamos de nuevo el descriptor de formato, >>num=fprinf(fid,’%2.3g\n’, A, a c) obtendremos, 3.25 23.1 8 5.22 130 0 1.23 40 3 3.09 5e+03 0 4.23e+03 223 1 30 Matlab elige el formato más compacto para cada dato, y guarda cada dato en una fila nueva, debido al término \n introducido al final del descriptor. Por último indicar que es posible emplear varios descriptores consecutivos, en cuyo caso, Matlab los aplica a cada dato consecutivamente, cuando ha terminado con la lista de descriptores, comienza de nuevo por el principio. Por ejemplo, >>num=fprinf(fid,’%2.3g %2.3g %2.3g\n’, a) Guarda los datos contenidos en a como, 1.23 40 3.09 5e+03 4.23e+03 223 Es decir cada tres datos cambia a una ĺınea nueva. Por supuesto, podŕıamos hacer que los datos se guardaran con un formato distinto en cada caso, 46 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB >>num=fprinf(fid,’%2.3g %3f %2.3f\n’, a) 1.23 40.000000 3.088 5e+03 4234.200000 223.000 Por último indicar, que si se emplea el comando fprintf sin emplear un identificador de archivo o empleando como identificador el valor 1. Matlab escribe el resultado directamente en la ventana de comandos con el formato deseado. Por ejemplo, >>B = [8.8 7.7; 8800 7700]; >>fprintf(1, ’X is %6.2f metros o %8.3f mm\n’, 9.9, 9900, B) Mostrará en la ventana de comandos las siguientes ĺıneas: X is 9.90 metros o 9900.000 mm X is 8.80 metros o 8800.000 mm X is 7.70 metros o 7700.000 mm Para cargar archivos desde un fichero que contiene datos en binario, se emplea el comando fscanf. Su uso es similar al de fprintf, pero ahora los datos pasarán desde el fichero donde están guardados a una matriz. >>A=fscanf(pid,’%f’) El comando fscanf, admite como parámetros el número máximo de datos que se leerán del fichero, a=fscanf(fid,’%5.2f’,M) Lee como máximo M datos del fichero y los guarda en un vector a. Es posible dar a los datos formato de matriz, mediante dos parámetros (fila y columna), a=fscanf(fid,’%5.2f’,[M,N]) Ahora creará una matriz a de M filas por N columnas. Matlab irá cogiendo los datos del fichero, por columnas hasta rellenar la matriz. Es posible dar al segundo parámetro el valor inf. De este modo, Matlab creará una matriz de M filas y el número de columnas necesario para cargar todos los datos del fichero. (Si faltan elementos para completar la matriz resultante, Matlab rellena los huecos con ceros.) Por último, una vez que se han escrito o léıdo datos en el fichero es preciso cerrarlo correctamente empleando el comando fclose, la sintaxis de este comando solo precisa que se incluya el identificador del fichero que se quiere cerrar, >>fclose(fid) Herramienta de importación de datos Matlab posee una herramienta especial para importar datos. Con ella, es posible cargar en Matlab datos de muy diverso tipo, no sólo numéricos sino tam- bién imágenes, sonido, etc. Una de las ventajas de esta herramienta es que reconoce directamente —entre otros— los archivos creados por las hojas de cálculo. Para abrir en Matlab la herramienta de importación, basta pulsar en la pestaña home, situada en la parte superior del IDE de Matlab, el botón Import Data. Matlab abre entonces una ventana que nos permite navegar por el árbol de directorio y seleccionar el archivo del que deseamos importar los datos. Una vez seleccionado, Matlab abre la ventana mostrada en la imagen 2.3. Se trata de un programa especial —import wizard— que sirve para guiar al usuario en el proceso de cargar las variables contenidas en el fichero en el workspace de Matlab. 2.3. OPERACIONES ARITMÉTICAS, RELACIONALES Y LÓGICAS 47 Figura 2.3: Aspecto de la herramienta de importación de datos 2.3. Operaciones aritméticas, relacionales y lógicas 2.3.1. Operaciones aritméticas Una vez que sabemos como crear o importar variables en Matlab, vamos a ver como podemos realizar operaciones aritméticas elementales con ellas. La sintaxis es muy sencilla, y podemos sintetizarla de la siguiente manera: resultado = operando1operador1operando2operador2operando3 · · · operandon−1operadorn Es decir basta concatenar los operadores con los operandos y definir una variable en la que guardar el resultado. Por ejemplo, >>x=1; y=2; z=3; q=x+y+z >>z=6 En este caso los operandos son las variables x, y, z, el operador, que se repite dos veces es el śımbolo + que representa la operación suma y q es la variable en la que se guarda el resultado, en este caso, de la suma de las tres variables anteriores. Los operadores aritméticos disponibles en Matlab cubren las operaciones aritméticas habitua- les, pero hay que recordar que Matlab considera sus variables como matrices. Por lo tanto, las operaciones definidas Matlab las considera por de defecto operaciones entre matrices. La tabla 2.2 contiene los operadores definidos en Matlab. A continuación, veremos algunos ejemplos de manejo de operaciones básicas. Hemos visto ya el manejo de la suma. Si se trata de matrices en vez de números, 48 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB Cuadro 2.2: Operadores aritméticos definidos en Matlab operación śımbolo ejemplo notas suma + r=a+b suma matricial diferencia - producto * r=a*b producto matricial producto .* r=a.*b producto por elementos división / d=a/b división: a · b−1 división ./ d=a./b división por elementos división \ d=a\b división por la izquierda: a−1 · b potenciación ^ y=a ^ b potencia de una matriz potenciación .^ y=a .^ b potencia elemento a elemento trasposición ’ y=a’ matriz traspuesta >> A=[1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >> B=[4 5 6; 2 0 3; -1 2 4] B = 4 5 6 2 0 3 -1 2 4 >> C=A+B C = 5 7 9 6 5 9 6 10 13 Por supuesto, hay que respetar las condiciones en que es posible realizar una operación aritmética entre matrices. La operación, >> A=[1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >> B=[4 5 6; 2 0 3] 2.3. OPERACIONES ARITMÉTICAS, RELACIONALES Y LÓGICAS 49 B = 4 5 6 2 0 3 >> C=A+B Error using + Matrix dimensions must agree. da un error porque solo es posible sumar matrices del mismo tamaño.3 En el caso del producto, Matlab define dos operaciones distintas. La primera es el producto matricial normal, >> A=[1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >> B=[3 4; -2 1; 6 7] B = 3 4 -2 1 6 7 >> P=A*B P = 17 27 38 63 59 99 El segundo producto, no es propiamente una operación aritmética definida sobre matrices. Se trata de un producto realizado elemento a elemento. Para ello los dos factores deben ser matrices del mismo tamaño. El resultado es una nueva matriz de igual tamaño que las iniciales en la que cada elemento es el producto de los elementos que ocupaban la misma posición en las matrices factores, >> A = [1 2 3; 4 5 6] A = 1 2 3 4 5 6 >> B = [2 3 4; 1 2 3] 3Ver las definiciones de las operaciones matriciales en el capitulo 5.2. 50 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN EN MATLAB B = 2 3 4 1 2 3 >> C =A.*B C = 2 6 12 4 10 18 En general, cualquier operador al que se antepone un punto .* ./ .^ indica una operación realizada elemento a elemento. La división no está definida para matrices. Sin embargo, en Matlab hay definidas tres divisiones. La primera, emplea el śımbolo clásico de división, para simples números realiza la división normal. Para matrices, la operación es equivalente a multiplicar el primer operando por la matriz inversa del segundo. A/B ≡ A ·B−1. Las siguientes tres operaciones son equivalentes en Matlab,