Subido por: Libros de Ingeniería Química y más https://www.facebook.com/pages/InterfaseIQ/146073555478947?ref=bookmarks Si te gusta este libro y tienes la posibilidad, cómpralo para apoyar al autor. i i “LibMetNum” — 2017/4/3 — 20:44 — page 1 — #3 i i Matemáticas para Ingeniería. Métodos numéricos con Python i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 2 — #4 i i i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 3 — #5 i i Matemáticas para Ingeniería. Métodos numéricos con Python Diego Arévalo Ovalle Miguel Ángel Bernal Yermanos Jaime Andrés Posada Restrepo Bogotá, marzo de 2017 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 4 — #6 i i © Institución Universitaria Politécnico Grancolombiano Matemáticas para Ingeniería. Métodos numéricos con Python. ISBN: 978–958–8721–56–9 E ISBN: 978–958–8721–55–2 Editorial Politécnico Grancolombiano Av. Caracas # 63–55, Piso 4 PBX: 7455555 Ext. 1171 [email protected] Marzo de 2017 Bogotá Colombia Institución Universitaria Politécnico Grancolombiano Facultad de Ingeniería y Ciencias Básicas Autores Diego Arévalo Ovalle Miguel Ángel Bernal Yermanos Jaime Andrés Posada Restrepo Coordinador editorial Eduardo Norman Acevedo Analista de producción editorial Paulo Mora Noguera Corrección de estilo Hernán Darío Cadena Armada electrónica Jaime Andrés Posada Restrepo Arévalo Ovalle, Diego Matemáticas para Ingeniería: Métodos numéricos con Python. / Diego Arévalo Ovalle, Miguel Ángel Bernal Yermanos y Jaime Andrés Posada Restrepo; coordinador editorial, Eduardo Norman Acevedo. – Bogotá D.C.: Editorial Politécnico Grancolombiano, 2017. 143 p.: il.; 17 × 24 cm. Incluye referencias bibliográficas. ISBN: 978–958–8721–56–9 E ISBN: 978–958–8721–55–2 1. INGENIERÍA – ANÁLISIS NUMÉRICO. – 2. MATEMÁTICAS PARA INGENIEROS – 3. PYTHON (LENGUAJE DE PROGRAMACIÓN DE COMPUTADORES). – 4. INTERPOLACIÓN (MATEMÁTICAS). – 5. ECUACIONES DIFERENCIALES. – 6. ALGORITMOS. – 7. ANÁLISIS MATÉMATICO 511 A678m 21 Ed. Sistema Nacional de Bibliotecas – SISNAB Institución Universitaria Politécnico Grancolombiano Impresión y encuadernación Xpress Estudio Gráfico y Digital Impreso y hecho en Colombia Printed in Colombia ¿Cómo citar este título? Arévalo Ovalle, D., Bernal Yermanos, M. A., & Posada Restrepo, J. A. (2017), Matemáticas para Ingeniería. Métodos numéricos con Python, Bogotá: Editorial Politécnico Grancolombiano. La Editorial del Politécnico Grancolombiano pertenece a la Asociación de Editoriales Universitarias de Colombia, ASEUC. El contenido de esta publicación se puede citar o reproducir con propósitos académicos siempre y cuando se dé cuenta de la fuente o procedencia. Las opiniones expresadas son responsabilidad exclusiva del autor. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 5 — #7 i i Prefacio Este texto es el resultado de nuestra labor como orientadores del curso de métodos numéricos en la Institución Universitaria Politécnico Grancolombiano durante varios años. Aunque inicialmente solamente se disponía de notas de clase construidas de manera informal para los cursos, con el tiempo surgió la necesidad de consolidarlas en un sólo documento. El libro contiene métodos computacionales para resolver problemas esenciales en el campo de ingeniería o matemática aplicada. En cada método se pretende dar al lector una visión de su esencia, necesidad, ventajas y desventajas. En algunos casos, alejándose de presentaciones rigurosas, pero sin dejar de ser correctas. El objetivo final es proporcionar los elementos necesarios para la aplicación adecuada de los algoritmos. El capítulo 1 expone los principales procedimientos computacionales para la solución de ecuaciones de una variable, describiendo sus ventajas y desventajas computacionales. El capítulo 2 presenta las herramientas básicas para la estimación de nuevos datos a partir de un conjunto de puntos. Se abordan dos enfoques de interpolación: exacta y ajuste de mínimos cuadrados. El capítulo 3 comprende los algoritmos de factorización LU , Jacobi y Gauss-Seidel para la solución de sistemas de ecuaciones lineales. El capítulo 4 se encuentra dedicado a los métodos numéricos para la solucíon de ecuaciones diferenciales, iniciando con el método de Euler y finalizando con el método RK4. Al final del libro, el lector puede encontrar todos los algoritmos presentados a lo largo del texto desarrollados en Python, un lenguaje de programación flexible y que responde a las necesidades didácticas del curso. Para terminar, deseamos expresar nuestros agradecimientos a los alumnos y compañeros que a través de sus inquietudes, permitieron la construcción de los contenidos de este documento. 5 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 6 — #8 i i 6 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 7 — #9 i i Índice general 1. Ecuaciones de una variable 11 1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2. Método de bisección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2.1. Criterios de parada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.2.2. Método de regula falsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.3. Método de Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.3.1. Método de la secante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.4. Método de punto fijo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 1.5. Orden de un método de iteración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.5.1. Orden de convergencia en el método de punto fijo . . . . . . . . . . . . . . . . 29 1.5.2. Orden del método de Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . 30 2. Interpolación 33 2.1. Ajuste exacto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.1.1. Polinomio de interpolación de Lagrange . . . . . . . . . . . . . . . . . . . . . . 34 2.1.2. Polinomio de interpolación de Newton . . . . . . . . . . . . . . . . . . . . . . . 38 2.1.3. Trazadores cúbicos (Cubic Splines) . . . . . . . . . . . . . . . . . . . . . . . . . 45 2.1.4. Trazadores cúbicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.2. Ajuste por mínimos cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.2.1. Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.2.2. Funciones de ajuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.2.3. Polinomios de mínimos cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.2.4. Ajuste exponencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 3. Sistemas de ecuaciones 59 3.1. Métodos directos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 7 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 8 — #10 i 8 i ÍNDICE GENERAL 3.1.1. Factorización LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.2. Métodos iterativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.2.1. Normas vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.2.2. Normas matriciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 3.2.3. Métodos iterativos en la solución de sistemas de ecuaciones lineales . . . . . . . 71 4. Ecuaciones diferenciales 83 4.1. Problemas de valor inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.1.1. Método de Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.1.2. Orden del método de Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.1.3. Método de Verlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.1.4. Error del método de Verlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.1.5. Métodos de Runge-Kutta orden 2 . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.1.6. Método de Runge-Kutta orden 4 (RK4) . . . . . . . . . . . . . . . . . . . . . . 97 A. Tutorial de Python 103 A.1. Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 A.2. Consola interactiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 A.3. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 A.4. Estructuras básicas de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 A.4.1. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 A.4.2. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 A.4.3. for A.5. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 A.5.1. Factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 A.5.2. GCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 A.5.3. ¿Es palíndromo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 A.5.4. Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 B. Compendio de algoritmos 109 B.1. Ecuaciones de una variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 B.1.1. Bisección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 B.1.2. Regula falsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 B.1.3. Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 B.1.4. Secante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 9 — #11 i ÍNDICE GENERAL i 9 B.1.5. Punto fijo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 B.2. Interpolación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 B.2.1. Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 B.2.2. Diferencias divididas de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . 122 B.2.3. Trazadores cúbicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 B.2.4. Recta de ajuste mínimos cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . 126 B.3. Sistemas de ecuaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 B.3.1. LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 B.3.2. Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 B.3.3. Gauss-Seidel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 B.4. Ecuaciones diferenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 B.4.1. Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 B.4.2. Verlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 B.4.3. RK4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Bibliografía 145 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 10 — #12 i i i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 11 — #13 i i Capítulo 1 Ecuaciones de una variable 1.1. Introducción Uno de los problemas más antiguos, y que con mayor frecuencia se debe resolver en matemáticas aplicadas, es encontrar ceros de funciones, es decir, dada la función f (x), encontrar un valor c tal que f (c) = 0. En los cursos de cálculo el procedimiento estándar para resolver esta situación es despejar la incógnita. Ejemplo 1. Resolver 3x − 4 = 0 Solución: el problema propone buscar el valor de x, que al ser reemplazado en la ecuación resulte igual a cero. Aplicando las propiedades de la igualdad, se puede proceder de la siguiente forma: i. Sumar a ambos lados de la igualdad 4: 3x − 4 + 4 = 0 + 4 que lleva a: 3x = 4 ii. Multiplicar ambos lados de la ecuación por 13 : 3x 4 = 3 3 El anterior procedimiento permite despejar la incógnita y lleva a la respuesta: x= 4 3 ♦ Ejemplo 2. Encontrar las soluciones de x2 − x − 6 = 0. Solución: de nuevo, aunque el procedimiento es intentar despejar la incógnita, ahora no parece tan evidente como en el ejemplo anterior: 11 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 12 — #14 i 12 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE i. Se suma 6 a ambos lados de la ecuación: x2 − x = 6 ii. Se completa el trinomio cuadrado perfecto: x2 − x + 1 1 =6+ 4 4 iii. Se factoriza el lado izquierdo de la igualdad: 2 25 1 = x− 2 4 iv. Se calcula la raíz cuadrada en ambos lados de la igualdad: r 1 25 x− = 2 4 v. Se resuelve la ecuación anterior para obtener: x= 1 5 ± 2 2 Finalmente, se obtiene las dos soluciones (raíces) de esta ecuación, que son: x = 3, y x = −2 ♦ El problema es que hay muchas ecuaciones que aparecen en ciencias e ingeniería en las cuales no es posible aplicar un procedimiento para despejar la incógnita, como es el caso de: i) x − cos x = 0 iii) x − tan x = 0 ii) e−x − sin x = 0 iv) e−x − x = 0 Cualquier intento por despejar la incógnita en las ecuaciones mencionadas arriba fracasa, aunque intuitivamente parece haber respuesta. Por ejemplo, si para la primera ecuación se hace la gráfica de las funciones x y cos x, como se ilustra en la figura 1.1, el punto de corte es el cero que se busca. Surge la pregunta ¿qué se puede hacer?, y es en este momento cuando entran los métodos numéricos a resolver estos interrogantes. Aunque varias técnicas van a permitir solucionar estas preguntas, sus respuestas no serán exactas, contrario a las soluciones de los ejemplos 1 y 2. Lo que brindarán los métodos numéricos son aproximaciones a los resultados correctos, en principio tan precisas como se desee. Para tener claridad del propósito del presente capítulo, se enuncia el problema que se pretende resolver: Problema: dada la función f (x), encontrar un valor c ∈ R tal que f (c) = 0. En lo que sigue, se exponen diferentes métodos para determinar una aproximación de la solución del problema general de este capítulo. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 13 — #15 i i 1.2. MÉTODO DE BISECCIÓN 13 Figura 1.1: la coordenada x del punto de corte de las gráficas de las dos funciones es el cero de la función f (x) = x − cos x. 1.2. Método de bisección El método de bisección se basa en el teorema del valor intermedio, que en una de sus versiones establece: Teorema 1 (Teorema de valor intermedio). Si f : [a, b] → R es una función continua y f (a)f (b) < 0, entonces existe c ∈ (a, b) tal que f (c) = 0. Ahora, si f : [a, b] → R es una función continua y f (a)f (b) < 0, entonces por el teorema del valor intermedio se conoce que existe al menos una solución de la ecuación f (x) = 0 y es posible aplicar el siguiente procedimiento, denominado método de bisección, para determinar dicha solución. 1. Definir a0 = a y b0 = b. 2. Calcular el punto medio del intervalo (por esto se llama método de bisección) [a0 , b0 ], c0 = a0 +b0 2 . 3. a. Si f (c0 ) = 0 entonces c0 es un cero de la función y por lo tanto una solución del problema. b. Si f (a0 )f (c0 ) > 0 quiere decir que existe un cero de la función en el intervalo (c0 , b0 ), entonces seleccionar este intervalo y definir a1 = c y b1 = b0 . c. Si f (a0 )f (c0 ) < 0 quiere decir que existe un cero de la función en el intervalo (a0 , c0 ), entonces seleccionar este intervalo y definir a1 = a y b1 = c0 . Nota: observar que ninguno de los tres casos mencionados arriba se pueden dar simultáneamente. Además, si la situación es la del caso b, donde se tiene seguridad que hay un cero de la función en el intervalo (c0 , b0 ), por el teorema del valor intermedio, esto no descarta que pueda existir otra raíz en el intervalo (a0 , c0 ). ¿Por qué? 4. Si f (c0 ) 6= 0, repetir los pasos 2, 3 y 4 para el nuevo intervalo [a1 , b1 ] A continuación se demuestra la convergencia del método y en la figura 1.2 se muestra en forma gráfica algunos de los pasos en su ejecución. Teorema 2. Si se cumplen las hipótesis del teorema del valor intermedio, entonces el método de bisección converge a un cero de f (x) en el intervalo [a, b]. Demostración. Notar que en cada iteración la medida del intervalo se divide a la mitad. Así, en la primera iteración la medida del intervalo [a1 , b1 ] es la mitad del intervalo inicial; en la segunda iteración la medida del intervalo [a2 , b2 ] es la mitad de la medida del intervalo [a1 , b1 ] y por lo tanto corresponde i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 14 — #16 i 14 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE y a a0 b c0 a1 x b0 c1 b1 a2 c2 b2 Figura 1.2: un ejemplo del método de bisección. a un cuarto de la medida del intervalo inicial; en la tercera iteración la medida del intervalo [a3 , b3 ] es un octavo de la medida del intervalo inicial, etc. Expresando lo anterior de manera formal se tiene: 1 |b0 − a0 | = 2 1 |b2 − a2 | = |b1 − a1 | = 2 1 |b3 − a3 | = |b2 − a2 | = 2 .. . 1 |bn − an | = n |b0 − a0 | 2 |b1 − a1 | = 1 |b0 − a0 | 21 1 |b0 − a0 | = 4 1 |b0 − a0 | = 8 Primera iteración 1 |b0 − a0 | 22 1 |b0 − a0 | 23 Segunda iteración Tercera iteración n-ésima iteración Ahora, en cada intervalo [an , bn ] existe c ∈ R tal que f (c) = 0, y por lo tanto, para cn punto medio de an y bn se tiene: |cn − c| < 1 1 |bn − an | = n |b0 − a0 |, 2 2 para cada n ∈ N Entonces 0 ≤ |cn − c| ≤ 21n |b0 − a0 |. Si ahora se toma el límite cuando el número n de iteraciones tiende al infinito, se tiene que lı́mn→∞ 0 ≤ lı́mn→∞ |cn − c| ≤ lı́mn→∞ 21n |b0 − a0 | en caso de existir los límites. Notar que |b0 − a0 | es una constante, dado que es la medida del intervalo inicial y dado que no cambia, se tiene que lı́mn→∞ 21n |b0 − a0 | = |b0 − a0 | lı́mn→∞ 21n = 0. También es claro que lı́mn→∞ 0 = 0, y por tanto lı́mn→∞ |cn − c| existe y es igual a 0. Luego se tiene que {cn }∞ n=0 converge a c. Como se puede observar, el procedimiento encierra a un cero de la función en un sub-intervalo que en cada iteración es “más pequeño” que el anterior. Dado que |cn − c| ≤ 21n |b0 − a0 | es posible determinar el número de iteraciones necesarias para obtener una aproximación de un cero de la función, tan “cercana” como se desee. Para lo anterior, observar que si se requiere |cn − c| ≤ ε para algún n ∈ N y ε i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 15 — #17 i 1.2. MÉTODO DE BISECCIÓN i 15 real positivo, entonces es suficiente que 1 2n |b0 − a0 | ≤ ε. Se sigue entonces: 1 |b0 − a0 | ≤ ε 2n |b0 − a0 | ⇒ ≤ 2n ε |b0 − a0 | ⇒ ln ≤ n ln 2 ε ln |b0 − a0 | − ln ε ⇒ ≤n ln 2 Por lo tanto n = ln |b0 −a0 |−ln ε ln 2 , donde dxe representa la función “techo”, es tal que |cn − c| ≤ ε. 1 2 Ejemplo 3. Determinar un cero de la función f (x) = − 10 x + 3 utilizando el método de bisección. Solución: lo primero es determinar dos valores a0 y b0 tales que f (a0 )f (b0 ) < 0. En este caso, se 0 escoge a0 = 1 y b0 = 7 y luego se calcula c0 = a0 +b = 1+7 2 2 = 4. Entonces f (c0 ) = 1, 4 y f (a0 )f (c0 ) > 0, lo que indica que existe un cero de la función en el intervalo [c0 , b0 ]. Se define a1 = c0 , b1 = b0 y se repite el proceso. El cuadro 1.1 presenta los resultados. n an bn cn f (an ) f (cn ) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 4 4 4,75 5,125 5,3125 5,40625 5,453125 5,4765625 5,4765625 5,4765625 5,4765625 5,4765625 5,4765625 5,476928711 5,477111816 5,477203369 7 7 5,5 5,5 5,5 5,5 5,5 5,5 5,5 5,48828125 5,482421875 5,479492188 5,478027344 5,477294922 5,477294922 5,477294922 5,477294922 4 5,5 4,75 5,125 5,3125 5,40625 5,453125 5,4765625 5,48828125 5,482421875 5,479492188 5,478027344 5,477294922 5,476928711 5,477111816 5,477203369 5,477249146 2,9 1,4 1,4 0,74375 0,3734375 0,177734375 0,077246094 0,026342773 0,000726318 0,000726318 0,000726318 0,000726318 0,000726318 0,000726318 0,00032519 0,000124615 2,43253E-05 1,4 -0,025 0,74375 0,3734375 0,177734375 0,077246094 0,026342773 0,000726318 -0,012123108 -0,005694962 -0,002483463 -0,000878358 -7,59661E-05 0,00032519 0,000124615 2,43253E-05 -2,58202E-05 1 2 Cuadro 1.1: solución de la ecuación − 10 x + 3 = 0 con el método de bisección. Se tiene entonces que c16 = 5, 477249146 es una aproximación de un cero de la función con un error de |c16 − c| ≤ |b16 − a16 | = 0, 000091552 y por tanto la aproximación es correcta al menos en cuatro cifras decimales. ♦ Ejemplo 4. Determinar la cantidad de iteraciones, en el método de bisección, necesarias para obtener una aproximación de la solución de la ecuación x − cos x = 0 con un error inferior a ε = 10−3 si a0 = 0, 5 y b0 = 1. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 16 — #18 i 16 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE Solución: ln |b0 − a0 | − ln ε ln 2 ln 0, 5 − ln 10−3 = ln 2 n= = d12, 28771238e = 13 Por lo tanto se necesitan 13 iteraciones en el método de bisección para alcanzar la precisión deseada. ♦ En este punto, es necesario mencionar algunos criterios para detener un proceso iterativo como el método de bisección. 1.2.1. Criterios de parada Si {cn }∞ n=0 es una sucesión convergente a un valor c, es decir lı́mn→∞ cn = c, entonces si se desea determinar un N ∈ N tal que |cN − c| < 2ε para una tolerancia ε > 0, es necesario generar c1 , c2 , c3 , . . . hasta que se cumpla una de las siguientes condiciones: |cn − cn−1 | < ε, |cn − cn−1 | < ε, |cn | cn 6= 0 |cn − cn−1 | < ε se utilizará como criterio de parada para los métodos iterativos de este capítulo. n Ejemplo 5. Sea cn = 1 + n1 , determinar N ∈ N tal que |cN − cN −1 | < 10−4 Solución: se genera c1 = 2, c2 = 2, 25, . . . y se evalúa |cN − cN −1 |, concluyendo que para N = 369 se tiene |c369 − c368 | = |2, 714607646 − 2, 714597687| < 10−4 . ♦ 1.2.2. Método de regula falsi Este método es un intento por aumentar la rapidez del método de bisección. Los algoritmos solo se diferencian en el punto del intervalo que calculan. Mientras en bisección es el punto medio, en regula falsi es el corte con el eje x de la recta que une los puntos extremos de la gráfica definida en el intervalo [an , bn ], como se ve en la figura 1.3. Si an y bn son los extremos del intervalo, entonces la ecuación de la recta que contiene los puntos (an ) n )(bn −an ) (an , f (an )) y (bn , f (n)) es y = f (bbnn)−f (x − an ) + f (an ) y su corte con el eje x, an − ff(a −an (bn )−f (an ) , define el punto cn , que se espera sea una mejor aproximación. 1 2 Ejemplo 6. Determinar un cero de la función f (x) = − 10 x + 3 con un error inferior a ε = 9, 8 × 10−4 , utilizando el método de regula falsi. Solución: se determinan dos valores a0 y b0 tales que f (a0 )f (b0 ) < 0. En este caso se escoge a0 = 1 0 )(b0 −a0 ) y b0 = 7, y se calcula c0 = a0 − ff(a (b0 )−f (a0 ) = 4, 625 y f (c0 ) = 0, 8609375. Por lo tanto f (a0 )f (c0 ) > 0, i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 17 — #19 i 1.2. MÉTODO DE BISECCIÓN i 17 b an cn b bn Figura 1.3: método de regula falsi. n an bn cn f (an ) f (cn ) 0 1 2 3 4 5 6 1 4,625 5,365591398 5,463478261 5,475545943 5,477020558 5,477200553 7 7 7 7 7 7 7 4,625 5,365591398 5,463478261 5,475545943 5,477020558 5,477200553 5,477222521 2,9 0,8609375 0,121042895 0,015040529 0,001839663 0,000224581 2,74097E-05 0,8609375 0,121042895 0,015040529 0,001839663 0,000224581 2,74097E-05 3,34521E-06 1 2 Cuadro 1.2: solución de la ecuación − 10 x + 3 = 0 con el método de regula falsi. lo que indica que existe un cero de la función en el intervalo [c0 , b0 ]. Se define a1 = c0 , b1 = b0 y se repite el proceso. El cuadro 1.2 presenta los resultados. 1 2 Luego, utilizando el criterio de parada, c6 es una aproximación de la solución de la ecuación − 10 x +3 = 0 con un error inferior a ε = 9, 8 × 10−4 . ♦ Observación: las condiciones necesarias para asegurar la convergencia del método de regula falsi corresponden a las condiciones del método de bisección. Aunque no es posible aplicar la formula del método de bisección para calcular la cantidad de iteraciones necesarias en su ejecución, se espera lograr la precisión establecida en un menor número de iteraciones. Ejercicios 1 1. Utilizar el método de bisección para obtener c5 , con f (x) = e−x−0.7 − x − 0.7 en el intervalo [0, 1]. 2. Utilizar el método de bisección para aproximar un cero de la función con una precisión de 10−5 dentro del intervalo indicado: a) f (x) = cos(ex ) + x en [−1, 0] b) g(x) = 2x (x − 6) − x en [−5, 5] c) h(x) = sin(3x) − cos(2x) − 1 en [−8, −1] d) f (x) = ex (x−3) + 2x en [1, 2] e) x−2 − tan x en [3, 4] 2 f ) x3 − 4x cos x + (2 sin x) − 3, en los intervalos [−2, −1], [−1, 0] y [1,2]. 3. Aplicar el método de bisección para la función f (x) = intervalo [−1, 1]. ¿Qué sucede? 1 x, con una precisión de 10−7 , en el 4. Utilizar el método de regula falsi para aproximar un cero de la función f (x) = xe−2x + x + 1 con una precisión de 10−6 . i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 18 — #20 i 18 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE 5. Utilizar el método de bisección y regula falsi para aproximar un cero de cada función con una precisión de 10−6 . Comparar el número de iteraciones necesarias en cada método. a) f (x) = (x − 1)4,5 − 5(x − 1) − 0, 1 en [1, 3] b) g(x) = x ln(x + 1) − 2 en [0, 2] 6. Construir una tabla de datos desde −1 hasta 2, en pasos de 0.1 para detectar cambios de signo e identificar intervalos de la función f (x) = x5 − 3x3 − 8x2 − x − 4 . x3 + 2x2 + x + 6 Con el método de regula falsi, encontrar los ceros en este intervalo con precisión hasta la tercera cifra decimal. 7. Con ayuda de un programa graficador, construir la gráfica de f (x) = |x| − cos x en el intervalo [−4, 4]. Con el método de bisección, encontrar los ceros con una precisión de cuatro cifras decimales. 1.3. Método de Newton-Raphson Este método se basa en elementos del cálculo diferencial y su interpretación gráfica. Es uno de los métodos más eficientes1 para determinar, con una precisión deseada, una aproximación de la solución de la ecuación f (x) = 0. Gráficamente (ver figura 1.4) se puede interpretar el método de Newton de la siguiente manera: 1. Seleccionar un punto inicial (semilla) p0 . 2. Calcular la ecuación de la recta tangente a la curva f (x) que pasa por el punto (p0 , f (p0 )) 3. Determinar el corte con el eje x de la recta tangente y nombrar como p1 . 4. Si f (p1 ) 6= 0 repetir los pasos 2, 3 y 4 para p1 . Ahora, la ecuación de la recta tangente a la curva y = f (x) que pasa por el punto (p0 , f (p0 )) tiene como pendiente m = f 0 (p0 ) y corresponde a y = f 0 (p0 )x + [f (p0 ) − f 0 (p0 )p0 ] para calcular el cero de esta recta se reemplaza y por cero 0 = f 0 (p0 )x + f (p0 ) − f 0 (p0 )p0 y al despejar x, se tiene x = p0 − f (p0 ) f 0 (p0 ) . Dicho valor de x se nombra como p1 y por tanto: p1 = p0 − 1 En f (p0 ) f 0 (p0 ) el sentido de cantidad de iteraciones. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 19 — #21 i 1.3. MÉTODO DE NEWTON-RAPHSON i 19 b (p0 , f (p0 )) b p2 p1 p0 Figura 1.4: método de Newton-Raphson. Si se repite el proceso, pero ahora con el punto (p1 , f (p1 )), se obtiene: p2 = p1 − f (p1 ) f 0 (p1 ) p3 = p2 − f (p2 ) f 0 (p2 ) repitiendo ahora con (p2 , f (p2 )) y finalmente, en la n-ésima iteración pn = pn−1 − f (pn−1 ) f 0 (pn−1 ) (1.1) que es la fórmula de iteración correspondiente al método de Newton-Raphson. Ejemplo 7. Determinar una solución de la ecuación e−x − sin x = 0 con una precisión de ε = 10−3 usando el método de Newton-Raphson. Solución: si se realiza la gráfica de la función f (x) = e−x − sin x, se observa que la función posee varios ceros y uno de ellos está en el intervalo [0, 1]. Por lo tanto, seleccionando p0 = 0.2 se espera que el método de Newton-Raphson sea convergente. Por otro lado, f 0 (x) = −e−x − cos x, de donde se tiene: p1 = p0 − e−0.2 − sin 0.2 f (p0 ) = 0.2 − = 0, 544708885 f 0 (p0 ) −e−0.2 − cos 0.2 1) Ahora, p2 = p1 − ff0(p (p1 ) = 0, 587795322, observando los resultados del cuadro 1.3 y utilizando el criterio de parada, se obtiene que p4 = 0, 588532744 es una aproximación de la solución de la ecuación e−x − sin x = 0 con una precisión de ε = 10−3 . n pn 0 1 2 3 4 0,2 0,544708885 0,587795322 0,588532526 0,588532744 Cuadro 1.3: resultados del método de Newton-Raphson. ♦ i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 20 — #22 i 20 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE 1.3.1. Método de la secante Aunque el método de Newton-Raphson es uno de los más eficientes para determinar una solución de la ecuación f (x) = 0, la necesidad de conocer f 0 (x) representa una de sus mayores debilidades, pues el cálculo de la derivada requiere (y representa) más operaciones aritméticas. Una manera de evitar el “problema” de calcular la derivada es recordar que f 0 (pn−1 ) = lı́m x→pn−1 f (x) − f (pn−1 ) x − pn−1 y dado que pn−2 se encuentra “cerca” de pn−1 en caso que el método de Newton-Raphson sea convergente, entonces es posible aproximar f 0 (pn−1 ) por f 0 (pn−1 ) ≈ f (pn−2 ) − f (pn−1 ) pn−2 − pn−1 Al sustituir en la fórmula de iteración de Newton-Raphson, se obtiene f (pn−1 )(pn−1 − pn−2 ) f (pn−1 ) − f (pn−2 ) pn = pn−1 − La anterior fórmula de iteración se denomina método de la secante. Es de anotar, que para utilizar el anterior método son necesarias dos aproximaciones iniciales (semillas) p0 y p1 . Una interpretación geométrica (figura 1.5) del método de la secante es la siguiente: 1. Seleccionar dos puntos iniciales p0 y p1 . 2. Calcular la ecuación de la recta que pasa por los puntos (p0 , f (p0 )) y (p1 , f (p1 )). 3. Determinar el corte con el eje x de la anterior recta y nombrarlo como p2 . 4. Si f (p2 ) 6= 0, repetir los pasos 2, 3 y 4 para p1 y p2 . b b b b p3 p2 p1 p0 Figura 1.5: método de la secante. Ejemplo 8. Aplicar el método de la secante para obtener una solución de la ecuación x−0, 5 tan(x) = 0 con una precisión de ε = 10−4 . Solución: tomando como puntos iniciales p0 = 1.2 y p1 = 1 (dado que la gráfica de f (x) = x − 0, 5 tan(x) lo indica), se obtiene: p2 = p1 − f (p1 )(p1 − p0 ) 0, 221296138(1 − 1.2) =1− = 1, 14399241 f (p1 ) − f (p0 ) 0, 221296138 − (−0, 086075811) i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 21 — #23 i 1.3. MÉTODO DE NEWTON-RAPHSON i 21 n pn 0 1 2 3 4 5 6 7 1,2 1 1,14399241 1,180243146 1,164484057 1,165508347 1,165561378 1,165561185 Cuadro 1.4: resultados del método de la secante. Los resultados del método se presentan en el cuadro 1.4. Luego p7 = 1, 165561185 es una aproximación de la solución a la ecuación x − 0, 5 tan(x) = 0. ♦ Ejercicios 2 1. Determinar p3 en el método de Newton-Raphson al aplicarlo en la solución de la ecuación e−x − x = 0 si p0 = −1. 2. Usar el método de Newton-Raphson para obtener una aproximación de las soluciones de los siguientes problemas con una precisión de ε = 10−7 . a) 4x2 − 4xe−2x + e−4x = 0 en [0, 1] b) 3x2 + ln(x)(2x + ln(x)) = 2x2 en [0, 1] c) e−2 x2 + 2e−1 x = −1 en [−4, −2] d) x2 cos2 (x) + cos2 (x) − 2x3 cos(x) − 2x cos(x) + x4 + x2 en [−1, 1] 3. [Ejemplos clásicos] Utilizar el método de Newton-Raphson para aproximar la solución de cada ecuación desde el punto p0 . Determinar qué ocurre y justificar. a) tan−1 (x) = 0, p0 = 1, 39174520027073. b) −x4 + 6x2 + 11, p0 = 1. 2 c) 1 − 2e−x = 0, p0 = 0, 83255461. d) sin x − e−x , p0 = 3, 5. 4. Usar el método de Newton-Raphson para aproximar Ayuda: considerar f (x) = x3 − 25. √ 3 25 con cuatro cifras decimales correctas. 5. Usar el método de la secante para aproximar un cero (con una precisión de ε = 10−6 ) de la función h(x) = x3 − 3x + 1 en el intervalo [1, 2]. 6. Sea f (x) = ln(x), p0 = 2, 8 y p1 = 2, 64. Utilizar el método de la secante para aproximar un cero de la función con una precisión ε = 10−4 . Comparar con el resultado de aplicar el método de Newton-Raphson con punto inicial p0 = 2, 8. 7. Si f (x) = e−2x − 2x + 1, utilizar el método de Newton-Raphson para aproximar una solución de la ecuación f (x) = 0 con una precisión de ε = 10−8 si p0 = 2. Comparar (en cantidad de iteraciones) el resultado con el obtenido al aplicar el método de la secante con p0 = 2 y p1 = 1, 9. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 22 — #24 i 22 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE 8. Identificar el propósito de la siguiente fórmula de iteración obtenida con el método de NewtonRaphson: xn+1 = 2xn − x2n R. Para lo anterior, considerar que cuando n → ∞, xn → A. 9. Identificar el propósito de la siguiente fórmula de iteración obtenida con el método de NewtonRaphson: 19 xn+1 = 0.5 xn − . xn Para lo anterior, considerar que cuando n → ∞, xn → A. √ 10. Dos números x y y, al multiplicarse dan 45. Si x (y + 12, 648001) = 25, con el método de Newton-Raphson encontrar los dos números con precisión de cuatro cifras decimales. 1.4. Método de punto fijo Desde la antigua Babilonia es conocido el siguiente método para calcular √ A: √ 1. Seleccionar x0 “cercano” a A. 2. Calcular xn+1 = 21 xn + xAn para n ≥ 0 Este método es eficiente y uno de los mejores ejemplos de la técnica que se desarrolla en esta sección para aproximar soluciones de ecuaciones. Aunque existen muchas técnicas numéricas que dan solución a la ecuación f (x) = 0, tal vez una de las más famosas es el llamado método del punto fijo, un procedimiento para aproximar la solución de la ecuación x = g(x). Para comprender este método, es necesario dar algunas definiciones y ejemplos. Definición 1. Un punto fijo de una función g(x) es un valor c, tal que g(c) = c. Ejemplo 9. La función g(x) = x, tiene infinitos puntos fijos, dado que para cualquier valor de c, g(c) = c. Ejemplo 10. La función g(x) = x2 + 6x + 6 tiene dos puntos fijos, x = −2 y x = −3. ¿Por qué? Solución: observar: g(−2) = (−2)2 + 6(−2) + 6 = 4 − 12 + 6 = −2, luego g(−2) = −2. g(−3) = 9 − 18 + 6 = −3, luego g(−3) = −3. ¿Tendrá más puntos fijos? ♦ ¿Por qué es relevante encontrar puntos fijos? La respuesta radica en que los problemas de encontrar ceros de funciones y encontrar puntos fijos de funciones están estrechamente relacionados. Por ejemplo, para calcular los puntos fijos de la función del ejemplo 10, se puede plantear la ecuación, g(x) = x, es decir x2 + 6x + 6 = x, que organizando términos lleva a la ecuación x2 + 5x + 6 = 0. Luego el problema de buscar el punto fijo de g(x) se convirtió en el de buscar ceros de una nueva función, en este caso de f (x) = x2 + 5x + 6. Para generalizar y resumir, se construyó una función f (x) a partir de la función g(x), de la manera f (x) = g(x) − x, de tal forma que si la función g(x) tiene un punto fijo, c, este punto fijo de g(x) es un cero de f (x), dado que f (c) = g(c) − c y como g(c) = c, entonces f (c) = c − c = 0. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 23 — #25 i i 1.4. MÉTODO DE PUNTO FIJO 23 El problema inverso también es válido. Si la función f (x) tiene un cero en p, entonces podemos construir una nueva función g(x) a partir de f (x), en la cual el cero de f (x) sea un punto fijo de g(x). Se puede verificar lo anterior tomando, por ejemplo, a g(x) = x + f (x). Notar que si se evalúa g(x) en p se obtiene g(p) = p + f (p), y como f (p) = 0, entonces g(p) = p + 0 = p y por lo tanto el cero de f (x) es un punto fijo de g(x). Entonces, como seguramente ya se intuye, la idea general es cambiar el problema f (x) = 0 por el problema g(x) = x. El siguiente teorema establece condiciones suficientes para la existencia de un punto fijo. Teorema 3. Sean [a, b] ⊆ R y g : [a, b] → [a, b] una función continua. Entonces g tiene un punto fijo en [a, b]. Demostración. Si g(a) = a o g(b) = b, entonces un punto fijo de g es un extremo. En caso contrario, se tiene g(a) > a y g(b) < b. Dado que f (x) = g(x)−x es una función continua en [a, b] y f (a) = g(a)−a > 0 y f (b) = g(b) − b < 0, por el teorema del valor intermedio se sigue que f tiene un cero en [a, b], es decir, existe p ∈ [a, b] tal que f (p) = 0, lo que implica que g(p) − p = 0, o de manera equivalente g(p) = p. Ahora, para calcular una aproximación de un punto fijo de una función g es posible aplicar el siguiente procedimiento (ver figura 1.6): 1. Seleccionar un punto inicial p0 . 2. Calcular g(p0 ) y nombrarlo como p1 . 3. Si g(p1 ) 6= p1 , repetir los pasos 2 y 3 para p1 . Este procedimiento recibe el nombre de método de punto fijo. Figura 1.6: método de punto fijo. Ejemplo 11.rUtilizar el método de punto fijo para obtener una aproximación a la solución de la 10 ecuación x = con una precisión de ε = 10−4 . x+4 r 10 = p0 + 4 1, 348399725, y dado que |p0 − p1 | > 10−4 , se repite el proceso. Calcular p2 = g(p1 ) = 1.367376372, y ya que |p1 − p2 | > 10−4 se sigue iterando. Los resultados se resumen en el cuadro 1.5. Solución: seleccionar un punto inicial p0 , en este caso p0 = 1.5. Calcular p1 = g(p0 ) = i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 24 — #26 i 24 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE n pn 0 1 2 3 4 5 1,5 1,348399725 1,367376372 1,364957015 1,365264748 1,365225594 Cuadro 1.5: resultados del método de punto fijo. r Luego p5 = 1, 365225594 es una aproximación a la solución de la ecuación x = deseada. 10 con la precisión x+4 ♦ En este punto es necesario presentar condiciones suficientes para garantizar que el método de punto fijo sea convergente. Teorema 4 (Teorema de punto fijo). Sean g : [a, b] → [a, b] una función continua, s ∈ [a, b] tal que g(s) = s y |g 0 (x)| ≤ α < 1, para toda x ∈ (a, b). Sea p0 ∈ [a, b]. Entonces la sucesión {pn }∞ n=0 dada por pn+1 = g(pn ) es tal que pn → s cuando n → ∞. Demostración. Como g(x) es continua en [a, b] y tanto p0 como s se encuentran en [a, b], entonces el teorema del valor medio para derivadas asegura la existencia de ζ tal que: g(ζ) = g(p0 ) − g(s) . p0 − s Tomando el valor absoluto y observando las hipótesis del teorema de punto fijo, |g(ζ)| = g(p0 ) − g(s) ≤ α < 1. p0 − s Al aplicar propiedades del valor absoluto se tiene |g(ζ)| = |g(p0 ) − g(s)| ≤α |p0 − s| |g(p0 ) − g(s)| ≤ α|p0 − s|. Como g(s) = s y g(p0 ) = p1 , al reemplazar se sigue que: |p1 − s| ≤ α|p0 − s|. Lo cual significa que la distancia entre p1 y s es menor que una fracción2 de la distancia entre p0 y s. Se repite el razonamiento, pero empezando con p1 y s, lo cual lleva a: |p2 − s| ≤ α|p1 − s|, luego |p2 − s| ≤ α|p1 − s| ≤ α(α|p0 − s|) = α2 |p0 − s|, 2 Estrictamente no es necesario que sea una fracción, pues se sabe que hay muchos irracionales entre cualquier par de números, en particular entre 0 y 1, que son los valores posibles de α. Para nuestros propósitos se puede mantener la imagen de fracción, para dar la idea que se encoge la distancia entre p0 y s. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 25 — #27 i i 1.4. MÉTODO DE PUNTO FIJO 25 por lo tanto |p2 − s| ≤ α2 |p0 − s|, y continuando el proceso hasta la n-ésima iteración, se tiene: |pn − s| ≤ αn |p0 − s|. Si se toma el límite cuando n tiende a infinito: lı́m |pn − s| ≤ lı́m αn |p0 − s| = |p0 − s| lı́m αn n→∞ n→∞ n→∞ n y como α es un número entre 0 y 1 se tiene que lı́mn→∞ α = 0 y por tanto luego: lı́m |pn − s| = 0, n→∞ lo que significa que siempre que n tienda a infinito, pn tiende a s. Para ilustrar cómo actúa el método de punto fijo y su relación con la ecuación f (x) = 0 se analizará un par de situaciones. Ejemplo 12. Encontar una aproximación con cuatro decimales correctas a una solución de x3 + 4x2 − 10 = 0. Solución: como el método de punto fijo encuentra aproximaciones a la solución de la ecuación x = g(x), lo primero que se debe realizar es convertir el problema f (x) = 0 en un problema x = g(x), para lo cual es suficiente despejar una x: x3 + 4x2 − 10 = 0 x3 + 4x2 = 10 x2 (x + 4) = 10 10 x2 = x+4 r 10 x= x+4 r 10 x+4 cumple las hipótesis del teorema 4 en algún intervalo, se invita al lector a revisar que el intervalo [1, 2] efectivamente es adecuado. Al seleccionar p0 ∈ [1, 2], en este caso p0 = 1, 5, se obtienen los resultados del cuadro 1.5 presentado en el ejemplo 11. ♦ Ahora, una forma de garantizar que el método sea convergente, es verificar que g(x) = Ejemplo 13. Encontrar una aproximación con cuatro decimales correctas a la solución de cos x−x = 0. Solución: repitiendo los pasos del ejemplo anterior, se tiene: 1. Despejar una x. Lo más simple es x = cos x y por tanto g(x) = cos x. 2. Para garantizar que el método de punto fijo sea convergente, se busca el intervalo [a, b] para satisfacer las hipótesis del teorema 4, en este caso [0, 1]. 3. Seleccionar p0 en el intervalo, en este ejemplo p0 = 0. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 26 — #28 i 26 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE i pi |pi − pi−1 | 0 1 2 3 4 5 6 7 .. . 0 1 0,540302306 0,857553216 0,654289790 0,793480359 0,701368774 0,763959683 .. . 1 0,459697694 0,317250910 0,203263425 0,139190568 0,092111585 0,062590909 .. . 26 27 28 0,739071365 0,739094407 0,739078886 3,42066E-05 2,30421E-05 1,55214E-05 Cuadro 1.6: solución de la ecuación x = cos x. 4. Aplicar la iteración pn+1 = g(pn ). En el cuadro 1.6 se incluyen los valores de la sucesión p1 , p2 , p3 , . . . , p28 , y adicionalmente se presenta la medida del error en cada paso. Observación: se debe apreciar que una implementación de método de punto fijo debe contemplar un número máximo de iteraciones, debido a que no todas las fórmulas son convergentes y el programa podría caer en un ciclo infinito intentando alcanzar un cero al cual nunca va a llegar. Además, en caso de convergencia, se deben estimar otros criterios que detengan el programa en el momento de alcanzar la precisión deseada, como es el caso del valor de la función |g(pn )| < 1 , o como el que se presenta en la última columna del cuadro 1.6, es decir |pi+1 − pi | < 2 . ♦ Ejemplo 14. Usando una fórmula de punto fijo, encontrar el valor de un cero de f (x) = x3 − x − 1 preciso hasta la cuarta cifra decimal. Solución: 1. Despejar x, en este caso, x = x3 − 1 y por tanto g(x) = x3 − 1. 2. Encontrar el intervalo donde g(x) cumple las hipótesis del teorema 4. En este caso, [1, 2] es un intervalo tal que g([1, 2]) ⊆ [1, 2] y además existe p ∈ [1, 2] punto fijo de g. 3. Elegir p0 dentro del intervalo. Para este caso tomamos p0 = 0. 4. Aplicamos pn+1 = g(pn ) obteniendo los resultados del cuadro 1.7. En este momento es mejor detener el proceso, puesto que la sucesión no tiende a ningún número en particular. Por el contrario, tiende a ∞, y por tanto la sucesión es divergente. ♦ El ejemplo anterior presenta una de las dificultades del método de punto fijo para aproximar una solución de la ecuación f (x) = 0: la necesidad de transformar f (x) = 0 en un problema del formato x = g(x), donde g(x) cumpla las hipótesis del teorema 4. Lo anterior, en algunas ocasiones exige una búsqueda exhaustiva, requiriendo aplicar otros métodos menos eficientes. Ejercicios 3 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 27 — #29 i 1.4. MÉTODO DE PUNTO FIJO i 27 i pi 0 1 2 3 4 5 6 7 1,5 2,375 12,39648438 1904,002772 6902441413 3,28858E+29 3,55651E+88 4,4986E+265 Cuadro 1.7: solución de la ecuación x = x3 − 1. 1. Solucionar las siguientes ecuaciones utilizando el método de punto fijo con una precisión de ε = 10−8 . a) x − e−x = 0 d) 0.5 sin(e−2x ) − x = 0 b) x + 4e−2x − 4 ln(x) = 0 e) x3 − x − 10 = 0 c) xe−2x + sin(2x + 1) = 0 con −0.5 ≤ x ≤ 0 f ) e−x + ln (x + 8) − x2 = 0 2. Dados los siguientes cuatro esquemas de punto fijo para obtener una solución de la ecuación x3 − 4x2 + 10 = 0, clasificar por la rapidez de convergencia y suponer que p0 = −1.5. r a) pn = −10 pn−1 − 4 c) pn = pn−1 − q 8pn−1 − 10 b) pn = 2 pn−1 − 4pn−1 + 8 3 d) pn = p3n−1 − 4p2n−1 + 10 3p2n−1 − 8pn−1 4p2n−1 − 10 + pn−1 2 3. Utilizar el método de punto fijo y el método de Newton-Raphson para determinar una solución de la ecuación 3e−x − 2x + ln(x) = 0 con una precisión de ε = 10−8 . Comparar la cantidad de iteraciones necesarias por cada método. 4. Utilizar el método de punto fijo y el método de Newton-Raphson para determinar un cero de la función f (x) = x3 − 3x2 e−x + 3xe−2x − e−3x con una precisión de ε = 10−8 . Comparar los e−3x − x2 e−x + xe−2x − x3 resultados. Sugerencia: usar g(x) = . 2e−2x − 2x2 5. Utilizar el método de punto fijo para determinar 1/9 al utilizar únicamente sumas y multiplicaciones. Sugerencia: considerar f (x) = 9x − 1. 6. Si se tiene que el siguiente esquema de punto fijo es convergente, determinar su valor límite: p0 = 0, 8 2pn−1 − 1 pn = 2 pn−1 − 2pn−1 + 2 Sugerencia: considerar g(x) = 2x − 1 . x2 − 2x + 2 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 28 — #30 i 28 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE 7. Considerar la expresión: r x= 1+ q √ 1 + 1 + · · ·. Demostrar con razonamientos de punto fijo, que tiende a la razón áurea φ = 8. Considerar la fracción continua: x= 1 1+ 1 1 1+ 1+··· √ 1+ 5 2 . . Con razonamientos de punto fijo, demostrar que tiende a φ − 1. 1.5. Orden de un método de iteración Cuando se utiliza un método iterativo, como los desarrollados en las secciones anteriores, es útil conocer la “velocidad” con que converge, constituyendo un criterio para determinar la eficiencia de un procedimiento en la solución de un problema particular. La velocidad de un método iterativo no debe entenderse como el tiempo necesario para alcanzar una precisión deseada, en cambio, se refiere a la proporción en que un método converge, representando en algunos casos la cantidad de cifras decimales que se alcanzan en cada iteración. Para entender este concepto y desarrollarlo en algunos casos especiales, es necesario presentar algunas definiciones. Definición 2. Sea {pn }∞ n=0 una sucesión convergente, p el límite de la sucesión, pn 6= p para todo n ∈ N. Si existen λ y α números reales positivos tales que lı́m n→∞ |pn+1 − p| =λ |pn − p|α entonces se dice que {pn }∞ n=0 es una sucesión que converge a p con orden α y constante de error asintótica λ. Ejemplo 15. La sucesión { n1 }∞ n=0 converge a 0 con orden 1. Solución: Para comprobar que la sucesión pn = n1 converge a 0 con orden 1 es necesario demostrar que el límite |pn+1 − p| lı́m n→∞ |pn − p|1 existe y es un número real positivo. En este caso, 1 | n+1 − 0| n |pn+1 − p| = lı́m = lı́m =1 n→∞ |pn − p|1 n→∞ | 1 − 0|1 n→∞ n + 1 n lı́m y por tanto la convergencia de { n1 } es de orden 1. ♦ Si el orden de convergencia de una sucesión es α = 1 entonces se dirá que la sucesión es linealmente convergente, mientras que en el caso α = 2 se habla de convergencia cuadrática. Como se puede esperar, entre más alto sea el orden de un método, éste converge más rápido. Aunque en ocasiones lo anterior no ocurre, es un buen criterio para clasificar los métodos iterativos. En el caso de métodos iterativos del esquema pn = g(pn−1 ), se estudia su orden de convergencia a través de la sucesión {pn }∞ n=0 y se afirma que el método converge a la solución p = g(p) con orden α. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 29 — #31 i 1.5. ORDEN DE UN MÉTODO DE ITERACIÓN i 29 Aunque las sucesiones de convergencia cuadrática alcanzan con mayor rapidez una precisión deseada en comparación con sucesiones de orden lineal, la mayoría de esquemas iterativos tienen una convergencia lineal como se verá a continuación. 1.5.1. Orden de convergencia en el método de punto fijo En esta parte se estudiará el orden de convergencia de los esquemas de punto fijo, y se observará que, en la mayoría de los casos, la convergencia del método es lineal. Teorema 5. Sea g : [a, b] → [a, b] una función continua, g 0 (x) continua en (a, b) y k < 1 constante positiva con |g 0 (x)| ≤ k para todo x ∈ (a, b). Si g 0 (p) 6= 0, para p punto fijo de g en [a, b], entonces para cualquier número p0 en [a, b] la sucesión pn = g(pn−1 ) n≥1 converge linealmente a p. Demostración. Con los resultados de la sección 1.4 se puede comprobar que la sucesión pn = g(pn−1 ) converge a p. Dado que g 0 (x) existe, entonces por el teorema del valor medio, para cada n ≥ 1 existe ξn tal que g(pn ) − g(p) = g 0 (ξn ) pn − p luego pn+1 − p = g(pn ) − g(p) = g 0 (ξn )(pn − p), donde ξn esta entre pn y p. Ahora, como {pn }∞ n=0 0 converge a p, entonces {ξn }∞ n=1 converge a p, y por la continuidad de g (x) se tiene que lı́m g 0 (ξn ) = g 0 (p). n→∞ Por lo tanto |pn+1 − p| = lı́m |g 0 (ξn )| = |g 0 (p)| n→∞ |pn − p| n→∞ lı́m y por hipótesis, g 0 (p) 6= 0, de donde se concluye que {pn }∞ n=0 converge linealmente a p. Aunque el teorema anterior demuestra el comportamiento de los esquemas de punto fijo, existen casos donde la convergencia del método de punto fijo es cuadrática, y para lo anterior, hay que observar lo siguiente: Si p es un punto fijo de g(x) y se conoce g(x), g 0 (x), g 00 (x), . . . en p, entonces se puede expandir g(x) en serie de Taylor alrededor de p: g(x) = g(p) + g 0 (p)(x − p) + g 00 (p) g 000 (p) (x − p)2 + (x − p)3 + · · · 2! 3! Al evaluar la serie en pn , que está “cerca” de p se obtiene g(pn ) = g(p) + g 0 (p)(pn − p) + g 00 (p) g 000 (p) (pn − p)2 + (pn − p)3 + · · · 2! 3! Dado que g(p) = p, ya que es punto fijo, y también que g(pn ) = pn+1 , se desprende que pn+1 = p + g 0 (p)(pn − p) + g 00 (p) g 000 (p) (pn − p)2 + (pn − p)3 + · · · 2! 3! i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 30 — #32 i 30 i CAPÍTULO 1. ECUACIONES DE UNA VARIABLE al pasar p al lado izquierdo pn+1 − p = g 0 (p)(pn − p) + g 00 (p) g 000 (p) (pn − p)2 + (pn − p)3 + · · · 2! 3! lo cual, si se define el error en la enésima iteración como en = pn − p, lleva a en+1 = g 0 (s)(pn − p) + g 00 (p) g 000 (p) (pn − p)2 + (pn − p)3 + · · · 2! 3! (1.2) Si |en | < 1 (nuestro criterio para “cerca” o “buena aproximación”), entonces la magnitud de |e2n | es más pequeña y la de |e3n | aun más pequeña y así sucesivamente. En estas circunstancias, si g 0 (p) 6= 0, entonces el primer término domina el error y por lo tanto en+1 ≈ en y el método es de orden 1. Si g 0 (p) = 0 y g 00 (p) 6= 0, el segundo término de la serie 1.2 es el que domina el error y por lo tanto en+1 ≈ e2n y el método es de orden 2. Ahora, si g 0 (p) = g 00 (p) = 0 y g 000 (p) 6= 0, entonces es el tercer término el que domina y el método sería de tercer orden, puesto que en+1 ≈ e3n . 1.5.2. Orden del método de Newton-Raphson Para f (x) una función continua, con f (c) = 0 para c ∈ R y f 0 (c) 6= 0, si se aplica el método de Newton-Raphson para aproximar c, se tiene que ( p0 n) pn+1 = pn − ff0(p si n ≥ 0 (pn ) Si se observa de manera detallada el método de Newton-Raphson, se puede determinar que su forma corresponde a un esquema de punto fijo, donde g(x) = x − ff0(x) (x) . Entonces se podría asegurar que la convergencia es lineal, pero (f 0 (x))2 − f (x)f 00 (x) g 0 (x) = 1 − (f 0 (x))2 cuyo valor en la raíz c de f (x), que es el punto fijo de g(x), es: g 0 (c) = 1 − (f 0 (c))2 − f (c)f 00 (c) f (c)f 00 (c) = =0 (f 0 (c))2 (f 0 (c))2 Luego el método parece ser de orden 2, pero todavía no es posible asegurar lo anterior hasta verificar el valor de la segunda derivada: g 00 (x) = (f 0 (x)f 00 (x) + f (x)f 000 (x))(f 0 (x))2 − 2f (x)f 00 (x)f 0 (x)f 00 (x) (f 0 (x))4 al evaluar en c se desprende que g 00 (c) = (f 0 (c)f 00 (c) + f (c)f 000 (c))(f 0 (c))2 − 2f (c)f 00 (c)f 0 (c)f 00 (c) f 00 (c) = (f 0 (c))4 f 0 (c) de donde si f 00 (c) 6= 0, entonces g 00 (c) 6= 0 y el método de Newton-Raphson sería de segundo orden. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 31 — #33 i 1.5. ORDEN DE UN MÉTODO DE ITERACIÓN i 31 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 32 — #34 i i i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 33 — #35 i i Capítulo 2 Interpolación El problema de interpolar aparece con mucha frecuencia en el trabajo de ciencias e ingeniería, donde los experimentos arrojan datos numéricos y a su vez estos datos se puede representar en tablas o en forma gráfica. Para analizar el comportamiento del sistema no basta con observar los datos obtenidos en el experimento (figura 2.1), y en cambio se debe intentar “ajustar” o aproximar una curva (función), que permita predecir valores al interior del rango, es decir, en puntos para los cuales no se dispone de información, y a su vez sirva como modelo del comportamiento del sistema. b b b b b x0 x2 . . . xn−1 xn x1 Figura 2.1: problema de interpolación. Se puede ajustar funciones (de interpolación) a una lista de datos siguiendo dos criterios: ajuste exacto y ajuste por mínimos cuadrados (figura 2.2). Decidir cuál tipo de ajuste se utiliza depende de las necesidades de la investigación, origen de los datos y posibilidades computacionales. b b b b b b b b b b Figura 2.2: tipos de interpolación: ajuste exacto (izquierda) y ajuste por mínimos cuadrados (derecha). 33 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 34 — #36 i 34 i CAPÍTULO 2. INTERPOLACIÓN 2.1. Ajuste exacto Una de las técnicas de interpolación (exacta) para un conjunto de datos (x0 , y0 ), (x1 , y1 ), (x2 , y2 ),· · · , (xn , yn ) es la interpolación polinomial, donde se busca un polinomio p(x) = a0 + a1 x + a2 x2 + · · · + an xn de menor grado posible que contenga a todos los datos conocidos, es decir, p(xi ) = yi para todo i = 0, 1, . . . , n. Por ejemplo, para los datos (1, −1), (2, −4) y (3, −9) el interpolador polinomial es p(x) = −x2 dado que no existe un polinomio de menor grado que contenga a estos puntos. A continuación se presentarán dos métodos para construir un polinomio de interpolación. 2.1.1. Polinomio de interpolación de Lagrange Suponer que se tienen n + 1 puntos (x0 , y0 ), (x1 , y1 ), (x2 , y2 ), ..., (xn , yn ) con xi 6= xj , siempre que i 6= j. Para construir un polinomio de interpolación, se puede realizar lo siguiente: Determinar un polinomio `0 (x) que pase por (x0 , y0 ) y que se anule en x1 , x2 , ..., xn , es decir, ( 1 si j = 0 `0 (xj ) = , para j = 0, 1, 2, · · · , n. 0 si j 6= 0 ¿Cómo construir `0 (x)?. La primera opción es: P̃0 (x) = (x − x1 )(x − x2 )(x − x3 ) · · · (x − xn ) Notar que si se evalúa en x1 , P̃0 (x1 ) = (x1 − x1 )(x1 − x2 )(x1 − x3 ) · · · (x1 − xn ) = 0, que se anula porque el primer factor es cero. Ahora, al evaluar en x2 : P̃0 (x2 ) = (x2 − x1 )(x2 − x2 )(x2 − x3 ) · · · (x2 − xn ) = 0, lo cual también se anula, dado que el segundo factor es cero. Similarmente, el polinomio se anula en x3 , x4 , · · · , xn . Ahora, ¿cuánto vale este polinomio en x0 ? P̃0 (x0 ) = (x0 − x1 )(x0 − x2 )(x0 − x3 ) · · · (x0 − xn ) 6= 0, Aunque es posible concluir que el valor es no nulo, no es posible asegurar que su valor sea 1. Como un segundo intento se tiene: P̃0 (x) = (x − x1 )(x − x2 )(x − x3 ) · · · (x − xn ) . (x0 − x1 )(x0 − x2 )(x0 − x3 ) · · · (x0 − xn ) Notar que este nuevo polinomio se anula en x1 , en x2 ,· · · , en xn , por la misma razón que P̃0 (xj ) y cuando se evalúa en en x0 se obtiene: P̃0 (x0 ) = (x0 − x1 )(x0 − x2 )(x0 − x3 ) · · · (x0 − xn ) = 1, (x0 − x1 )(x0 − x2 )(x0 − x3 ) · · · (x0 − xn ) con lo cual P̃0 (x) es el polinomio `0 (x) que se deseaba construir. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 35 — #37 i 2.1. AJUSTE EXACTO i 35 El comportamiento de este polinomio en los xi es muy particular y por esto tiene un nombre especial, es uno de los llamados polinomios de Lagrange definido como: `0 (x) = (x − x1 )(x − x2 )(x − x3 ) · · · (x − xn ) , (x0 − x1 )(x0 − x2 )(x0 − x3 ) · · · (x0 − xn ) y se comporta de la siguiente manera: ( 1 si j = 0 `0 (xj ) = , 0 si j = 6 0 para j = 0, 1, 2, · · · , n. Notar que este polinomio tiene n factores lineales en el numerador, y por tanto `0 (x) es de grado n. También, por comodidad, se puede expresar en la siguiente forma: `0 (x) = n Y (x − xj ) (x0 − xj ) j=0 j6=0 Si a partir de `0 (x) se define P0 (x) = y0 `0 (x) entonces: ( y0 si x = x0 P0 (x) = 0 si x = xj , j = 1, 2, 3, . . . , n De igual forma se construye P1 (x): P1 (x) = y1 `1 (x) = y1 n Y (x − xj ) , (x1 − xj ) j=0 j6=1 P1 (x) = y1 (x − x0 )(x − x2 )(x − x3 ) · · · (x − xn ) (x1 − x0 )(x1 − x2 )(x1 − x3 ) · · · (x1 − xn ) el cual se comporta como: ( y1 P1 (x) = 0 si x = x1 si x = xj , j = 0, 2, 3, . . . , n Siguiendo este proceso se construyen P2 , P3 ,· · · , Pn donde para cada i = 0, 1, 2, . . . , n el polinomio Pi (x) satisface: ( yi si j = i Pi (xj ) = , para j = 0, 1, 2, · · · , n. 0 si j 6= i Se concluye que el polinomio que interpola todos los n + 1 puntos es la suma de los Pi , con lo cual se tiene la construcción del polinomio de interpolación de Lagrange: Pn (x) = P0 (x) + P1 (x) + · · · + Pn (x) = y0 `0 (x) + y1 `1 (x) + · · · + yn `n (x). En notación de sumatoria: Pn (x) = n X i=0 yi `i (x) = n X i=0 yi n Y (x − xj ) . (x i − xj ) j=0 j6=i El grado de Pn (x) es n o menor, debido a que cada término es de a lo más grado n. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 36 — #38 i 36 i CAPÍTULO 2. INTERPOLACIÓN Ejemplo 16. Encontrar el polinomio de interpolación de Lagrange que ajusta los datos (−1, 2), (0, −1), (1, 1) y (2, −2). Solución: se puede verificar fácilmente que xi = 6 xj si i 6= j. Nombrando a (−1, 2) como (x0 , y0 ), (0, −1) como (x1 , y1 ) y así sucesivamente, se construyen los polinomios de Lagrange como sigue. Primer polinomio: `0 (x) = (x − x1 )(x − x2 )(x − x3 ) (x − 0)(x − 1)(x − 2) = , (x0 − x1 )(x0 − x2 )(x0 − x3 ) (−1 − 0)(−1 − 1)(−1 − 2) Operando y simplificando: `0 (x) = x(x − 1)(x − 2) . −6 Segundo polinomio: `1 (x) = (x + 1)(x − 1)(x − 2) (x − x0 )(x − x2 )(x − x3 ) = , (x1 − x0 )(x1 − x2 )(x1 − x3 ) (0 + 1)(0 − 1)(0 − 2) Operando y simplificando: `1 (x) = (x2 − 1)(x − 2) . 2 Tercer polinomio: `2 (x) = (x − x0 )(x − x1 )(x − x3 ) (x + 1)(x − 0)(x − 2) = , (x2 − x0 )(x2 − x1 )(x2 − x3 ) (1 + 1)(1 − 0)(1 − 2) Operando y simplificando: `2 (x) = x(x + 1)(x − 2) . −2 Cuarto polinomio: `3 (x) = (x − x0 )(x − x1 )(x − x2 ) (x + 1)(x − 0)(x − 1) = , (x3 − x0 )(x3 − x1 )(x3 − x2 ) (2 + 1)(2 − 0)(2 − 1) Operando y simplificando: `3 (x) = x(x2 − 1) . 6 Una vez calculados todos los polinomios de Lagrange, se procede a ensamblar el polinomio de interpolación de Lagrange con la ecuación P (x) = y0 `0 (x) + y1 `1 (x) + y2 `2 (x) + y3 `3 (x). Al reemplazar los correspondientes valores se obtiene: P (x) = 2 × x(x − 1)(x − 2) (x2 − 1)(x − 2) x(x + 1)(x − 2) x(x2 − 1) + (−1) × +1× + (−2) × , −6 2 −2 6 de donde, al simplificar se obtiene finalmente: P (x) = − x(x − 1)(x − 2) (x2 − 1)(x − 2) x(x + 1)(x − 2) x(x2 − 1) − − − . 3 2 2 3 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 37 — #39 i 2.1. AJUSTE EXACTO i 37 A primera vista parece un polinomio de grado 3, pero si se expanden los productos y se suman términos semejantes, podría ocurrir que el coeficiente del término cúbico sea cero. Sin embargo, existe una forma conveniente de saber el coeficiente del término cúbico de este ejemplo. Basta con sumar los coeficientes de cada uno de los cuatro términos del polinomio de interpolación, es decir: 1 1 1 1 5 − − − − =− , 3 2 2 3 3 de donde es ahora posible asegurar que se trata de un polinomio cúbico. ♦ Nota: este procedimiento también se puede aplicar al caso general, es decir, cuando se calcula el polinomio de Lagrange de una lista de n + 1 puntos. En este caso, el polinomio de interpolación tiene n + 1 términos cada uno con n factores lineales. Al sumar los coeficientes de estos términos, se calcula el coeficiente del término de grado n. Ejercicios 4 1. Construir el interpolador de Lagrange para aproximar f (0) si f (−2) = −1, f (−1) = 0, f (1) = 2, f (2) = 3. 2. Construir el interpolador de Lagrange para aproximar f (8.4) si f (8.0) = 1.25, f (8.2) = 1.76, f (8.3) = 1.46, f (8.5) = 1.75. 3. Si f (x) = cos−1 (x), x0 = 0, x1 = 0.5, x2 = 0.8 y x3 = 1, utilizar el interpolador de Lagrange para aproximar f (0.65) y comparar con el valor real. √ 4. Utilizar un interpolador de Lagrange para obtener una aproximación de 7 con la función f (x) = 7x y los nodos x0 = −2, x1 = −1, x2 = 0, x3 = 1, x4 = 2. 5. Dados los siguientes datos: xi yi 0.5 0.8 1.2 1.4 1.6 1.8 2.0 -0.69314 -0.22314 0.18232 0.33647 0.47000 0.58778 0.69314 Utilizar el interpolador de Lagrange para estimar la imagen de 2.71828 y 1. 6. Sea P (x) el polinomio de Lagrange que interpola los nodos (x0 , y0 ), (x1 , y1 ); Q(x) el polinomio de Lagrange que interpola los nodos (x2 , y2 ) y (x3 , y3 ). Construir un interpolador, basado en P (x) y Q(x), para (x0 , y0 ), (x1 , y1 ), (x2 , y2 ) y (x3 , y3 ) asumiendo que xi 6= xj para todo i 6= j. 7. Determinar el coeficiente de x3 en el polinomio de interpolación de Lagrange, de los datos (1, 1), (2, 2), (3, 3), (4, 5) 8. Determinar la cantidad de divisiones y multiplicaciones necesarias para construir el polinomio de interpolación de Lagrange de 3 puntos. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 38 — #40 i 38 i CAPÍTULO 2. INTERPOLACIÓN 9. ¿Qué sucede en el proceso de construcción del polinomio de Lagrange, si para un conjunto de datos (x0 , y0 ), (x1 , y1 ), . . . (xn , yn ) se tiene que xi = xj para algún i 6= j? 10. Determinar el polinomio de interpolación de la función f (x) = x3 − 1 en los nodos x0 = 0, x1 = 1, x2 = 2, x3 = −1. 2.1.2. Polinomio de interpolación de Newton El polinomio de interpolación de Lagrange puede presentar los siguientes inconvenientes: 1. Si el número de puntos a interpolar es grande, el grado del polinomio resultante puede ser alto y presentar fuertes oscilaciones. 2. Agregar o quitar un punto, implica hacer de nuevo todo el cálculo. En la propuesta de Newton, primero se hace pasar un polinomio de grado cero por uno de los puntos, y desde este, se construye un polinomio de grado uno que pasa por otro punto de la lista, y desde estos dos últimos puntos, se construye un polinomio de grado 2 que pasa por un tercer punto de la lista y así sucesivamente. De esta manera, se respeta el trabajo anterior, y no se tienen dificultades para agregar puntos a la lista. A continuación se describe el proceso en forma detallada para los tres primeros puntos. En la figura 2.3 se grafican algunos puntos de la lista. y y0 b y2 y1 y3 b b b x0 x1 x2 x3 Figura 2.3: polinomio de interpolación de Newton. El polinomio P0 (x) se construye de manera que pase exactamente por el punto (x0 , y0 ), de donde la propuesta más simple es P (x) = P0 (x) = y0 , cuya gráfica se presenta en la figura 2.4. Ahora se construye un nuevo polinomio que pase por (x1 , y1 ), pero que “parta” de P0 (x). Este nuevo polinomio de grado 1 tiene la forma P1 (x) = P0 (x) + c1 (x − x0 ). Notar que este nuevo polinomio pasa por (x0 , y0 ) (lo asegura el factor lineal) y se quiere también pase por (x1 , y1 ), de donde se debe ajustar el valor de la constante c1 . Como P1 (x) debe interpolar a (x1 , y1 ), al evaluar en x1 debe dar como resultado y1 y por tanto: P1 (x1 ) = y0 + c1 (x1 − x0 ) = y1 . Al despejar c1 se obtiene: c1 = y1 − y0 , x1 − x0 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 39 — #41 i 2.1. AJUSTE EXACTO i 39 y y0 b y2 y1 y3 b b b x0 x1 x2 x3 Figura 2.4: polinomio de interpolación de Newton. expresión conocida como diferencia dividida de orden 1, y denotada como: y1 − y0 . f [x0 , x1 ] = x1 − x0 Para unificar la notación, se llama a y0 = f [x0 ] como diferencia dividida de orden cero, y el polinomio de interpolación en esta notación sería: P1 (x) = f [x0 ] + f [x0 , x1 ](x − x0 ). Notar que se utilizó el trabajo hecho con el primer punto. En esta situación, la gráfica se presenta en la figura 2.5. De igual forma, se construye un polinomio que capture otro punto más, es decir, que pase y y0 b y2 y1 y3 b b b x0 x1 x2 x3 Figura 2.5: polinomio de interpolación de Newton. por (x0 , y0 ), por (x1 , y1 ) y por (x2 , y2 ), sin perder el trabajo que se ha hecho hasta el momento. Dado P2 (x) = f [x0 ] + f [x0 , x1 ](x − x0 ) + c2 (x − x0 )(x − x1 ), notar que al evaluar en x0 , los dos últimos términos se anulan, quedando solamente P0 (x), cuyo valor es y0 . Igualmente, al evaluar en x1 , el último término se anula, quedando el polinomio P1 (x) ya calculado, cuyo valor es y1 cuando se evalúa en x1 . Para encontrar el coeficiente c2 , se debe tener en cuenta que, evaluar P2 (x) en x2 resulte en y2 . Al hacer lo anterior, se obtiene: P2 (x2 ) = f [x0 ] + f [x0 , x1 ](x2 − x0 ) + c2 (x2 − x0 )(x − x1 ) = y2 . Al despejar y ordenar adecuadamente: y2 −y1 0 − xy11 −y −x0 c2 = x2 −x1 . x2 − x0 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 40 — #42 i 40 i CAPÍTULO 2. INTERPOLACIÓN Notar que en el numerador hay diferencias divididas de orden 1 y escribiendo en notación de diferencias, se concluye: f [x1 , x2 ] − f [x0 , x1 ] c2 = f [x0 , x1 , x2 ] = , x2 − x0 expresión llamada diferencia divida de orden 2. El polinomio de interpolación en notación de diferencias divididas quedaría: P2 (x) = f [x0 ] + f [x0 , x1 ](x − x0 ) + f [x0 , x1 , x2 ](x − x0 )(x − x1 ). La gráfica de este nuevo resultado se presenta en la figura 2.6. y y0 b y2 y1 y3 b b b x0 x1 x2 x3 Figura 2.6: polinomio de interpolación de Newton. Similar al procedimiento anterior, se puede inducir la forma para el polinomio de grado 3 que interpola cuatro puntos: P3 (x) = f [x0 ]+f [x0 , x1 ](x−x0 )+f [x0 , x1 , x2 ](x−x0 )(x−x1 )+f [x0 , x1 , x2 , x3 ](x−x0 )(x−x1 )(x−x2 ), donde: f [x0 , x1 , x2 , x3 ] = f [x1 , x2 , x3 ] − f [x0 , x1 , x2 ] , x3 − x0 expandiendo las diferencias dividas de orden 2 f [x0 , x1 , x2 , x3 ] = f [x2 ,x3 ]−f [x1 ,x2 ] x3 −x1 − f [x1 ,x2 ]−f [x0 ,x1 ] x2 −x0 x3 − x0 , y expandiendo las de diferencias de primer orden, finalmente el coeficiente c2 se reduce a: y3 −y2 x3 −x2 f [x0 , x1 , x2 , x3 ] = y −y − x2 −x1 2 1 x3 −x1 − y2 −y1 x2 −x1 y −y − x1 −x0 1 0 x2 −x0 x3 − x0 . En la figura 2.7 se ilustra el comportamiento del polinomio resultante. Nota: en este instante, puede existir la sensación que el cálculo de los coeficientes ci es una tarea dispendiosa y susceptible de errores, pero si los datos se organizan en una tabla, el cálculo de estos coeficientes es relativamente rápido. Para ver lo anterior, se presenta el siguiente ejemplo. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 41 — #43 i i 2.1. AJUSTE EXACTO 41 y y0 b y2 y1 y3 b b b x0 x1 x2 x3 Figura 2.7: polinomio de interpolación de Newton. i xi yi 0 1 2 3 -1 0 1 2 2 -1 1 -2 Ejemplo 17. Encontrar el polinomio de interpolación de Newton que ajusta los datos (−1, 2), (0, −1), (1, 1) y (2, −2). Solución: al organizar los puntos en una tabla se obtiene: Ahora, se deben calcular las diferencias divididas de orden 0, 1, 2 y 3. Las diferencias de orden cero f [xi ], corresponden a la columna yi , de donde: i xi ∆0 0 1 2 3 -1 0 1 2 2 -1 1 -2 Para determinar las diferencias de orden uno, ∆1 , se debe calcular f [xi−1 , xi ] = i = 1, 2, 3: i xi ∆0 ∆1 0 1 2 3 -1 0 1 2 2 -1 1 -2 f [x0 , x1 ] f [x1 , x2 ] f [x2 , x3 ] f [xi ]−f [xi−1 ] xi −xi−1 para Calculando cada f [xi−1 , xi ] y recordando que f [xj ] corresponde a yj , se obtiene: i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 42 — #44 i 42 i CAPÍTULO 2. INTERPOLACIÓN i xi ∆0 0 1 2 3 -1 0 1 2 2 -1 1 -2 ∆1 f [x0 , x1 ] = f [x1 , x2 ] = f [x2 , x3 ] = y1 −y0 x1 −x0 y2 −y1 x2 −x1 y3 −y2 x3 −x2 Tomando los valores correspondientes, se concluye: i xi ∆0 0 1 -1 0 2 -1 2 3 1 2 1 -2 ∆1 −1−2 0−(−1) = −3 1−(−1) 1−0 = 2 −2−1 2−1 = −3 Ahora, se agrega una columna con las diferencias de orden dos, ∆2 , que contiene los valores f [xi−2 , xi−1 , xi ] para i = 2, 3. Como f [xi−2 , xi−1 , xi ] = i xi ∆0 ∆1 ∆2 0 1 2 3 -1 0 1 2 2 -1 1 -2 -3 2 -3 f [x0 , x1 , x2 ] f [x1 , x2 , x3 ] f [xi−1 ,xi ]−f [xi−2 ,xi−1 ] : xi −xi−2 i xi ∆0 ∆1 0 1 2 3 -1 0 1 2 2 -1 1 -2 -3 2 -3 ∆2 f [x0 , x1 , x2 ] = f [x1 , x2 , x3 ] = f [x1 ,x2 ]−f [x0 ,x1 ] x2 −x0 f [x2 ,x3 ]−f [x1 ,x2 ] x3 −x1 Dado que f [xi−1 , xi ] está ubicado en la columna ∆1 , entonces: i xi ∆0 ∆1 0 1 2 -1 0 1 2 -1 1 -3 2 3 2 -2 -3 ∆2 f [x1 ,x2 ]−f [x0 ,x1 ] x2 −x0 f [x2 ,x3 ]−f [x1 ,x2 ] x3 −x1 = = 2−(−3) 5 1−(−1) = 2 −3−2 −5 2−0 = 2 Por último, se construye la columna ∆3 , que contiene a f [x0 , x1 , x2 , x3 ] = f [x1 ,x2 ,x3 ]−f [x0 ,x1 ,x2 ] x3 −x0 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 43 — #45 i 2.1. AJUSTE EXACTO i 43 i xi ∆0 ∆1 ∆2 0 1 2 3 -1 0 1 2 2 -1 1 -2 -3 2 -3 5 2 −5 2 ∆3 f [x1 ,x2 ,x3 ]−f [x0 ,x1 ,x2 ] x3 −x0 f [x0 , x1 , x2 , x3 ] = Como f [x1 , x2 , x3 ] y f [x0 , x1 , x2 ] están en la columna ∆2 , se determina que i xi yi ∆1 ∆2 0 1 2 3 -1 0 1 2 2 -1 1 -2 -3 2 -3 5/2 -5/2 ∆3 f [x1 ,x2 ,x3 ]−f [x1 ,x2 ,x3 ] x3 −x0 = −5 3 Una vez calculadas todas las diferencias divididas, se procede a escribir el polinomio de interpolación: P (x) = f [x0 ]+f [x0 , x1 ](x−x0 )+f [x0 , x1 , x2 ](x−x0 )(x−x1 )+f [x0 , x1 , x2 , x3 ](x−x0 )(x−x1 )(x−x2 ). Notar que los valores f [x0 ], f [x0 , x1 ], f [x0 , x1 , x2 ], f [x0 , x1 , x2 , x3 ] corresponden a la diagonal de la tabla de diferencias divividas. Por lo tanto, al reemplazar los correspondientes valores de la diagonal, se concluye que P (x) = 2 − 3(x + 1) + 52 (x + 1)x − 53 (x + 1)x(x − 1). La correspondiente gráfica se presenta en figura 2.8. ♦ b b b b Figura 2.8: Polinomio de Newton para los datos (−1, 2), (0, −1), (1, 1) y (2, −2). Cuando se tienen n + 1 puntos, el polinomio se puede escribir: P (x) = f [x0 ]+f [x0 , x1 ](x−x0 )+f [x0 , x1 , x2 ](x−x0 )(x−x1 )+f [x0 , x1 , x2 , x3 ](x−x0 )(x−x1 )(x−x2 )+· · · · · · + f [x0 , . . . , xn ](x − x0 ) · · · (x − xn−1 ). Notar que el último término tiene n factores lineales, de donde el polinomio de interpolación es de a lo más grado n. Una conexión entre el polinomio de interpolación de Lagrange y el polinomio de Newton se establece en el siguiente teorema. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 44 — #46 i 44 i CAPÍTULO 2. INTERPOLACIÓN Teorema 6 (Teorema de interpolación). Dados n + 1 puntos (x0 , y0 ), (x1 , y1 ), (x2 , y2 ), · · · , (xn , yn ) con xi = 6 xj , siempre que i 6= j. Si p(x) es un polinomio de grado menor o igual a n, tal que p(xi ) = yi para todo i = 0, 1, . . . , n entonces p(x) es único. Demostración. Para la prueba de unicidad se supone que existen dos polinomios de grado n o menor p y q diferentes que interpolan los n + 1 puntos, es decir: p(x0 ) = y0 , al igual q(x0 ) = y0 . p(x1 ) = y1 , al igual q(x1 ) = y1 . p(x2 ) = y2 , al igual q(x2 ) = y2 , así sucesivamente hasta: p(xn ) = yn , al igual q(xn ) = yn . Ahora se construye el polinomio r(x) como r(x) = p(x) − q(x). Al evaluar el nuevo polinomio en x0 , x1 , ..., xn se obtiene: r(x0 ) = p(x0 ) − q(x0 ) = y0 − y0 = 0 r(x1 ) = p(x1 ) − q(x1 ) = y1 − y1 = 0 r(x2 ) = p(x2 ) − q(x2 ) = y2 − y2 = 0 n + 1 raíces .. . r(xn ) = p(xn ) − q(xn ) = yn − yn = 0 Observar que al sumar dos polinomios de grado n (como p y q), se espera un nuevo polinomio de grado n o menor. Por otro lado, un polinomio de grado n tiene a lo más n raíces reales. En estas circunstancias, la situación presente solo es posible si r es el polinomio cero, lo que lleva a: r(x) = 0 = p(x) − q(x), y por lo tanto se concluye que p(x) = q(x), demostrando así la unicidad del polinomio de interpolación. Nota: los polinomios de interpolación de Lagrange y de Newton son iguales. La diferencia radica en la construcción. Si para los puntos (x0 , y0 ), (x1 , y1 ), (x2 , y2 ), · · · , (xn , yn ) se construyeran los polinomios de interpolación de Lagrange y Newton y cada uno se simplificara totalmente, entonces se observaría el mismo polinomio. Ejercicios 5 1. Construir el interpolador de Newton para aproximar f (8.4) si f (8.0) = 1.25, f (8.2) = 1.76, f (8.3) = 1.46, f (8.5) = 1.75. 2. Si f (x) = cos−1 (x), x0 = 0, x1 = 0.5, x2 = 0.8, x3 = 1 utilizar el interpolador de Newton para aproximar f (0.65) y comparar con el valor real. 3. Construir el interpolador de Newton en los puntos (− π2 , sin(− π2 )), ( π6 , sin( π6 )), ( π4 , sin( π4 )), ( π2 , sin( π2 )) y estimar la imagen de x = 0. √ 4. Utilizar un interpolador de Newton para obtener una aproximación de 7 con la función f (x) = 7x y los nodos x0 = −2, x1 = −1, x2 = 0, x3 = 1 y x4 = 2. 5. Si el polinomio de interpolación de Newton para los datos (1, y0 ), (2, y1 ), (3, y2 ), (4, y3 ) es p(x) = −1 + 1(x − 1) − 1(x − 1)(x − 2) + 23 (x − 1)(x − 2)(x − 3), determinar el polinomio de interpolación para los datos (1, y0 ), (2, y1 ), (3, y2 ), (4, y3 ) y (5, 1). i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 45 — #47 i 2.1. AJUSTE EXACTO i 45 6. Construir el interpolador de Newton de un conjunto de datos, si se conoce que la tabla de diferencias divididas es: x y ∆1 ∆2 ∆3 -1 2 1 -2 4 ? ? ? 1 ? ? -2 ? -3 7. Completar la siguiente tabla de diferencias divididas: x y ∆1 ∆2 -1 2 ? -2 ? 4 2 -1 1 ? 1 ? 1 4 ∆3 ? 8. ¿Es correcto afirmar que, al intercambiar el orden de los datos, entonces el interpolador de Newton es diferente? 9. Calcular la cantidad total de multiplicaciones y divisiones necesarias para construir el interpolador de Newton sobre un conjunto de tres datos. 10. Si P (x) es el interpolador de Newton de un conjunto de datos, Q(x) el interpolador de Lagrange sobre el mismo conjunto de datos entonces, ¿cuál es el valor de P (z) − Q(z), con z un valor en el rango de los datos? 2.1.3. Trazadores cúbicos (Cubic Splines) Un posible problema que pueden presentar los polinomios de interpolación de Lagrange y Newton es que cuando tienen que interpolar muchos puntos el grado del polinomio puede ser alto, y adicionalmente se presenten fuertes oscilaciones en puntos muy cercanos. Una solución es ordenar los puntos, y en cada subintervalo [xi , xi+1 ], usar un polinomio de grado lo más bajo posible. La opción más inmediata es hacer uso de polinomios de grado cero (trazadores de grado cero o splines de grado cero), pero lo anterior no es aceptable si se desea captar el contorno de una figura o describir una función continua. La siguiente opción es polinomios de grado uno en cada subintervalo, lo que garantiza continuidad de la función de spline. Aunque esta opción no es mala, el hecho que la primera derivada de la curva no sea continua, impide describir eventos físicos que requieren continuidad hasta la segunda derivada, como es el caso en la descripción del movimiento de un automóvil, donde la función aceleración es continua, es decir, el auto no cambia de un valor de aceleración a otro sin pasar por estados intermedios. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 46 — #48 i 46 i CAPÍTULO 2. INTERPOLACIÓN 2.1.4. Trazadores cúbicos Dada una lista ordenada de n + 1 puntos que cumplen las hipótesis de interpolación1 , se desea construir una función a trozos s0 (x) ∀x ∈ [x0 , x1 ] s (x) ∀x ∈ [x1 , x2 ] 1 ∀x ∈ [x2 , x3 ] S(x) = s2 (x) (2.1) . .. sn−1 (x) ∀x ∈ [xn−1 , xn ] donde los si (x) son polinomios cúbicos y satisfacen las siguientes condiciones: 1. Condición de interpolación: cada polinomio interpola dos puntos, es decir si (xi ) = yi , y también si (xi+1 ) = yi+1 . Como son n polinomios, entonces esta condición ofrece 2n ecuaciones. Notar que está implícito que si−1 (xi ) = si (xi ) = yi , asegurando la continuidad del trazador. 2. Condición de la primera derivada: en los puntos internos (n − 1) debemos asegurar que los polinomios que se encuentran, lleven la misma dirección, es decir que cumpla: s0i−1 (xi ) = s0i (xi ). Esta condición provee n − 1 ecuaciones. 3. Condición de la segunda derivada: también para nodos internos (n − 1) es conveniente asegurar que los polinomios que se encuentren tengan la misma concavidad en los nodos, es decir s00i−1 (xi ) = s00i (xi ). Esta condición, al igual que la anterior, provee n − 1 ecuaciones. Sumando el número de ecuaciones obtenidas de las condiciones mencionadas con anterioridad, se obtiene: + total 2n n−1 n−1 4n − 2 condición de interpolación condición de dirección condición de concavidad ecuaciones Como cada polinomio si (x) es de la forma ai + bi x + ci x2 + di x3 , entonces es necesario calcular 4n coeficientes para construir el trazador S(x), pero se disponen de 4n − 2 ecuaciones, y por tanto faltan dos condiciones que ayuden a equilibrar el sistema. Más adelante se indicará una solución a esta situación. Luego de establecer la forma y condiciones que debe satisfacer el trazador cúbico, el paso siguiente es realizar su construcción. Construcción Para facilitar la construcción del trazador cúbico, se seleccionan polinomios cúbicos si (x) de la forma ai + bi (x − xi ) + ci (x − xi )2 + di (x − xi )3 , con lo cual: 1 Es decir, xi 6= xj siempre que i 6= j. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 47 — #49 i i 2.1. AJUSTE EXACTO 47 s0 (x) = a0 + b0 (x − x0 ) + c0 (x − x0 )2 + d0 (x − x0 )3 s (x) = a1 + b1 (x − x1 ) + c1 (x − x1 )2 + d1 (x − x1 )3 1 2 3 S(x) = s2 (x) = a2 + b2 (x − x2 ) + c2 (x − x2 ) + d2 (x − x2 ) ... sn−1 (x) = an−1 + bn−1 (x − xn−1 ) + cn−1 (x − xn−1 )2 + dn−1 (x − xn−1 )3 ∀x ∈ [x0 , x1 ] ∀x ∈ [x1 , x2 ] ∀x ∈ [x2 , x3 ] ∀x ∈ [xn−1 , xn ] Ahora, aplicando la condición de interpolación en cada polinomio, se obtiene: si (xi ) = ai + bi (xi − xi ) + ci (xi − xi )2 + di (xi − xi )3 = yi si (xi+1 ) = ai + bi (xi+1 − xi ) + ci (xi+1 − xi )2 + di (xi+1 − xi )3 = yi+1 De la primera ecuación se concluye que ai = yi para todo i = 0, 1, 2, . . . , n−1, y si se define hi = xi+1 −xi y se sustituye en la segunda ecuación, se obtiene la relación: ai + bi hi + ci h2i + di h3i = yi+1 Para aplicar la condición de la primera derivada, se debe determinar S 0 (x), que en este caso corresponde a: 0 2 ∀x ∈ [x0 , x1 ] s0 (x) = b0 + 2c0 (x − x0 ) + 3d0 (x − x0 ) 0 2 s1 (x) = b1 + 2c1 (x − x1 ) + 3d1 (x − x1 ) ∀x ∈ [x1 , x2 ] 0 2 0 s (x) = b + 2c (x − x ) + 3d (x − x ) ∀x ∈ [x2 , x3 ] 2 2 2 2 2 S (x) = 2 . .. 0 sn−1 (x) = bn−1 + 2cn−1 (x − xn−1 ) + 3dn−1 (x − xn−1 )2 ∀x ∈ [xn−1 , xn ] por lo tanto, si s0i+1 (xi+1 ) = s0i (xi+1 ) para i = 0, 2, . . . , n − 2 entonces: bi+1 + 2ci+1 (xi+1 − xi+1 ) + 3di+1 (xi+1 − xi+1 )2 = bi + 2ci (xi+1 − xi ) + 3di (xi+1 − xi )2 Al simplificar y sustituir xi+1 − xi por hi se concluye que: bi+1 = bi + 2ci hi + 3di h2i Para la condición de la segunda derivada, se debe calcular S 00 (x): 00 s0 (x) = 2c0 + 6d0 (x − x0 ) s00 (x) = 2c1 + 6d1 (x − x1 ) 1 00 S 00 (x) = s2 (x) = 2c2 + 6d2 (x − x2 ) . .. 0 sn−1 (x) = 2cn−1 (x − xn−1 ) + 6dn−1 (x − xn−1 ) ∀x ∈ [x0 , x1 ] ∀x ∈ [x1 , x2 ] ∀x ∈ [x2 , x3 ] ∀x ∈ [xn−1 , xn ] si s00i+1 (xi+1 ) = s00i (xi+1 ) para i = 0, 2, . . . , n − 2 entonces ci+1 = ci + 3di hi i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 48 — #50 i 48 i CAPÍTULO 2. INTERPOLACIÓN En resumen, para que el trazador cúbico S(x) cumpla las condiciones deseadas, los coeficientes de los polinomios deben satisfacer las siguientes ecuaciones: ai = yi ai + bi hi + ci h2i + di h3i (2.2) = yi+1 (2.3) bi+1 = bi + 2ci hi + 3di h2i (2.4) ci+1 = ci + 3di hi (2.5) Como se indicó al inicio de esta sección, el conjunto anterior contiene 4n − 2 ecuaciones. Es necesario hallar 4n coeficientes, y por tanto para equilibrar el sistema de ecuaciones, se adicionan las siguientes condiciones (denominadas condiciones de frontera libre o natural): s000 (x0 ) = 0 s00n−1 (xn ) = 0 Ahora, con el objetivo de reducir el sistema de ecuaciones, se realizan las siguientes consideraciones: Si se despeja di de la ecuación (2.5), se concluye que di = (ci+1 −ci ) . 3 Sustituyendo di en las ecuaciones (2.3) y (2.4) se obtiene: h2i (2ci + ci+1 ) 3 = bi + hi (ci + ci+1 ) ai+1 = ai + bi hi + (2.6) bi+1 (2.7) Despejando bi de la ecuación (2.6) y reemplazando adecuadamente en (2.7), se obtiene: hi−1 ci−1 + 2(hi−1 + hi )ci + hi ci+1 = 3 3 (ai+1 − ai ) − (ai − ai−1 ) hi hi−1 (2.8) La ecuación (2.8) solamente relaciona los coeficientes ci , lo que representa un sistema mas pequeño que el original. Por lo tanto, para construir el trazador cúbico de los puntos (x0 , y0 ), (x1 , y1 ), . . . , (xn , yn ), primero se debe resolver el sistema: 1 0 0 ··· ··· 0 c0 ··· 0 h00 2(h0h+1 h1 ) 2(h1h+1 h2 ) ·h·2· c · · · 0 c12 .. . .. .. .. . . . . . . . . . = .. . .. .. .. . . . . . . . . . .. cn−1 . hn−2 2(hn−2 + hn−1 ) hn−1 cn 0 ··· ··· 0 0 1 3 h1 3 h2 0 (a2 − a1 ) − (a3 − a2 ) − . . . . . . 3 hn−1 3 h0 3 h1 (a1 − a0 ) (a2 − a1 ) (an − an−1 ) − h 3 (an−1 − an−2 ) n−2 0 (2.9) Luego, se debe calcular el valor de bi y di utilizando las ecuaciones di = (ci+13−ci ) y bi = h1i (ai+1 − ai ) − h3i (2ci + ci+1 ). El siguiente ejemplo presenta en un caso concreto la construcción del trazador cúbico natural. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 49 — #51 i 2.1. AJUSTE EXACTO i 49 Ejemplo 18. Dados los datos (−1, 2), (0, −1), (2, 2), (3, 2) y (7, −1), construir su trazador cúbico libre asociado. Solución: aunque no es el caso, lo primero que se debe hacer es ordenar de menor a mayor los puntos por la coordenada x. Una vez ordenados, se disponen en una tabla y se calculan los elementos que conformarán el sistema de ecuaciones (2.9). i xi ai hi 0 1 2 3 4 -1 0 2 3 7 2 -1 2 2 -1 1 2 1 4 3 hi−1 (ai − ai−1 ) − 3 hi−2 (ai−1 − ai−2 ) 13.5 -4.5 -2.25 Por lo tanto, el sistema para determinar los coeficientes ci es: c0 0 1 0 0 0 0 1 6 2 0 0 c1 13.5 0 2 6 1 0 c2 = −4.5 0 0 1 10 4 c3 −2.25 0 0 0 0 0 1 c4 De donde se concluye que: 0 c0 c1 2.8089 c2 = −1.6767 c3 −0.0573 0 c4 y al utilizar las relaciones di = (ci+13−ci ) y bi = h1i (ai+1 − ai ) − h3i (2ci + ci+1 ) se obtiene: b0 −3.9363 0.9363 d0 b1 −1.1273 d1 −0.7476 b2 = 1.1369 d2 = 0.5398 b3 −0.5971 d3 0.0047 0 d4 0 b4 Conociendo los coeficientes de los polinomios si (x), se construye el trazador cúbico natural: s0 (x) = 2 − 3.9363(x + 1) + 0.9363(x + 1)3 si x ∈ [−1, 0] s (x) = −1 − 1.1273x + 2.8089x2 − 0.7476x3 si x ∈ [0, 2] 1 S(x) = 2 3 s (x) = 2 + 1.1369(x − 2) − 1.6767(x − 2) + 0.5398(x − 2) si x ∈ [2, 3] 2 2 3 s3 (x) = 2 − 0.5971(x − 3) − 0.0573(x − 3) + 0.0047(x − 3) si x ∈ [3, 7] ♦ Ejercicios 6 1. Construir el trazador cúbico para los datos (0, 1), (1, 1), (2, 7). i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 50 — #52 i 50 i CAPÍTULO 2. INTERPOLACIÓN 2. Para la función f (x) = ln(x), construir el trazador cúbico de los nodos x0 = 1, x1 = 2, x2 = 3. Luego, estimar la imagen de x = e 3. Construir el trazador cúbico natural para estimar f (8.4) si f (8.0) = 1.25, f (8.2) = 1.76, f (8.3) = 1.46 y f (8.5) = 1.75. 4. Si f (x) = cos−1 (x), x0 = 0, x1 = 0.5, x2 = 0.8, x3 = 1, utilizar el trazador cúbico natural para aproximar f (0.65) y comparar con el valor real. 5. Utilizar un trazador cúbico natural para obtener una aproximación de y los nodos x0 = −2, x1 = −1, x2 = 0, x3 = 1 y x4 = 2. √ 6. Dado el trazador cúbico natural ( s0 (x) = 1 + 2x − x3 s(x) = s1 (x) = 2 + b(x − 1) + c(x − 1)2 + d(x − 1)3 7 con la función f (x) = 7x 0≤x≤1 1≤x≤2 determinar los valores de b, c y d. 7. Construir el trazador cúbico natural de los datos (1, 1), (−1, −1), (2, 8), (−2, −8). ¿Tiene algo particular este trazador? 8. Dados los puntos (1, 1), (2, 2), (3, 1), (4, 2), construir el trazador cúbico natural asociado y estimar el valor de la derivada en x = 3. 9. Dados los puntos (1, 1), (2, 2), (3, 1), (4, 2), construir el trazador cúbico natural asociado y determinar el valor máximo del interpolador en el intervalo [1, 4]. 10. Dado un trazador cúbico natural s(x), ¿a qué equivale s000 (x)? 2.2. Ajuste por mínimos cuadrados Si lo que se desea es marcar una tendencia, los polinomios de ajuste exacto no son los más adecuados, es mejor buscar una curva (más simple), que tal vez no “toque” ningún punto, pero que pase “cerca” de cada uno de ellos como se muestra en la figura 2.9. b b b b b Figura 2.9: ajuste por mínimos cuadrados. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 51 — #53 i 2.2. AJUSTE POR MÍNIMOS CUADRADOS 2.2.1. i 51 Errores En la búsqueda de encontrar una curva “cercana” a una serie de puntos, es necesario definir cómo medir el error que se comete al seleccionar una función f¯(x). Existen varias posibilidades. ¯ Error relativo: suponer que se tienen n + 1 puntos y que estos Pn se ajustan con la función f (x). El error relativo que se comete con la función de ajuste es Er = i=0 (yi − f¯(xi )). Un problema en esta situación es de compensación, es decir, pueden existir errores grandes que al sumarlos con otros de igual magnitud pero de signo contrario, se cancelen y pareciera no ser entonces tan crítica la situación. Error absoluto: para Pnevitar que el error se compense, se toma el valor absoluto y el error se puede calcular como Ea = i=0 yi − f¯(xi ) . Este error presenta dos problemas. Primero, puede ser que una curva ajuste bien una lista de puntos, pero la suma de errores pequeños en cada punto puede finalmente arrojar un error grande, y segundo, el hecho que la función valor absoluto presente problemas de diferenciabilidad en un punto lo hace difícil de tratar. Error cuadrático: esta manera de medir Pn el error tiene la virtud de no presentar problemas de diferenciabilidad y se define como: Ec = i=0 (yi − f¯(xi ))2 . 2.2.2. Funciones de ajuste En la selección de la función de ajuste f¯(x), normalmente se escoge una combinación lineal de familias de funciones base. Algunas de las familias más utilizadas en la práctica incluyen: Monomios: {1, x, x2 , . . .}. Exponenciales: {1, e±x , e±2x , . . .}. Exponenciales complejas: {1, e±ix , e±2ix , . . .}. Funciones seno y coseno: {1, cos x, cos 2x, . . . ; sin x, sin 2x, . . .}. Cada uno de estos conjuntos se selecciona según la naturaleza de los datos a trabajar. En la próxima sección se estudian funciones de ajuste f¯(x) que son combinaciones lineales de la familia de los monomios. 2.2.3. Polinomios de mínimos cuadrados Cuando se usa la familia de los monomios {1, x, x2 , . . .}, combinaciones lineales de elementos de esta base producen un polinomio, y el caso más simple es cuando se usan los primeros dos elementos de la base {1, x}, obteniéndose polinomios de grado 1 (rectas). Ahora, la idea es entonces determinar una recta a0 + a1 x que pase cerca de los puntos (x0 , y0 ), (x1 , y1 ), . . . , (xn , yn ). Si se observa el error cuadrático E entre la curva f¯(x) = a0 + a1 x y la lista de puntos: E= n X (yi − a0 − a1 xi )2 i=0 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 52 — #54 i 52 i CAPÍTULO 2. INTERPOLACIÓN se puede determinar que dependiendo del valor de los parámetros a0 y a1 , la curva de ajuste comete mayor o menor error, es decir, el error depende de estos valores, por lo tanto, el error cuadrático se puede analizar como la función de dos variables E(a0 , a1 ) = n X (yi − a0 − a1 xi )2 i=0 Así, determinar que valores a0 y a1 satisfacen que E sea mínimo, se traduce en determinar un mínimo de la función E(a0 , a1 ). Notar que E(a0 , a1 ) es una función cuadrática, y su gráfica corresponde a un paraboloide. Luego, se tiene un único punto crítico y corresponde a su mínimo. Para calcular el punto crítico, se debe determinar cuando el gradiente de la función es el vector nulo, y así: ∂E(a0 , a1 ) ∂E(a0 , a1 ) ∇E(a0 , a1 ) = , ∂a0 ∂a1 de donde se obtienen las dos ecuaciones (normales): ∂E(a0 , a1 ) = 0, ∂a0 ∂E(a0 , a1 ) = 0. ∂a1 A continuación se presenta el cálculo detallado de la primera ecuación. ! n X ∂E(a0 , a1 ) ∂ (yi − a0 − a1 xi )2 = 0. = ∂a0 ∂a0 i=0 Al derivar término a término se realiza la derivada n X ∂ (yi − a0 − a1 xi )2 = 0 ∂a 0 i=0 n X 2(yi − a0 − a1 xi )(−1) = 0. i=0 y se factoriza: ( ) n X (−2) (yi − a0 − a1 xi ) = 0, i=0 para obtener: n X (yi − a0 − a1 xi ) = 0. i=0 Por propiedades de la sumatoria se tiene que n X yi − i=0 n X a0 − i=0 n X a1 xi = 0 i=0 de donde se desprende que a1 n X xi + a0 (n + 1) = i=0 n X yi , i=0 la cual corresponde a la primera ecuación normal. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 53 — #55 i 2.2. AJUSTE POR MÍNIMOS CUADRADOS i 53 Razonando de la misma manera, pero derivando E respecto de a1 , se llega a: a1 n X x2i + a0 n X i=0 n X xi = i=0 yi xi , i=0 La matriz aumentada de este sistema lineal es: P n n P x2i xi i=0 i=0 P n xi n + 1 n P yi xi i=0 n P i=0 yi i=0 Este sistema tiene solución única. Al usar la regla de Cramer se desprende que n P yi xi i=0 yi i=0 n P i=0 xi i=0 n P a1 = n P x2i n P xi n+1 n P (n + 1) (n + 1) i=0 n P yi xi − i=0 = xi n P n P i=0 i=0 x2i − n P xi n P yi i=0 2 xi i=0 n+1 i=0 n P i=0 n P a0 = x2i xi i=0 n P i=0 n P x2i xi n P yi xi i=0 n P i=0 n P n P yi = xi i=0 x2i n P i=0 (n + 1) i=0 yi − n P i=0 n P xi i=0 x2i − n P yi xi i=0 n P 2 xi i=0 n+1 i=0 Finalmente, estos son los valores de a0 y a1 que hacen mínimo el error cuadrático. Ejemplo 19. Encontrar los valores de a0 y a1 que hacen mínimo el error cuadrático cuando se aproxima la lista (−1, 2), (0, −1), (1, 1) y (2, −2) con un polinomio de grado uno. Solución: se organizan los datos en la siguiente tabla y se suma por columnas: i xi yi x2i yi xi 0 1 2 3 P -1 0 1 2 2 -1 1 -2 1 0 1 4 -2 0 1 -4 2 0 6 -5 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 54 — #56 i 54 i CAPÍTULO 2. INTERPOLACIÓN Al reemplazar en las ecuaciones para a0 y a1 : a1 = a0 = (4)(−5) − (2)(0) −20 = = 1.0, 2 (4)(6) − (2) 20 10 (6)(0) − (2)(−5) = = 0.5. 20 20 Por lo tanto, la función de ajuste es: f¯(x) = 0.5 + 1.0x. ♦ Cuando la función de ajuste es un polinomio cuadrático, f¯(x) = a0 + a1 x + a2 x , el error es 2 E(a0 , a1 , a2 ) = n X yi − a0 − a1 xi − a2 x2i 2 . i=0 Ahora el error depende de las constantes a0 , a1 y a2 que se elijan. Para encontrar el valor de aquellas que minimizan el error cuadrático se iguala el gradiente al vector nulo y lo anterior da origen a tres ecuaciones normales: n n n X X X a2 x2i + a1 xi + a0 (n + 1) = yi , i=0 a2 a2 n X i=0 x3i + a1 n X i=0 i=0 n X n X x4i + a1 i=0 i=0 x2i + a0 n X xi = i=0 n X yi xi , i=0 x2i + a0 (n + 1) = i=0 n X yi x2i . i=0 con su correspondiente sistema lineal de ecuaciones en notación de matriz aumentada P n x4 i=0 i P n x3 i=0 i P n x2i i=0 n P i=0 n P i=0 n P i=0 x3i x2i xi n P i=0 n P x2i xi i=0 n+1 n P i=0 yi x2i n P yi xi i=0 n P yi i=0 Si se observa bien esta matriz, se puede notar que contiene al caso de la recta de mínimos cuadrados, es decir, al sistema del caso anterior. Es más, esta nueva matriz se puede construir agregando una fila a la izquierda y una columna arriba de la matriz aumentada del caso anterior teniendo en cuenta que los exponentes de xi crecen hacia la izquierda y hacia arriba. Sucede igual cuando la función de ajuste es un polinomio de grado 3, es decir, a la última matriz solo basta agregar una columna a la izquierda y una fila arriba aumentando los exponentes hacia arriba y hacia la izquierda. De esta forma se puede generalizar para polinomios de grado n. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 55 — #57 i 2.2. AJUSTE POR MÍNIMOS CUADRADOS 2.2.4. i 55 Ajuste exponencial En algunos casos, para los datos {(xi , yi )}ni=0 es necesario construir una función de ajuste de la b forma f¯(x) necesario encontrar los valores de a y b que hacen mínimo el error cuadrático P= ax . Es E(a, b) = (yi − axbi )2 . Aunque al calcular las ecuaciones normales rápidamente se observa que no es un sistema lineal, un buen intento por obtener un “sistema lineal” es aplicar el logaritmo de la función de ajuste y por las propiedades de estos, se obtiene: log f¯(x) = log a + b log x. Si se realizan los cambios F̄ (x) = log f¯(x), Xi = log xi , a0 = log a y a1 = b, se tiene el caso de la recta de mínimos cuadrados F̄ (X) = a0 + a1 X. Ejercicios 7 1. Determinar la recta de mínimos cuadrados que corresponde a los datos (−1, 2), (−2, 3), (1, 2.5) y (−3, 0) y su error cuadrático. 2. Determinar la recta de mínimos cuadrados que corresponde a los datos (10, ln(10)), (100, ln(100)), 1000, ln(1000) y (10000, ln(10000)). Luego estimar la imagen de x = 5000 y comparar con el valor real. 3. Para los datos (1, −1), (2, 1), (3, −1), (4, 1), (5, −1): Ubicar en los puntos en el plano y dibujar la recta que se considere es la más cercana a los datos. Determinar la recta de mínimos cuadrados para los puntos dados. ¿Concuerda la recta de mínimos cuadrados con la esperada? 4. ¿Cuál es la recta de mínimos cuadrados para los datos (1, 2), (1, −1)? 5. Determinar el polinomio cuadrático de mínimos cuadrados que corresponde a los datos (−1, 2), (−2, 3), (1, 2.5) y (−3, 0). 6. Para los siguientes datos, determinar la función f¯(x) = axb de mínimos cuadrados. xi yi 0.03 0.05 0.07 0.09 0.1 24.8 12.3 6.25 3.12 0.75 7. Para los siguientes datos, determinar la función f¯(x) = axb de mínimos cuadrados. xi yi 1 2 3 4 5 10 100 10000 100000 1000000 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 56 — #58 i 56 i CAPÍTULO 2. INTERPOLACIÓN 8. Determinar el error cuadrático al aproximar (−1, 2.5), (0.5, −2) y (2, −0.2) con la función 2 f¯(x) = 13 + 53 x 3 . 9. Si se conoce que el error cuadrático de aproximar (1, 2.5), (2, 3.5), (−1.5, 0) y (−2, −0.5) con una recta es cero, ¿qué se puede decir acerca de los datos? 10. Si se conoce que la nota promedio en el curso de métodos numéricos durante los últimos años esta dada por: Año Nota promedio 2007 2008 2009 2010 2011 2014 2016 2.8 2.8 2.6 3.1 3.8 3.1 2.9 estimar, uitlizando la recta de mínimos cuadrados, la nota promedio en el año 2015. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 57 — #59 i 2.2. AJUSTE POR MÍNIMOS CUADRADOS i 57 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 58 — #60 i i i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 59 — #61 i i Capítulo 3 Sistemas de ecuaciones En dos de los problemas estudiados en sesiones anteriores se ha necesitado solucionar sistemas de ecuaciones lineales. En el caso de los trazadores cúbicos, en el que es necesario solucionar un sistema tridiagonal con el fin de conocer los zi y en el cual la dimensión del sistema depende del número de puntos a interpolar. También en el caso de los polinomios de mínimos cuadrados, donde la dimensión del sistema depende del grado del polinomio que se escoja para aproximar la lista de puntos o la función. En ambos casos, los sistemas de ecuaciones pueden ser de dimensión alta, como es el caso de aplicaciones de computación gráfica, donde dicho número puede ser del orden de 1000 o 10000 puntos. Por lo tanto, el problema de solucionar sistemas de ecuaciones, desde el punto de vista computacional, es relevante y de extensa aplicación. En general, los métodos que resuelven el anterior problema se pueden clasificar en: métodos directos y métodos iterativos, estos últimos inspirados en la iteración de punto fijo. 3.1. Métodos directos Aunque el más famoso de los métodos directos es la eliminación gaussiana, es poco práctico por la cantidad de operaciones que se requieren para reducir a forma escalonada una matriz. Otra clase de métodos muy usados corresponde a factorizaciones, y aunque existen varios tipos de ellas, en este capítulo se aborda la factorización LU , como mecanismo para escribir algoritmos muy eficientes para resolver sistemas tipo banda (como el tridiagonal) o sistemas con muchos ceros. 3.1.1. Factorización LU Primero que todo, es de anotar que sistemas que involucren matrices triangulares, ya sean inferiores (L: lower) o superiores (U : upper) son particularmente fáciles de resolver, al igual que sistemas que involucren matrices diagonales. A continuación se examina en detalle dichas situaciones. 59 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 60 — #62 i 60 i CAPÍTULO 3. SISTEMAS DE ECUACIONES Matrices diagonales. Considerar d11 0 0 . .. 0 el sistema de ecuaciones: 0 d22 0 .. . 0 0 .. . ··· ··· .. . .. .. . ··· 0 0 0 .. . . 0 dnn 0 b1 x1 x 2 b2 .. .. . = . . . .. .. bn xn Al resolver fila por fila se obtiene x1 = b1 b2 bn , x2 = , . . . , xn = d11 d22 dnn y se puede entonces escribir la solución genérica: xi ← bi para i = 1, 2, · · · , n dii asegurar Nota: observar que el sistema tiene solución única si dii 6= 0 para todo i. Luego basta Q n que det D 6= 0, donde D es la matriz diagonal y su determinante se calcula como det D = i=1 dii . Matriz triangular inferior L. Para una matriz triangular inferior de orden n × n, definida como lij = 0, si j > i, considerar el sistema: l11 0 0 ··· 0 x1 b1 l21 l 0 · · · 0 x 22 2 b2 .. .. . . . . . .. .. .. .. = .. . . . .. .. . . .. .. . . . 0 .. .. ln1 ln2 ··· ··· lnn xn bn Con la primera ecuación del sistema, primera fila, es posible calcular el valor de x1 . l11 x1 = b1 Al despejar se tiene que x1 = b1 l11 y con dicho valor de x1 se procede a calcular el valor de x2 con la segunda fila del sistema. l21 x1 + l22 x2 = b2 Se obtiene el siguiente valor de x2 : x2 = b2 − l21 x1 a22 y ahora que se conocen los valores de x1 y x2 se procede a calcular x3 con la tercera fila del sistema. l31 x1 + l32 x2 + l33 x3 = b3 Como resultado se tiene x3 = b3 − l31 x1 − l32 x2 l33 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 61 — #63 i 3.1. MÉTODOS DIRECTOS i 61 y lo anterior se puede escribir en forma alternativa como: b3 − 2 P l3r xr r=1 x3 = l33 Al seguir este razonamiento, se obtiene para xi : bi − i−1 P lir xr r=1 xi = lii donde la anterior expresión es válida para i = 1, 2, 3, . . . , n. Observar que para i = 1 la suma va desde 1 hasta 0, lo que se interpretará como 0, reduciendo el valor de x1 a b1 /l11 . Un algoritmo basado en la última ecuación se conoce como sustitución progresiva, ya que al conocer la primera incógnita se encuentra la segunda, y con la primera y segunda es posible encontrar la tercera y así sucesivamente. De nuevo, notar que el sistema Qn tiene solución y única si lii 6= 0 para toda i = 1, 2, 3, . . . , n. Recordar también que det L = i=1 lii . Matriz triangular superior U . Recordar que una matriz es triangular superior si uij = 0 para i > j. Un sistema con una matriz triangular superior U tiene la forma: u11 u12 · · · ··· u1n x1 b1 0 u u · · · u x 22 23 2n 2 b2 .. . . . . . .. .. .. .. = .. . 0 . .. . . .. .. .. .. . . . . .. .. 0 0 ··· 0 unn xn bn En este caso, si se comienza con la primera fila, se obtiene una ecuación con n incógnitas, y por tanto es adecuado empezar por la última fila, en la cual la ecuación solamente contiene a xn . unn xn = bn Al despejar: xn = bn unn y ahora, en forma regresiva, como es conocido el valor de xn , se procede a calcular el de xn−1 , con la penúltima fila, un−1n−1 xn−1 + un−1n xn = bn−1 donde se obtiene xn−1 = bn−1 − un−1n xn bn−1n−1 Al subir una fila, y con los valores de xn y xn−1 , se calcula xn−2 , con la antepenúltima fila: un−2n−2 xn−2 + un−2n−1 xn−1 + un−2n xn = bn−2 para obtener xn−2 = bn−2 − un−2n−1 xn−1 − un−2n xn un−2n−2 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 62 — #64 i 62 i CAPÍTULO 3. SISTEMAS DE ECUACIONES que se puede escribir también como bn−2 − n P un−2r xr r=n−1 xn−2 = un−2n−2 Al seguir el mismo razonamiento, se calcula xi como: bi − xi = n P uir xr r=i+1 uii para i = n, n − 1, n − 2, . . . , 1. Un algoritmo basado en la anterior fórmula se llama sustitución regresiva. Notar que cuando i = n, la suma va de n + 1 hasta n, lo cual se asume Qn como cero, y por tanto existe la reducción a xn = bn /unn . Recordar además que det U = i=1 uii . Ejercicios 8 1. Resolver los siguientes sistemas de ecuaciones utilizando las técnicas descritas anteriormente. 15 0 0 x 1 a) 0 −7 0 y = 6 0 0 3 z 9 1 0 0 x −5 b) 2 3 0 y = 7 2 −8 7 z 3 5 1 7 x 8 c) 0 −9 13 y = −3 0 0 11 z 121 7 0 0 0 x1 7 −2 5 0 0 x2 −2 d) 6 9 −4 0 x3 = −3 1 3 5 1 x4 0 2 x1 1 −2 2 2 0 −1 0 3 x2 −1 e) 0 0 −4 2 x3 = 3 x4 4 0 0 0 2 Factorización LU Aunque para sistemas n × n no triangulares el problema no es aparentemente fácil de resolver, si la matriz de coeficientes A se puede expresar como el producto de una triangular inferior L con una triangular superior U , es decir A = LU , entonces el siguiente algoritmo permite reducir el problema a las técnicas de la sección 3.1.1. 1) Lz = b 2) U x = z Notar que en la primera línea el algoritmo de sustitución progresiva permite calcular completamente el vector z, mientras que en el segundo renglón, una vez es conocido z, con sustitución regresiva se puede i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 63 — #65 i i 3.1. MÉTODOS DIRECTOS 63 calcular completamente el vector x y el problema quedaría solucionado. Es entonces relevante tratar de factorizar una matriz A en forma LU . A través del siguiente ejemplo se observará un procedimiento para calcular una factorización LU . Ejemplo 20. Determinar una factorización LU 2 3 3 de la matriz −1 1 3 9 3 5 Solución: se desea encontrar una matriz triangular inferior L y una matriz triangular superior U tal que l11 0 0 u11 u12 u13 2 −1 1 l21 l22 0 0 u22 u23 = 3 3 9 l31 l32 l33 0 0 u33 3 3 5 Luego l11 u11 = 2, si se define que l11 = 1, entonces u11 = 2. Por otro por tanto u12 = −1 y u13 = 1. 1 0 0 2 −1 1 2 l21 l22 0 0 u22 u23 = 3 l31 l32 l33 0 0 u33 3 Ahora, l21 u11 = 3 y l31 u11 = 3, de donde al despejar se tiene l21 = 1 0 0 2 −1 1 2 3 2 l22 0 0 u22 u23 = 3 3 3 l32 l33 0 0 u33 2 3 2 lado l11 u12 = −1 y l11 u13 = 1, y −1 3 3 1 9 5 y l31 = 23 . −1 1 3 9 3 5 Continuando con el elemento a22 , se tiene 32 (−1) + l22 u22 = 3, y si se define l22 = 1, se obtiene u22 = 3 + 32 = 92 . Adicionalmente 32 (−1) + l32 u22 = 3 y 32 (1) + l22 u23 = 9, de donde se concluye que l32 = 92 y u23 = 15 2 . 2 −1 1 2 −1 1 1 0 0 3 15 = 3 3 9 2 1 0 0 92 2 9 3 l33 0 0 u33 3 3 5 2 2 Por último, 23 (1) + 92 ( 15 2 ) + l33 u33 = 5, y si se define l33 1 0 0 2 −1 1 3 9 15 0 1 0 2 2 2 3 9 121 1 0 0 − 2 2 4 = 1, se obtiene u33 2 −1 1 = 3 3 9 3 3 5 =5− 3 2 − 135 4 = − 121 4 . Así, 1 L= 3 2 3 2 0 1 9 2 0 0 1 2 U = 0 0 −1 1 9 2 15 2 − 121 4 0 ♦ El anterior procedimiento se puede resumir de la siguiente manera informal: i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 64 — #66 i 64 i CAPÍTULO 3. SISTEMAS DE ECUACIONES Primer paso. Calcular los elementos lii y uii . Multiplicar la fila i-ésima de la matriz L y la columna i-ésima de la matriz U e igualar el resultado con aii . En este paso es necesario definir un valor particular para lii o uii ; en el ejemplo se tiene lii = 1. Segundo paso. Calcular todos los elementos de la columna i de la matriz L. Tercer paso. Calcular todos los elementos de la fila i de la matriz U . Como se puede observar, en cada ciclo del algoritmo se avanza una columna de la matriz L desde la izquierda, y se avanza en una fila de la matriz U desde la primera. De esta forma, cuando se va a calcular el ciclo r, se conocen completamente todos los elementos lij para i desde 1 hasta n, y j desde 1 hasta r − 1 y también uij donde i va desde 1 hasta r − 1 y j desde 1 hasta n. De manera detallada los pasos son: Primer paso. arr = r X lir urj k=1 Notar que a excepción del último término de la suma, los demás son conocidos, y al separar el último se tiene: r−1 X arr = lir urj + lrr urr k=1 En este momento se tienen dos incógnitas, y una posible solución a la anterior situación, es asumir un valor arbitrario (no nulo) de una de ellas. Elecciones famosas: a) Factorización de Doolittle: lii = 1 para i = 1, 2, . . . , n. b) Factorización de Crout: uii = 1 para i = 1, 2, . . . , n. Cualquiera de las anteriores da lugar a encontrar la otra incógnita. Por ejemplo, si elige la factorización de Doolittle, entonces: arr − r−1 P lir urj k=1 urr = para r = 1, 2, . . . , n lii en cambio, al trabajar con la factorización de Crout: arr − lrr = r−1 P lir urj k=1 para r = 1, 2, . . . , n uii Segundo paso. Cálculo de la columna r de L. El siguiente elemento a calcular es lr+1r , después lr+2,r , hasta finalizar con ln,r . Para lo anterior, observar que air = r X lik ukr , k=1 si se separa el último término, el que contiene la incógnita, se tiene que air = r−1 X lik ukr + lir urr , k=1 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 65 — #67 i 3.1. MÉTODOS DIRECTOS i 65 y al despejar se tiene finalmente air − r−1 P lik ukr k=1 lir = para i = r + 1, r + 2, . . . , n urr Tercer paso. Cálculo de la fila r de U . Así, arj = r X lrk ukj k=1 donde al separar último término de la suma arj = r−1 X lrk ukj + lrr urj k=1 se despeja urj para obtener finalmente arj − r−1 P lrk ukj k=1 urj = para j = r + 1, r + 2, . . . , n lrr Terminado este ciclo se conocen todos los elementos de la L desde la primera columna hasta la columna r, al igual que todos los elementos de la U desde la primera fila hasta la fila r. En el siguiente ciclo, se busca la fila y columna r + 1 de las matrices U y L respectivamente. Ahora se observará cómo utilizar la factorización LU de una matriz A para solucionar un sistema de ecuaciones. Ejemplo 21. Sea 1 A= 3 −2 0 0 5 1 0 0 4 1 0 −1 −2 0 0 1 3 resolver Ax = b, donde b = (−1, −6, −13)t . Solución: se debe recordar que si desea resolver un problema de la forma LU x = b, donde L es una matriz triangular inferior y U es una matriz triangular superior, entonces es necesario resolver los problemas: Lz = b Ux = z Luego, se debe solucionar en primer lugar 1 0 3 1 −2 4 el problema Lz = b, es decir 0 z1 −1 0 z2 = −6 1 z31 −13 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 66 — #68 i 66 i CAPÍTULO 3. SISTEMAS DE ECUACIONES donde al utilizar sustitución progresiva se obtiene: z1 = −1 z2 = −6 − 3(z1 ) = −6 − 3(−1) = −3 z3 = −13 + 2z1 − 4z2 = −13 + 2(−1) − 4(−3) = −3 Luego z = (−1, −3, −3)t . Ahora, se debe solucionar el problema U x = z: 5 −1 0 x1 −1 0 −2 1 x2 = −3 0 0 3 x3 −3 en el que se emplea sustitución regresiva −3 = −1 3 −3 − x3 −3 + 1 x2 = = =1 −2 −2 −1 + x2 x1 = =0 5 x3 = para obtener x = (0, 1, −1)t como la solución al problema Ax = b inicial. ♦ En el ejemplo anterior, aunque los cálculos utilizados en la sustitución progresiva y regresiva son de un costo computacional relativamente “barato”, es en el cálculo de la factorización LU donde el anterior método puede no ser tan eficiente. Por tanto, la utilización de este método para solucionar sistemas de ecuaciones es útil cuando se conoce de antemano una factorización de la matriz de coeficientes, y no es parte de nuestro trabajo calcularla, dado que en caso contrario los costos computacionales son equivalentes a emplear un método tradicional como eliminación de Gauss-Jordan. Ejercicios 9 1. Determinar la factorización LU de las siguientes matrices definiendo uii = 1. −1 −2 1 9 0 0 7 −8 a) 2 c) 2 12 0 0 1 3 3 1 3 1 0 1 0 0 1 0 1 −2 10 −4 d) 1 0 2 0 b) 5 −24 13 3 −13 12 0 1 0 2 2. Repetir el ejercicio anterior tomando lii = 1. 3. Solucionar el sistema Ax = b donde b = (1, 0, 1)t y A corresponde a las siguientes matrices. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 67 — #69 i i 3.2. MÉTODOS ITERATIVOS 1 a) 2 2 0 1 1 0 4 0 0 1 0 3 2 0 67 2 6 3 1 b) 3 −7 0 0 5 0 1 0 0 2 9 1 0 0 −3 1 −4 4. Si se conoce que LU es una factorización de la matriz A y det(U ) = 0, demostrar que si el problema Ax = b tiene solución, entonces existe bi tal que bi = 0. 5. Determinar la factorización LU de las siguientes matrices tomando como U = Lt . Este hecho es conocido como descomposición de Cholesky. 2 a) −1 0 2 b) −1 0 3.2. −1 2 −1 −1 4 2 0 −1 2 0 2 2 4 12 −16 37 −43 c) 12 −16 −43 98 25 15 −5 d) 15 18 0 −5 0 11 Métodos iterativos Cuando se tiene un sistema de ecuaciones Ax = b y se desea determinar el valor de x que lo satisface, existen diferentes técnicas, como el método de Gauss-Jordan, matriz inversa, regla de Cramer, factorización LU , etc. que permiten encontrar de manera exacta este valor, aunque con un costo computacional alto. Ahora, si para determinados problemas es suficiente obtener un x e que no satisface de manera exacta el sistema Ax = b, pero el resultado de Ae x está “cerca” de b y el costo de calcular x e es menor al de calcular el valor exacto x, entonces se desearía construir x e. En esta sección se desarrollan algunos métodos para calcular x e. Si se observa que la solución del problema Ax = b corresponde a la solución de la ecuación1 f (x) = 0 donde f (x) = Ax − b, entonces aunque surge la intención de utilizar los métodos descritos en el primer capitulo del libro, es necesario primero revisar algunos conceptos de la teoría de matrices. 3.2.1. Normas vectoriales En el curso de álgebra lineal se define la norma de un vector u = (x, y, z) como: kuk2 = p x2 + y 2 + z 2 y se denomina norma euclidiana. Una de las aplicaciones de la norma euclidiana es la definición de distancia euclidiana entre dos vectores u y v: d2 (u, v) = ku − vk2 Ejemplo 22. Determinar la distancia entre los vectores u = (1, −1, 2) y v = (2, −3, −6). 1 Notar que 0 se refiere al vector cero y que f es una función vectorial, es decir, f : Rn → Rn . i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 68 — #70 i 68 i CAPÍTULO 3. SISTEMAS DE ECUACIONES Solución: d2 (u, v) = ku − vk2 = k(1, −1, 2) − (2, −3, −6)k2 = k(−1, 2, 8)k2 p = (−1)2 + 22 + 82 √ √ = 1 + 4 + 64 = 69 ♦ En la siguiente definición se busca generalizar la idea de norma euclidiana y construir nuevas “distancias” sobre los vectores. Definición 3. Una norma vectorial en Rn es una función k · k : Rn → R tal que: i) kxk ≥ 0 para todo x ∈ Rn ii) kxk = 0 si y sólo si x = 0 iii) kαxk = |α|kxk para todo x ∈ Rn y α ∈ R iv) kx + yk ≤ kxk + kyk para todo x, y ∈ Rn (Desigualdad triangular) Se puede verificar que la norma euclidiana cumple con las anteriores propiedades. Otras normas que se pueden definir en Rn son l1 y l∞ , que presentan ventajas computacionales para procedimientos iterativos. Definición 4. Sea x = (x1 , x2 , . . . , xn ) un vector en Rn , entonces: La norma l1 del vector x es: kxk1 = n P |xi | i=1 La norma l∞ del vector x es: kxk∞ = máx |xi | 1≤i≤1 Ejemplo 23. Sea x = (−1, 2, −5, 3) entonces: kxk1 = n P |xi | = | − 1| + |2| + | − 5| + |3| = 1 + 2 + 5 + 3 = 11 i=1 kxk∞ = máx |xi | = máx{| − 1|, |2|, | − 5|, |3|} = 5 1≤i≤1 A partir de las normas l1 y l∞ se construyen las distancias d1 (u, v) = ku − vk1 y d∞ (u, v) = ku − vk. Dado que en esta sección se desea desarrollar métodos iterativos para aproximar la solución del sistema Ax = b, en los cuales se parte de un vector inicial (semilla) x(0) y se construyen vectores x(1) , x(2) , . . . , x(k) los cuales se “aproximan” al vector x solución de la ecuación Ax = b, es necesario n definir cuando una sucesión {x(k) }∞ k=0 de vectores de R convergen a un vector x. n n Definición 5. Sea {x(k) }∞ k=0 una sucesión de vectores de R y x un vector de R . Entonces la sucesión converge a x respecto a la norma k · k si dado > 0, existe un entero positivo N tal que kx(k) − xk < para todo k ≥ N i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 69 — #71 i i 3.2. MÉTODOS ITERATIVOS 69 Desde un aspecto computacional, la definición anterior no es la mejor, por lo tanto se presenta el siguiente teorema. (k) Teorema 7. La sucesión {x(k) }∞ k=0 converge a x respecto a la norma l∞ si y solo si lı́mk→∞ xi para cada i = 1, 2, . . . , n. = xi Se debe anotar que el teorema 7 indica una manera de comprobar si una sucesión {x(k) }∞ k=0 converge a un vector x con relación a la norma l∞ y no con relación a cualquier norma. Ejemplo 24. Demostrar que la sucesión x(k) = e−k , 5 + k1 , −3 sin(k) converge a el vector (0, 5, 0) k con relación a la norma l∞ . Solución: utilizando el teorema 7 es suficiente demostrar que lı́m e−k = 0 k→∞ lı́m 5 + k→∞ lı́m k→∞ 1 k =5 −3 sin(k) k =0 En este caso, lı́m e−k = lı́m 1 k k→∞ e k→∞ lı́m 5 + k→∞ lı́m k→∞ 1 k = 0, 1 k→∞ k =5+0=5 y sin(k) k = −3(0) = 0, = lı́m 5 + lı́m −3 sin(k) k k→∞ = −3 lı́m k→∞ con lo cual se demuestra que la sucesión {x(k) }∞ k=1 converge a el vector (0, 5, 0) con relación a la norma l∞ . ♦ Puede demostrarse el siguiente resultado: “Si una sucesión {x(k) }∞ k=1 converge a x con relación a una norma en Rn , entonces converge a x con relación a cualquier otra norma de Rn ”. Este hecho permite concluir que si una sucesión {x(k) }∞ k=1 converge a x con relación a la norma l∞ , entonces converge a x con relación a la norma euclidiana y la norma l1 . 3.2.2. Normas matriciales En la construcción y estudio de los métodos iterativos para aproximar una solución del sistema de ecuaciones Ax = b es necesario definir la distancia entre matrices, donde una de las maneras más efectivas es definir una norma sobre espacios de matrices. Definición 6. Una norma matricial es una función k · k : Mn (R) → R del conjunto de matrices de tamaño n × n en los números reales tal que i) kAk ≥ 0 para toda A ∈ Mn (R) ii) kAk = 0 si y solo si A = 0 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 70 — #72 i 70 i CAPÍTULO 3. SISTEMAS DE ECUACIONES iii) kαAk = |α|kAk para toda A ∈ Mn (R) y α ∈ R iv) kA + Bk ≤ kAk + kBk para toda A, B ∈ Mn (R) v) kA · Bk ≤ kAk · kBk para toda A, B ∈ Mn (R) la distancia con relación a la norma matricial k · k entre las matrices An×n y Bn×n se define como kA − Bk. Es posible demostrar que toda norma vectorial sobre Rn induce una norma matricial sobre Mn (R). En la siguiente definición se presenta las normas matriciales inducidas por las normas vectoriales l1 y l∞ . Definición 7. Si A = [aij ]n×n es una matriz, entonces: ( ) n P kAk∞ = máx |aij | 1≤i≤n kAk1 = máx 1≤j≤n j=1 n P |aij | i=1 Ejemplo 25. Si 3 1 7 8 8 1 −5 A= 3 3 calcular kAk∞ . ( Solución: dado que kAk∞ = máx 1≤i≤n ) n P |aij | , entonces j=1 kAk∞ = máx n X |a1j |, j=1 n X |a2j |, j=1 Pn n X j=1 |a3j | Pn De otro lado, j=1 |a1j | = | − 5| + |3| + |1| = 9, j=1 |a2j | = |3| + |7| + |8| = 18 y |3| + |8| + |1| = 12, y por tanto kAk∞ = máx{9, 18, 12} = 18. Pn j=1 |a3j | = ♦ Ejemplo 26. Si −5 A= 3 3 3 7 −3 1 8 6 calcular kAk1 . Solución: dado que kAk∞ = máx 1≤j≤n n P |aij | , entonces i=1 kAk∞ = máx ( n X i=1 |ai1 |, n X i=1 |ai2 |, n X ) |ai3 | i=1 Pn Pn Pn pero i=1 |ai1 | = |−5|+|3|+|3| = 11, i=1 |ai2 | = |3|+|7|+|−3| = 13 y i=1 |ai3 | = |1|+|8|+|6| = 15, de donde kAk1 = máx{11, 13, 15} = 15. ♦ Ejercicios 10 1. Determinar la norma euclidiana, l∞ , y l1 para los siguientes vectores. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 71 — #73 i i 3.2. MÉTODOS ITERATIVOS 71 a) u = (−1, 2, −1) 1 c) w = ( 12 , 41 , 18 , . . . , 128 ) b) v = (−5, 3, 1) d) z = (e−1 , e2 , e−3 , . . . , e−7 ) √ 2. Dados u = ( 2, e−1 , π, 1) y w = (1.4, 0.5, 3.14, 0.9999), determinar d2 (u, w), d∞ (u, w) y d1 (u, w). 3. Demostrar que las sucesiones {x(k) }∞ k=1 convergen a el vector (−1, 0, e, 1) con relación a la norma l∞ . k a) xk = −1, k1 , e, k+1 2 cos(k) k 1 n x+1 b) xk = 1−k 2, k , (1 + n ) , x c) xk = −1 + e−k , −1 k2 , e, 1 + d) xk = −1 + x4x−1 , 0, e, 1 x x3 +1 4. Determinar la norma matricial k · k∞ y la norma matricial k · k1 para las siguientes matrices. 0 0 7 0 5 1 1 a) −3 3 −5 b) −3 0 3 8 7 4 0 1 15 c) 3 −2 2 −1 d) 4 −11 13 8 27 −4 10 11 −1 8 5 15 4 3 5 −6 3 −8 13 1 5. Dada una matriz cuadrada A de n × n, la norma de Frobenius se define como: v uX n u n X kAkF = t |aij |2 i=1 j=1 2 calcular la norma de Frobenius para la matriz A = −1 2 3.2.3. 0 −1 3 1 . 0 3 Métodos iterativos en la solución de sistemas de ecuaciones lineales Como se menciona con anterioridad, los métodos iterativos en la solución de sistemas de ecuaciones Ax = b construyen una sucesión {xk }∞ k=0 convergente a la solución del sistema. Es de anotar que los métodos que se presentan en esta sección son de un esquema recursivo, es decir x(k+1) = T x(k) + c, donde T es una matriz fija y c un vector. En lo que sigue se presentan dos métodos iterativos clásicos, el método de Jacobi y el método de Gauss-Seidel. Método de Jacobi El método de Jacobi se basa en el método del punto fijo, y para entenderlo se analiza el siguiente ejemplo. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 72 — #74 i 72 i CAPÍTULO 3. SISTEMAS DE ECUACIONES Ejemplo 27. Sea Ax = b el sistema 5x1 − x2 + x3 + x4 = 5 x1 + 4x2 + x4 = 2 3x1 − x2 + 6x3 = −3 x2 − x3 + 3x4 = 4 Si de la primera ecuación se despeja x1 , de la segunda ecuación se despeja x2 , y así sucesivamente, se obtiene: 5 + x2 − x3 − x4 x1 = 5 2 − x1 − x4 x2 = 4 (3.1) −3 − 3x1 + x2 x3 = 6 4 − x2 + x3 x4 = 3 Tomando ahora x(0) = (−1, 5, 3, 2) y sustituyendo en el lado derecho del sistema 3.1 se obtiene (1) 5+5−3−2 =1 5 2+1−2 1 = = 4 4 −3 − 3(−1) + 5 5 = = 6 6 2 4−5+3 = = 3 3 x1 = (1) x2 (1) x3 (1) x4 luego x(1) = 1, 14 , 56 , 23 , y repitiendo el proceso ahora con x(1) se desprende que: (2) (2) x2 (2) x3 (2) x4 de donde x(2) = 3 1 23 55 4 , 12 , 24 , 36 1 4 − 56 − 23 3 = 5 4 2 − 1 − 32 1 = = 4 12 1 −3 − 3 + 4 23 = =− 6 24 4 − 41 + 56 55 = = 3 36 x1 = 5+ . En el cuadro 3.1 se encuentran las primeras diez iteraciones del método. Se puede observar que kx(9) − x(10) k∞ = máx{|0, 9995 − 0, 9997|, | − 0, 0001 + 0, 0000|, | − 0, 9993 + 0, 9997|, |1, 0002 − 1, 0002|} = 0, 0004 y en cada iteración esta distancia disminuye. Si se resuelve el sistema con el método Gauss-Jordan, se obtiene que la solución es x = (1, 0, −1, 1) y por lo tanto se tiene que la sucesión generada por el método de Jacobi es convergente a la solución del sistema. El método de Jacobi para solucionar un sistema de ecuaciones Ax = b se puede resumir, de manera muy simple, en los siguientes pasos: i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 73 — #75 i i 3.2. MÉTODOS ITERATIVOS 73 k 0 1 2 3 4 5 6 7 8 9 10 (k) x1 (k) x2 (k) x3 (k) x4 -1 5 3 2 1 0,25 0,8333 0,6666 0,75 0,0833 -0,9583 1,5277 0,9027 -0,0694 -0,8611 0,9861 0,9611 0,0277 -0,9629 1,0694 0,9842 -0,0076 -0,9759 1,0030 0,9930 0,0031 -0,9934 1,0105 0,9971 -0,0009 -0,9959 1,0011 0,9987 0,0004 -0,9987 1,0016 0,9995 -0,0001 -0,9993 1,0002 0,9997 0,0000 -0,9997 1,0002 Cuadro 3.1: iteraciones del método de Jacobi. 1. Despejar de cada una de las ecuaciones una de las variables (no despejar la misma variable en dos ecuaciones distintas). 2. Seleccionar un vector x(0) inicial. 3. Sustituir el vector seleccionado en las ecuaciones del paso 1 y llamar a este resultado x(1) . 4. Repetir el paso 3 con x(1) . Aunque en la descripción anterior no se hace referencia a cuándo detener el proceso, para lo anterior se debe establecer un valor > 0 (tolerancia) y considerar como criterio de parada kx(k) − x(k−1) k∞ < ε, de donde el proceso termina cuando la distancia entre los vectores x(k) y x(k−1) es menor a ε. Ejemplo 28. Utilizar el método de Jacobi obtener una aproximación de la solución del sistema 4x1 + 2x2 − x3 = −3 −2x1 + 5x2 + 2x3 = −9 −6x1 + 3x2 + 7x3 = 10 con una tolerancia de ε = 10−3 . Solución: los pasos son: Paso 1. Despejar una de las variables de cada ecuación. −3 − 2x2 + x3 4 −9 + 2x1 − 2x3 x2 = 5 10 + 6x1 − 3x2 x3 = 7 x1 = Paso 2. Seleccionar x(0) . En este caso x(0) = (1, −2, 3). Paso 3. Sustituir x(0) en las ecuaciones del paso 1. (0) (1) (0) −3 − 2x2 + x3 −3 − 2(−2) + 3 = =1 4 4 (0) (0) −9 + 2x1 − 2x3 −9 + 2(1) − 2(3) 13 = = =− 5 5 5 (0) (0) 10 + 6x1 − 3x2 10 + 6(1) − 3(−2) 22 = = = 7 7 7 x1 = (1) x2 (1) x3 22 luego x(1) = 1, 13 y kx(0) − x(1) k = 0.6. Dado que la distancia no es menor a 10−3 , continuar 5 , 7 el proceso. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 74 — #76 i 74 i CAPÍTULO 3. SISTEMAS DE ECUACIONES Paso 4. Repetir el paso 3, ahora con x(1) . (1) (1) 22 −3 − 2( 13 −3 − 2x2 + x3 5 )+ 7 = = 1.3357 4 4 (1) (1) −9 + 2(1) − 2( 22 −9 + 2x1 − 2x3 7 ) = = = −2.6571 5 5 (1) (1) 10 + 6(1) − 3( 13 10 + 6x1 − 3x2 5 ) = = = 3.4 7 7 (2) x1 = (2) x2 (2) x3 luego x(2) = (1.3357, −2.6571, 3.4) y kx(1) − x(2) k = 0.3357. Dado que la distancia no es menor a 10−3 , continuar el proceso. En el cuadro 3.2 se encuentran las primeras 19 iteraciones del método. d∞ x k 0 1 2 3 4 ··· 16 17 18 19 (k) x1 (k) x2 (k) x3 (k−1) 1 -2 3 1 -2,6 3,1428 0,6 1,3357 -2,657 3,4 0,3357 1,4285 -2,6257 3,7122 0,3122 1,4909 -2,7134 3,7783 0,0877 ··· ··· ··· ··· 1,6247 -2,7498 3,9995 0,0002 1,6248 -2,7499 3,9997 0,0001 1,6248 -2,7499 3,9998 0,0001 1,6249 -2,7499 3,9998 6,8e-5 , x(k) Cuadro 3.2: iteraciones del método de Jacobi. Dado que d∞ x(18) , x(19) = 6.8e-05 < 10−3 , entonces el proceso se detiene y la aproximación de la solución es x(19) = (1.6249, −2.7499, 3.9998). Se puede verificar que la solución exacta es x = (1.625, −2.75, 4). ♦ Método de Gauss-Seidel (k) Al examinar con detalle el método de Jacobi, se observa que al momento de calcular xi , con i > 1, se utilizan todas las componentes del vector x(k−1) y para ese instante se han calculado las componentes (k) xj , j = 1, 2 . . . , i − 1, las cuales suponen una mejor aproximación de las componentes xj del vector (k) solución del sistema Ax = b. Por lo tanto, una idea para acelerar el proceso es calcular xi utilizando (k) (k−1) xj , con j = 1, 2 . . . , i − 1, y xr con r = i + 1, i + 2, . . . , n. El método descrito anteriormente se denomina método de Gauss-Seidel y se ilustra en el siguiente ejemplo. Ejemplo 29. Utilizar el método de Gauss-Seidel resolver el siguiente sistema de ecuaciones. 5x1 − x2 + 3x3 −x1 − 5x2 =1 + x4 = −9 2x2 + 8x3 − 2x4 = −4 4x1 x3 − 6x4 = 9 Solución: para aplicar el método de Gauss-Seidel son necesarios los siguientes pasos. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 75 — #77 i i 3.2. MÉTODOS ITERATIVOS 75 Paso 1. Despejar una variable de cada ecuación. 1 + x2 − 3x3 5 −9 + x1 − x4 x2 = −7 −4 − 2x2 + 2x4 x3 = 8 9 − 4x1 − x3 x4 = −6 x1 = Paso 2. Seleccionar x(0) . En este caso x(0) = (0, 0, 0, 0). Paso 3. Calcular x(1) . (0) (1) x1 = (0) 1 + x2 − 3x3 5 (1) (1) x2 = (1) = − x4 −4 − 2 x2 (0) + 2x4 8 9−4 (1) x1 −9 + 15 − 0 44 = −7 35 = −7 x4 = 1 + 0 − 3(0) 1 = 5 5 (0) −9 + x1 (1) (1) x3 = = (1) − x3 −6 = 44 −4 − 2( 35 ) + 2(0) 57 =− 8 70 −9 − 4( 15 ) − (− 57 631 70 ) =− −6 420 Se debe observar lo siguiente: (1) (1) Para calcular x2 se ha utilizado la componente x1 = (0) componente x1 = 0. (1) (1) Para calcular x3 se ha utilizado la componente x2 = (0) la componente x2 = 0. (1) 1 5 (calculada anteriormente) y no la 44 55 , (calculada anteriormente) y no (1) = Para calcular x3 se han utilizado las componentes x1 (0) (0) anteriormente y no las componentes x1 = 0 y x3 = 0. 1 5 (1) y x3 = − 55 70 calculadas (1) De donde, para calcular xi , se utiliza la información más reciente. Paso 4. Calcular x(2) . 57 631 Dado que x(1) = ( 15 , 44 35 , − 70 , − 420 ) = (0.2, 1.2571, −0.8142, −1.5023), entonces: (1) (2) x1 = (2) 1 + x2 − 3x3 5 (2) (2) x2 = − x4 = = (1) + 2x4 8 (2) (2) x4 9 − 4 x1 −6 −9 + 0.94 − (−1.5023) = 0.9368 −7 = −7 −4 − 2 x2 1 + 0.2 − 3(1.2571) = 0.94 5 (1) −9 + x1 (2) (2) x3 = = (2) − x3 = −4 − 2(0.9368) + 2(−1.5023) = −1.1097 8 −9 − 4(0.94) − (−1.1097) = −1.0582 −6 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 76 — #78 i 76 i CAPÍTULO 3. SISTEMAS DE ECUACIONES por lo tanto x(2) = (0.94, 0.9368, −1.1097, −1.0582) En el cuadro 3.3 se encuentran las primeras seis iteraciones del método. Se puede verificar que la solución exacta corresponde a x = (1, 1, −1, −1) ♦ k 0 1 2 3 4 5 6 (k) 0 0 0 0 0,2 1,2571 -0,8142 -1,5023 0,94 0,9368 -1,1097 -1,058 1,0532 0,9840 -1,0105 -0,9662 1,0031 1,0043 -0,9926 -0,9966 0,9964 1,0009 -0,9994 -1,0022 0,9998 0,9997 -1,0004 -1,0001 x1 (k) x2 (k) x3 (k) x4 Cuadro 3.3: iteraciones del método de Gasuss-Seidel. Se debe resaltar que la diferencia entre el método de Jacobi y Gasuss-Seidel radica en la información que utilizan para calcular x(k) . El método de Jacobi emplea únicamente la información contenida en el vector x(k−1) , mientras que el método de Gauss-Seidel utiliza la información más reciente al usar las componentes de x(k) que ya calculadas. Al igual que el método de Jacobi, el método de Gauss-Seidel se establece como criterio de parada kx(k−1) − x(k) k < ε, para ε > 0 fijo durante la ejecución del método. Ejemplo 30. Utilizar el método de Gauss-Seidel obtener una aproximación de la solución del siguiente sistema. 4x1 + 2x2 − x3 = −3 −2x1 + 5x2 + 2x3 = −9 −6x1 + 3x2 + 7x3 = 10 con una tolerancia de ε = 10−3 . Solución: los pasos son: Paso 1. Despejar una de las variables de cada ecuación. −3 − 2x2 + x3 4 −9 + 2x1 − 2x3 x2 = 5 10 + 6x1 − 3x2 x3 = 7 x1 = Paso 2. Seleccionar x(0) . En este caso x(0) = (1, −2, 3). Paso 3. Sustituir x(0) en las ecuaciones del paso 1. (0) (1) (0) −3 − 2x2 + x3 −3 − 2(−2) + 3 = =1 4 4 (0) (1) −9 + 2x1 − 2x3 −9 + 2(1) − 2(3) = = = −2, 6 5 5 (1) (1) 10 + 6x1 − 3x2 10 + 6(1) − 3(−2.6) = = = 3, 4 7 7 x1 = (1) x2 (1) x3 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 77 — #79 i i 3.2. MÉTODOS ITERATIVOS 77 luego x(1) = (1, −2.6, 3.4) y kx(0) − x(1) k = 0, 6. Dado que la distancia no es menor a 10−3 , entonces sigue el proceso. Paso 4. Repetir el paso 3, ahora con x(1) . (1) (2) (1) −3 − 2x2 + x3 −3 − 2(1) + 3.4 = = 1.4 4 4 (2) (1) −9 + 2(1.4) − 2(3.4) −9 + 2x1 − 2x3 = = −2.6 = 5 5 (2) (2) 10 + 6(1.4) − 3(−2.6) 10 + 6x1 − 3x2 = = 3.7428 = 7 7 x1 = (2) x2 (2) x3 luego x(2) = (1.4, −2.6, 3.7428) y kx(1) − x(2) k = 0.4. Por lo tanto, la distancia entre x(1) y x(2) no es menor a 10−3 , entonces sigue el proceso. En el cuadro 3.4 se encuentran las primeras 14 iteraciones del método. d∞ x k 0 1 2 3 4 ··· 11 12 13 14 (k) x1 (k) x2 (k) x3 (k−1) 1 -2 3 1 -2,6 3,4 0,6 1,4 -2,6 3,7428 0,4 1,4857 -2,7028 3,8604 0,1175 1,5665 -2,7175 3,9359 0,0808 ··· ··· ··· ··· 1,6245 -2,7498 3,9995 0,0004 1,6247 -2,7499 3,9997 0,0002 1,6248 -2,7499 3,9998 0,0001 1,6249 -2,7499 3,9999 5,63e-05 , x(k) Cuadro 3.4: iteraciones del método de Gauss-Seidel. Como d∞ x(13) , x(14) = 5.63e-05 < 10−3 , entonces el proceso se detiene y la aproximación de la solución es x(14) = (1.6249, −2.7499, 3.9999). ♦ Nota: si el anterior ejemplo se desarrolla con el método de Jacobi, son necesarias 19 iteraciones. Se observa entonces como el método de Gauss-Seidel presenta una mejor convergencia en término de iteraciones. Ejercicios 11 1. Obtener x(3) en el método de Jacobi en la solución de los siguientes sistemas lineales. Usar x(0) = (0, 0, 0). a) 6x1 + 3x2 − x3 = 8 2x1 + 4x2 + x3 = 7 x1 − 3x2 − 5x3 = −7 −4x1 + x2 + 2x3 = −3 b) x1 + 5x2 + 3x3 = −1 x1 + x2 − 3x3 = −3 c) 3x1 + 2x3 = 6 x1 + 3x2 = 3 x1 + 5x2 + 7x3 = 19 4x1 + x2 + x3 − x4 = 3 x1 + 5x2 − x3 + x4 = 2 d) −2x1 − x2 + 7x3 + 2x4 = −9 x1 − x2 − 2x3 + 6x4 = 3 2. Repetir el ejercicio anterior utilizando el método de Gauss-Seidel. 3. Si se define una tolerancia de ε = 10−4 , resolver los ejercicios del numeral 1 utilizando el método de Jacobi. 4. Repetir el ejercicio anterior utilizando el método de Gauss-Seidel. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 78 — #80 i 78 i CAPÍTULO 3. SISTEMAS DE ECUACIONES Convergencia de los métodos iterativos de Jacobi y Gauss-Seidel En esta parte se analizan condiciones para asegurar la convergencia de los métodos iterativos de la forma x(k) = T x(k−1) + c. Antes de presentar estas condiciones, es necesario revisar algunos conceptos. Definición 8. Sea A una matriz n × n entonces ρ(A), denominado el radio espectral, corresponde a: ρ(A) = máx{|λ| | λ es valor propio de A} Definición 9. Sea A una matriz n × n. A es de diagonal estrictamente dominante si |aii | > n X |aij | j=1 j6=i para i = 1, 2, . . . , n. Ejemplo 31. Dadas las matrices −6 A = −3 4 2 7 5 3 1 10 y −2 B= 5 9 1 7 −1 0 −3 10 A es de diagonal estrictamente dominante dado que | − 6| > |2| + |3|, |7| > | − 3| + |1| y |10| > |4| + |5|. De otro lado, B no es de diagonal estrictamente dominante, ya que en la segunda fila el valor absoluto del elemento diagonal |7| no es mayor a la suma de los valores absolutos de los elementos restantes de la fila, a saber, |5| + | − 3| = 8. Con estos elementos es posible presentar los siguientes resultados. Teorema 8. Dado cualquier x(0) vector de Rn , la sucesión {x(k) }∞ k=0 generada por el esquema recursivo x(k) = T x(k−1) + c converge a la única solución del problema x = T x + c si y solo si ρ(A) < 1. El teorema 8 brinda condiciones necesarias y suficientes para garantizar la convergencia de un método iterativo de la forma x(k) = T x(k−1) + c con T una matriz fija y c un vector. Antes de dar condiciones suficientes para garantizar la convergencia de los métodos de Jacobi y Gauss-Seidel, es necesario presentar estos métodos como esquemas recursivos de la forma x(k) = T x(k−1) + c. Si Ax = b es un sistema de ecuaciones lineales con la a11 a12 a21 a22 A= . .. .. . an1 an2 si se divide A de la siguiente manera 0 0 a11 0 · · · 0 0 −a21 0 a22 · · · 0 −a −a 31 32 A= .. . . . − ... . . . .. . .. .. 0 0 · · · ann −an1 −an2 siguiente matriz de coeficientes A · · · a1n · · · a2n .. . ··· ··· 0 ··· 0 ··· 0 .. .. . . · · · −ann−1 ann 0 0 0 .. . 0 − 0 −a12 −a13 0 0 −a23 .. .. .. . . . 0 0 ··· 0 0 ··· · · · −a1n · · · −a2n .. .. . . · · · −an−1n ··· 0 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 79 — #81 i 3.2. MÉTODOS ITERATIVOS i 79 entonces A = D − L − U donde D es matriz diagonal, U es una matriz triangular superior y L es una matriz triangular inferior. En este caso, el sistema Ax = b se transforma en el sistema (D − L − U )x = b lo que implica que Dx = (L + U )x + b Ahora, si D−1 existe2 entonces multiplicando ambos lados de la anterior ecuación se obtiene: x = D−1 (L + U )x + D−1 b que a su vez, se transforma en el esquema iterativo x(k) = D−1 (L + U )x(k−1) + D−1 b Si se define D−1 (L + U ) = J y c = D−1 b, entonces el anterior esquema corresponde a la forma matricial del método de Jacobi: x(k) = Jx(k−1) + c (3.2) Ahora, si la ecuación (D − L − U )x = b se despeja de la siguiente manera (D − L)x = U x + b y existe (D − L)−1 , entonces x = (D − L)−1 U x + (D − L)−1 b lo cual origina el método matricial de Gauss-Seidel x(k) = Gx(k−1) + s (3.3) donde G = (D − L)−1 U y s = (D − L)−1 b. Es de anotar que D − L es una matriz triangular inferior, y por tanto su inversa existe si los elementos de la diagonal no son nulos, en este caso si aii 6= 0 para i = 1, 2, . . . , n. Luego de presentar los métodos de Jacobi y Gauss-Seidel como esquemas de la forma x(k) = T x(k−1) +c, a continuación se tiene una condición suficiente para garantizar su convergencia. Teorema 9. Si A es una matriz de diagonal estrictamente dominante, entonces para cualquier semilla x(0) , los método de Jacobi y Gauss-Seidel son convergentes a la única solución del sistema Ax = b. Ejercicios 12 1. Dado el sistema de ecuaciones Ax = b, donde A = −1 −1 yb= , calcular la matriz J y 4 1 2 1 el vector c usados en el método de Jacobi. 2. Dado el sistema de ecuaciones Ax = b, donde A = 5 −1 1 −1 yb= , calcular la matriz −4 1 G y el vector s usados en el método de Gauss-Seidel. 3. Determinar si las siguientes matrices son de diagonal estrictamente dominante. 2 D −1 para una matriz diagonal D existe si y sólo si aii 6= 0 para i = 1, 2, . . . , n. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 80 — #82 i 80 i CAPÍTULO 3. SISTEMAS DE ECUACIONES −2 a) 5 9 6 b) 8 −3 1 7 −1 0 −3 10 3 15 −4 −2 −4 5 −3 c) 4 0 4 3 d) −3 0 4. Descomponer la matriz A en la forma D − L − U , donde D es triangular superior y L es una matriz triangular inferior. 5 7 −3 4 3 a) −4 8 11 b) 13 9 3 16 57 1 5 −4 −1 −1 5 1 0 1 6 1 1 −1 −9 1 1 −2 4 una matriz diagonal, U una matriz 0 −1 0 5 0 15 0 28 4 3 −2 0 5. Determinar para los siguientes sistemas, si el método de Jacobi (o Gauss-Seidel) es convergente desde cualquier vector inicial x(0) . a) −15x1 + 3x2 − 6x3 = 3 8x1 − 4x2 + x3 = 6 9x1 − x2 + 3x3 = 5 4x1 + x2 + x3 = −5 3x1 + 6x2 − x3 − x4 = 0 b) −3x1 + 2x2 − 9x3 = 1 x2 + 4x − 3 − 7x4 = 6 6. Resolver el sistema lineal dado por medio del método de Jacobi con = 10−4 . 5x + 3y − z = 2 −x + 2y − 4z = −2 2x − 4y − z = −1 7. Resolver el sistema lineal dado por medio del método de Gauss-Seidel con = 10−4 . 2x + 5y + z = −2 3x − y + z = 2 −x − y + 3z = 0 α 1 0 8. Dada la matriz A = β 3 2 , encontrar los valores de α y β de forma tal que la matriz 1 −1 3 sea de diagonal estrictamente dominante. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 81 — #83 i 3.2. MÉTODOS ITERATIVOS i 81 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 82 — #84 i i i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 83 — #85 i i Capítulo 4 Ecuaciones diferenciales Cuando se estudian ciertos problemas en ingeniería y física, los modelos matemáticos que allí surgen, corresponden a ecuaciones donde se relaciona la variación de una magnitud con las condiciones internas, externas e iniciales del sistema. Por ejemplo, si conocemos que la velocidad de un automóvil (figura 4.1) está dada por (2 − 0.2t) m/s, donde t representa el tiempo, y la posición inicial del automóvil es 50 m con relación a un punto fijo, entonces una ecuación que permite modelar esta situación es v= dx(t) = 2 − 0.2t dt x(0) = 50 (4.1) donde x(t) es la función de posición del automóvil. 50m Figura 4.1: una representación de la situación del automóvil. La ecuación 4.1 se denomina ecuación diferencial y su solución, a diferencia de las ecuaciones del capítulo 1, corresponde a una función. Por ejemplo, en la ecuación diferencial 4.1, la solución es la función x(t) = 50 + 2t − 0.1t2 , dado que dx(t) dt = 2 − 0.2t y x(0) = 50. Al tener la solución de una ecuación diferencial es posible dar respuesta a inquietudes particulares. En el modelo del automóvil la solución a ¿qué posición tiene el automóvil a los 3 segundos?, corresponde a calcular x(3) = 50 + 2(3) − 0.1(3)2 = 55.1. En un curso de ecuaciones diferenciales se aprenden diferentes técnicas para determinar la solución exacta, es decir, la función que satisface la ecuación. En este capítulo se presentan algunos métodos para construir una aproximación de las imágenes de la función en valores particulares. Así, para el modelo anterior, se construye una aproximación de x(ti ) para algunos ti ∈ [0, 3]. 83 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 84 — #86 i 84 i CAPÍTULO 4. ECUACIONES DIFERENCIALES 4.1. Ecuaciones diferenciales ordinarias de primer orden con valor en la frontera Un problema de valor inicial se puede enunciar como una ecuación diferencial dx = f (t, x), dt a≤t≤b sujeta a la condición inicial x(a) = α Ejemplo 32. Las siguientes ecuaciones corresponden a problemas de valor inicial: La ecuación diferencial dx = −2x + t dt sujeta a: 1≤t≤2 x(1) = 5 La ecuación diferencial dx = x2 + 2xt + t2 dt sujeta a: − 5 ≤ t ≤ −3 x(−5) = 8 La ecuación diferencial dx = −t2 + 1 dt sujeta a: 3≤t≤7 x(3) = −2 La ecuación diferencial dx x = dt t sujeta a: 1≤t≤2 x(1) = 1 Como se mencionó al principio, dar solución a este tipo de ecuaciones significa encontrar una función x(t) tal que dx(t) dt = f (t, x) y x(a) = α. Aunque existen diferentes técnicas para determinar la función x(t), dichas técnicas están fuera de los alcances de este libro. A cambio, se presentan métodos para aproximar x(ti ) para ti ∈ [a, b]. 4.1.1. Método de Euler Se debe recordar que el problema a solucionar en este capítulo es: i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 85 — #87 i 4.1. PROBLEMAS DE VALOR INICIAL i 85 Sea: dy = f (t, y) dt sujeto a: a≤t≤b y(a) = α un problema de valor inicial. Para ti ∈ [a, b] obtener una aproximación de y(ti ), donde y(t) es la solución de la ecuación diferencial. Aunque el método de Euler es una de la técnicas numéricas más sencillas para aproximar y(ti ), en la práctica no es tan común, dados sus problemas computacionales que se analizarán más adelante. En el siguiente teorema, que corresponde a una versión particular del Teorema de Taylor, se presentan los elementos necesarios para construir el método de Euler. Teorema 10. Sea f : [a, b] → R una función tal que f 0 (x) existe, es continua y f 00 (x) existe en (a, b). Entonces, para x, x0 ∈ [a, b] existe ξ tal que f (x) = f (x0 ) + f 0 (x0 )(x − x0 ) + f 00 (ξ) (x − x0 )2 2 Ahora, la idea del método de Euler, consiste en construir una serie de puntos (t0 , y0 ), (t1 , y1 ), . . . (tn , yn ) tales que tn = b y yn sea la aproximación de y(b). t0 t1 t2 . . . tn = b La primera inquietud a resolver es ¿cúales son los ti que se deben escoger? Para dar respuesta, recordar que al tener un problema de valor inicial dy = f (t, y) dt sujeto a: a≤t≤b y(a) = α Si se conoce que ti ∈ [a, b] y(a) = α entonces una selección de los ti podrían ser valores que pertenezcan al intervalo [a, b] tales que ti < ti+1 , t0 = a, tn = b y además la distancia entre ti y ti+1 constante1 . Ejemplo 33. En el intervalo [1, 3] seleccionar de manera uniforme cinco valores tales que x0 = 1 y x5 = 3. 1 Este tipo de selección se denomina uniforme. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 86 — #88 i 86 i CAPÍTULO 4. ECUACIONES DIFERENCIALES Solución: dado que se conoce que el primer valor es t0 = 1 y el último valor es t10 = 3, entonces para construir los siguientes puntos se utiliza la formula ti = t0 + ih con i = 1, 2 . . . , N − 1 donde h = b−a N , N corresponde con la cantidad de puntos a construir y a, b son los extremos del intervalo. En este caso a = 1, b = 3, N = 5 y por tanto h = 3−1 5 = 0.4 y ti = 1 + 0.4i ♦ con lo cual se construyen los puntos ti 1 1.4 1.8 2.2 2.6 3 Luego de seleccionar ti de manera uniforme, la siguiente pregunta es ¿qué valor corresponde a yi para cada ti ? Para lo anterior, suponer que y(t) es la solución del problema de valor inicial dy = f (t, y) dt sujeto a: a≤t≤b y(a) = α y adicionalmente y(t) cumple las hipótesis del teorema 10. Entonces para ti y ti+1 se tiene y(ti+1 ) = y(ti ) + y 0 (ti )(ti+1 − ti ) + y dado que y 0 (t) = dy dt y 00 (ξ) (ti+1 − ti )2 2 = f (t, y) entonces y(ti+1 ) = y(ti ) + f (ti , y(ti )) (ti+1 − ti ) + y 00 (ξ) (ti+1 − ti )2 2 Ahora, ti+1 − ti = h pues los ti fueron seleccionados de manera uniforme, y(ti+1 ) = y(ti ) + f (ti , y(ti )) h + y 00 (ξ) (ti+1 − ti )2 2 y por tanto y(ti+1 ) ≈ y(ti ) + f (ti , y(ti ))h Si se toma y(ti ) = yi , entonces yi+1 ≈ yi + hf (ti , yi ) que corresponde a una relación recursiva, entre los yi que se están buscando. Como y0 es la imagen de t0 = a y y(a) = α, entonces y0 = α. Así, el método de Euler corresponde a: y0 = α yi+1 = yi + f (ti , yi )h (4.2) i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 87 — #89 i 4.1. PROBLEMAS DE VALOR INICIAL i 87 Ejemplo 34. Utilizar el método de Euler aproximar la solución al problema de valor inicial y 0 = (2 − y)t 1≤t≤3 sujeto a: y(1) = −5 Solución: para utilizar el método de Euler, se ejecutan los siguientes pasos. Paso 1. Seleccionar ti de manera uniforme. En este caso el intervalo es [1, 3] y se desean 10 puntos, 3−1 luego h = b−a N = 10 = 0.2 y por lo tanto ti 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 Paso 2. Calcular los yi . Para esto se utiliza el esquema recursivo definido en la ecuación 4.2 que corresponde, en este caso, a y0 = −5 yi+1 = yi + 0.2[(2 − yi )ti ] luego ti yi 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 -5 -3.6 -2.256 -1.0643 -0.083 0.6664 1.1998 1.5519 1.7669 1.8881 1.9507 ♦ Se debe anotar que la cantidad de ti no es determinada y corresponde a posibilidades computacionales, pues para obtener buenos resultados se debe seleccionar una gran cantidad de puntos. Ejemplo 35. Aplicar el método de Euler aproximar la solución del problema de valor inicial y 0 = 2 − 0.2t 0≤t≤3 sujeta a: y(0) = 50 Solución: al ejecutar los pasos descritos anteriormente se obtiene: i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 88 — #90 i 88 i CAPÍTULO 4. ECUACIONES DIFERENCIALES Paso 1. Seleccionar ti de manera uniforme, en este caso 5 puntos, luego h = tanto ti 0 0.6 1.2 1.8 2.4 b−a N = 3−0 5 = 0.6, y por 3 Paso 2. Calcular los yi utilizando el esquema recursivo 4.2, se tiene y0 = 50 yi+1 = yi + 0.6[(2 − ti )] luego ti yi 0 0.6 1.2 1.8 2.4 3 50 51.2 52.328 53.384 54.368 55.28 Ahora, si se utilizan 10 puntos, entonces ti yi 0 0.3 0.6 0.9 1.2 1.5 1.8 2.1 2.4 2.7 3 50 50.6 51.182 51.746 52.292 52.82 53.33 53.822 54.296 54.752 55.19 de donde una aproximación de y(3) es 55.28 en el primer caso, y 55.19 en el segundo caso, que corresponde a un valor más cercano al real y(3) = 55.1. ♦ 4.1.2. Orden del método de Euler El método de Euler se obtuvo de la expansión en series de la función alrededor de x = 0 (serie de Maclaurin). En el caso más general, si la función se conoce completamente en cierto valor x = x0 , la expansión en series de potencia (serie de Taylor) es: f (x0 + ∆x) = f (x0 ) + f 0 (x0 )∆x + f 00 (x0 ) f 000 (x0 ) ∆x2 + ∆x3 + · · · , 2! 3! i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 89 — #91 i 4.1. PROBLEMAS DE VALOR INICIAL i 89 donde se supone que ∆x es un paso muy pequeño adelante del valor x0 (de manera práctica |∆x| 1). Como se pudo observar en un ejemplo de la sección pasada, si ∆x es pequeño, su cuadrado lo es más aún, y por lo tanto el método comete un error “más pequeño”. Pero entre más pequeño sea el intervalo, mayor es el gasto computacional y más cercano se está del épsilon de la máquina, que entre otros errores puede inducir a divisiones por cero. Por lo tanto, hay que balancear entre el error que se comete y tamaño del paso. En el método de Euler, la serie se corta en el segundo término, y por tanto el error lo domina el tercer término: f 00 (ξ) f (x0 + ∆x) ≈ f (x0 ) + f 0 (x0 )∆x + ∗ ∆x2 , 2! 00 donde ese “ f 2!(ξ) ∗ ∆x2 ” es el error que se comente en cada paso. Así, el método de Euler comete un error de orden ∆x2 en cada paso. El error total cuando se han dado N pasos, es: Etotal = (Error de cada paso) × N, donde el número de pasos N , es la longitud del intervalo de trabajo, |b − a|, divida entre el paso ∆x, y por tanto: f 00 (ξ) |b − a| Etotal ≈ ∗ ∆x2 ∗ . 2! ∆x Al cancelar y reunir todas las constantes en una, se obtiene Etotal ≈ Cte ∗ ∆x. Debido a que el error total es proporcional a ∆x, se dice que el método de Euler es de orden 1. En lo sucesivo se construirán métodos que mejoren la precisión, de orden mayor, sin sacrificar el tamaño del paso, es decir, sin tener que tomar ∆x muy pequeños, que obliguen a dar muchos pasos y/o que expongan el cálculo por estar muy cerca al épsilon de la máquina. 4.1.3. Método de Verlet La expresión de este método se obtiene a partir de dos expansiones de Taylor, una hacia adelante y otra hacia atrás, f (x0 + ∆x) = f (x0 ) + f 0 (x0 )∆x + f 00 (x0 ) f 000 (x0 ) f (4) (x0 ) ∆x2 + ∆x3 + ∆x4 · · · , 2! 3! 4! f (x0 − ∆x) = f (x0 ) − f 0 (x0 )∆x + f 00 (x0 ) f 000 (x0 ) f (4) (x0 ) ∆x2 − ∆x3 + ∆x4 · · · , 2! 3! 4! al sumar, f (x0 + ∆x) + f (x0 − ∆x) = 2f (x0 ) + f 00 (x0 )∆x2 + 2 f (4) (x0 ) ∆x4 · · · 4! f (x0 + ∆x) = 2f (x0 ) − f (x0 − ∆x) + f 00 (x0 )∆x2 + 2 f (4) (x0 ) ∆x4 · · · 4! Al despejar, Cortando está última en el tercer término, f (x0 + ∆x) ≈ 2f (x0 ) − f (x0 − ∆x) + f 00 (x0 )∆x2 , i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 90 — #92 i 90 i CAPÍTULO 4. ECUACIONES DIFERENCIALES da origen a la conocida fórmula recursiva, llamada método de Verlet. yi+1 = 2yi − yi−1 + yi00 h2 . Esta fórmula es de amplia aplicación en física, en la cual la primera derivada de la posición respecto al tiempo corresponde a la velocidad y la segunda a la aceleración. Observar que la fórmula recursiva no depende de la primera derivada (velocidad), pero sí de la segunda derivada, la aceleración. La anterior situación abarca una gran cantidad de problemas físicos en los que la evolución temporal de la posición no depende del valor de la velocidad. Aunque a simple vista el método de Verlet demuestra sus ventajas, tiene un pequeño problema: es necesario el dato y−1 no disponible para calcular la primera entrada de la tabla. Dado lo anterior, es necesario implementar un arranque. A partir de la expansión de Taylor hacia atrás 1 y−1 = y0 − y00 h + y000 h2 2 se completa la construcción de el método para solucionar el problema y 00 = F (y) con condiciones iniciales y0 = α y y00 = β: y0 = α 1 y−1 = y0 − βh + F (y0 ) h2 (arranque) 2 yi+1 = 2yi − yi−1 + F (yi ) h2 (4.3) Ejemplo 36. Aplicar el método de Verlet para aproximar la caída libre de un cuerpo que es soltado desde una altura de 100 m. Comparar los resultados con la solución analítica y con la aproximación de Euler. Solución: la caída libre se enuncia como el problema de valor inicial: y 00 = −9.8 0 ≤ t ≤ 4.5 y(0) = 100 y 0 (0) = 0 Al aplicar el método Verlet se obtiene el esquema iterativo y0 = 100 y−1 = 100 − 4.9h2 (arranque) yi+1 = 2yi − yi−1 − 4.9h2 donde la figura 4.2 resume los resultados numéricos, y también expone las diferencias entre los métodos de Verlet, Euler y la solución analítica al problema. ♦ 4.1.4. Error del método de Verlet Para analizar el error, se debe observar que antes de cortar la serie, el error lo domina el término ∆x4 : f (x0 + ∆x) ≈ 2f (x0 ) − f (x0 − ∆x) + f 00 (x0 )∆x2 , + f (iv) (ξ) ∗ ∆x4 , 4! i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 91 — #93 i 4.1. PROBLEMAS DE VALOR INICIAL i 91 Figura 4.2: aproximación de la caída libre de un cuerpo. luego en cada paso, el método de Verlet, comete un error de orden ∆x4 . El error total cuando se han dado N pasos, es: |b − a| f (iv) (ξ) ∗ ∆x4 ∗ , Etotal ≈ 4! ∆x cancelando y reuniendo todas las constantes en una, Etotal ≈ Cte ∗ ∆x3 , se concluye que método de Verlet es de orden 3. Ejercicios 13 2 cos t 1. Encontrar la solución general de la ecuación diferencial lineal de primer orden y 0 + y = t t 2. Encontrar la solución general de la ecuación diferencial lineal de primer orden ty 0 + (t + 1)y = t 3. Encontrar la solución general de la ecuación diferencial lineal de primer orden: t3 y 0 + 4t2 y = e−t 4. Utilizar el método de Euler para aproximar la solución de los siguientes problemas de valor inicial. a) y 0 = −y, 0 ≤ t ≤ 1, y(0) = 5 con N = 10. b) y 0 = −2y + t, 1 ≤ t ≤ 3, y(1) = 2 con N = 20. c) y 0 = yt , −3 ≤ t ≤ −1, y(−3) = 2 con N = 100. d) y 0 = cos(2t) + sin(3t), 0 ≤ t ≤ 1, y(0) = 2 con h = 0.0001. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 92 — #94 i 92 i CAPÍTULO 4. ECUACIONES DIFERENCIALES 5. Dado el problema de valor inicial y0 = 2 y + e−t t 2≤t≤4 sujeto a: y(2) = 0 a) Utilizar el método de Euler, con N = 10, para aproximar su solución. b) Con los resultados del numeral a), construir el interpolador de Newton y aproximar y(2.05), y(0.1) y y(3.975). 6. Dado el problema de valor inicial y 0 = −2ty 0≤t≤1 sujeto a: y(0) = 1 si se conoce el valor correcto de y(1) = e−1 , determinar cuántos puntos son necesarios en el método de Euler para obtener una aproximación con un error inferior a 10−2 . 7. Si se conoce que la velocidad de un auto esta dada por (5 − 0.4t) km s y su posición inicial es x(0) = 30 km, utilizar el método de Euler para aproximar la posición del auto a los 5 segundos. 8. En el circuito que se muestra en la figura 4.3, el voltaje vC a través del condensador se encuentra dvC vC dado por C + = 0. Si C = 10−6 F, R = 106 Ω y se tiene la condición inicial vC (0) = 5, dt R usar el método de Euler con N = 10 para aproximar vC (1). + vC C R − Figura 4.3: circuito RC. 9. Encontrar la solución general de la ecuación diferencial y 00 + 2y 0 − 3y = 0. 10. Encontrar la solución general de la ecuación diferencial y 00 + 2y 0 + y = 0. 11. Encontrar la solución general de la ecuación diferencial 4y 00 + 12y 0 + 9y = 0. 12. Utilizar el método de Verlet para aproximar la solución de los siguientes problemas de valor inicial. a) y 00 = y, 0 ≤ t ≤ 1, y(0) = 1, y 0 (0) = 1 con N = 10. b) y 00 = −y, 0 ≤ t ≤ 1, y(0) = 1, y 0 (0) = 0 con N = 10. c) y 00 = 4y, 0 ≤ t ≤ 2, y(0) = 0, y 0 (0) = 14 con N = 20. d) y 00 = −9y, 0 ≤ t ≤ 2, y(0) = 1, y 0 (0) = 6 con N = 20. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 93 — #95 i 4.1. PROBLEMAS DE VALOR INICIAL 4.1.5. i 93 Métodos de Runge-Kutta orden 2 En la búsqueda de métodos más precisos en la solución de problemas de valor inicial, los métodos de Runge-Kutta ofrecen la mejor alternativa. Estos métodos a diferencia de otros, como sucede con los métodos de Taylor, evitan el cálculo de derivadas, lo cual permite su fácil implementación. Para entender el origen de los métodos de Runge-Kutta observar la serie de Taylor: y(t) = y(ti ) + y 0 (ti )(t − ti ) + y 00 (ti ) 1 (t − ti )2 + y 000 (ti )(t − ti )3 + · · · 2! 3! Ahora, al evaluar en ti + h, se obtiene: y(ti + h) = y(ti ) + y 0 (ti )(ti + h − ti ) + 1 1 00 y (ti )(ti + h − ti )2 + y 000 (ti )(ti + h − ti )3 + · · · 2! 3! y al simplificar se concluye que y(ti + h) = y(ti ) + h y 0 (ti ) + h3 h2 00 y (ti ) + y 000 (ti ) + · · · 2! 3! (4.4) Se podría pensar que entre más términos de la serie se tomen, la aproximación de y(ti + h) es más exacta, y aunque lo anterior es cierto, no es aplicable por la dificultad de calcular las derivadas. En los métodos de Runge-Kutta, la idea es determinar expresiones que aproximen los primeros términos de la serie de Taylor y que su cálculo no conlleve el manejo de derivadas. Para comprender esta idea, observar la siguiente deducción de un método de Runge-Kutta de orden 2. Sea g(x, y) una función de dos variables. Si existen todas sus derivadas parciales de orden menor o igual a dos y son continuas en un dominio D = {(x, y) | a ≤ x ≤ b, c ≤ y ≤ d}, entonces para (x0 , y0 ) ∈ D y (x, y) ∈ D existen ξ entre x0 y x, y µ entre y0 y y tales que g(x, y) = g(x0 , y0 ) + ∂g ∂x (x0 ,y0 ) · (x − x0 ) + ∂g ∂y (x0 ,y0 ) · (y − y0 ) + R2 (x, y) donde 2 ∂2g 1 X 2 R2 (x, y) = 2! j=0 j ∂x2−j ∂y j (ξ,µ) · (x − x0 )2−j (y − y0 )j ∂g ∂g (x ,y ) · (x − x0 ) + ∂y (x0 ,y0 ) · (y − y0 ) se le denomina polinomio ∂x 0 0 de Taylor de orden 1 de la función g(x, y) alrededor del punto (x0 , y0 ). A la función P1 (x, y) = g(x0 , y0 ) + Ejemplo 37. Dada g(x, y) = cos(x) + sin(y), (x0 , y0 ) = ( π3 , π6 ), entonces su polinomio de Taylor de orden 1 es: π π ∂g π ∂g π P1 (x, y) = g , + · x − + · y − π π π π 3 6 ∂x ( 3 , 6 ) 3 ∂y ( 3 , 6 ) 6 √ √ 3 π 3 π =1− x− + y− 2 3 2 6 Ahora, si de la serie 4.4 se toman los tres primeros términos, entonces: y(ti + h) ≈ y(ti ) + h y 0 (ti ) + h2 00 y (ti ) 2 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 94 — #96 i 94 i CAPÍTULO 4. ECUACIONES DIFERENCIALES Dado que y 0 = f (t, y) en un problema de valor inicial, se tiene que y(ti + h) ≈ y(ti ) + hf (ti , yi ) + y al usar que f 0 (t, y) = ∂f dt ∂t dt + ∂f dy ∂y dt , h2 0 f (ti , yi ) 2 se tiene que: h2 y(ti + h) ≈ y(ti ) + hf (ti , yi ) + 2 ∂f ∂t (ti ,yi ) ∂f + ∂y (ti ,yi ) dy · |t dt i lo cual es equivalente a ∂f dy h ∂f y(ti + h) ≈ y(ti ) + h f (ti , yi ) + |t (t ,y ) + (t ,y ) · 2 ∂t i i ∂y i i dt i ∂f + · f (t , y ) = y(ti ) + h f (ti , yi ) + h2 ∂f i i (t ,y ) (t ,y ) i i i i ∂t ∂y Si se aproxima f (ti , yi ) + h2 ∂f ∂t (ti ,yi ) + función a1 f (ti + α1 , yi + β1 ) se tiene h ∂f 2 ∂y (ti ,yi ) · f (ti , yi ) con la serie de Taylor de orden 1 de la P1 (ti , yi ) = a1 f (ti , yi ) + a1 α1 h ∂f 2 ∂t (ti ,yi ) ∂f ∂t (ti ,yi ) + a 1 β1 ∂f ∂y (ti ,yi ) y β1 = h2 f (ti , yi ) y por tanto h ∂f h h + (t ,y ) · f (ti , yi ) ≈ f ti + , y1 + f (ti , yi ) 2 ∂y i i 2 2 de donde se concluye que a1 = 1, α1 = f (ti , yi ) + (4.5) h 2 Al reemplazar en la ecuación 4.5 se tiene y(ti + h) ≈ y(ti ) + hf h h ti + , yi + f (ti , yi ) , 2 2 lo cual origina el siguiente método para aproximar la solución de un problema de valor inicial: Método del punto medio: y0 = α yi+1 h h = yi + hf ti + , yi + f (ti , yi ) 2 2 (4.6) Ejemplo 38. Utilizando el método del punto medio, aproximar la solución del problema de valor inicial y 0 = −2ty 0≤t≤1 sujeto a: y(0) = 1 Solución: para utilizar el método, se aplican los siguientes pasos: Paso 1. Seleccionar ti de manera uniforme, para este ejemplo se seleccionan 5 puntos, luego h = b−a 1−0 N = 5 = 0.2 y por tanto i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 95 — #97 i 4.1. PROBLEMAS DE VALOR INICIAL ti i 95 0 0.2 0.4 0.6 0.8 1 Paso 2. Calcular los yi utilizando el esquema recursivo definido en 4.6, que para propósitos de cálculo se puede expresar como: y0 = α k1 = hf (ti , yi ) h 1 yi+1 = yi + hf ti + , yi + k1 2 2 y que corresponde para este caso a y0 = 1 k1 = h (−2ti yi ) h 1 yi+1 = yi + h −2 ti + yi + k1 2 2 En el cuadro 4.1 se presentan los resultados del método y al comparar con la solución real (cuadro 4.2) del problema de valor inicial, se evidencia la precisión del método. ti yi 0 0.2 0.4 0.6 0.8 1 1 0.96 0.8494 0.6931 0.5223 0.3643 Cuadro 4.1: aproximación del problema y 0 = −2ty. ti yi 0 0.2 0.4 0.6 0.8 1 1 0.9607 0.8521 0.6976 0.5272 0.3678 Cuadro 4.2: solución real del problema y 0 = −2ty. ♦ Este método, en comparación con el método de Euler, presenta una mejor aproximación de la solución de un problema de valor inicial. Es posible obtener otros métodos de Runge-Kutta orden 2 con las ideas desarrolladas en la deducción del método del punto medio, entre los cuales se tienen los siguientes. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 96 — #98 i 96 i CAPÍTULO 4. ECUACIONES DIFERENCIALES Método modificado de Euler: y0 = α k1 = hf (ti , yi ) 1 yi+1 = yi + (k1 + hf (ti+1 , yi + k1 )) 2 Método de Heun: y0 = α k1 = hf (ti , yi ) 1 2 2 yi+1 = yi + k1 + 3hf ti + h, yi + k1 4 3 3 Ejemplo 39. Utilizar el método modificado de Euler y el de Heun con N = 5, para aproximar soluciones del problema de valor inicial y 0 = −3t2 (y + 1) 1≤t≤2 sujeto a: y(1) = −2 cuya solución real es y(t) = −e−t 3 +1 − 1. Solución: dado que N = 5 entonces h = 0.2. En el cuadro 4.3 se resumen los resultados. ti y(ti ) Método modificado de Euler Error Método de Heun Error 1 1.2 1.4 1.6 1.8 2 -2 -1.4828 -1.1748 -1.0452 -1.0079 -1.0009 -2 -1.0088 -0.9953 -1.0058 -0.9869 -1.0457 0 0.4740 0.1794 0.0393 0.02103 0.0448 -2 -1.5032 -1.2238 -1.1068 -1.0692 -1.0701 0 0.0203 0.0490 0.0616 0.0613 0.0692 Cuadro 4.3: solución del problema y 0 = −3t2 (y + 1). ♦ Se debe anotar que, en el ejemplo anterior, conocer la solución exacta solamente permite medir el error entre los métodos. En la práctica se asume que la solución exacta es desconocida y no se desea conocer sino aproximar. Ejercicios 14 1. Utilizar el método del punto medio para aproximar la solución de los siguientes problemas de valor inicial. a) y 0 = −2t + yt, 1 ≤ t ≤ 2, y(1) = −3; con N = 5 b) y 0 = −2e−ty , 0 ≤ t ≤ 3, y(0) = 1; con N = 10 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 97 — #99 i 4.1. PROBLEMAS DE VALOR INICIAL i 97 c) y 0 = −2 cos(2t) + sin(y), −2 ≤ t ≤ −1, y(−1) = 0; con N = 10 d) y 0 = 1 + y/t, −2.5 ≤ t ≤ −0.5, y(−2.5) = 1; con N = 10 e) y 0 = 5t2 − 3t + e−t , 2 ≤ t ≤ 4, y(2) = 2; con N = 15 2. Repetir el primer ejercicio aplicando el método modificado de Euler. 3. Repetir el primer ejercicio aplicando el método de Heun. 4. Sea y 0 = y 2 t3/2 sujeto a: 4≤t≤5 y(4) = 5 un problema de valor inicial. a) Aproximar la solución utilizando h = 0.001 y el método de Heun. b) Utilizar los resultados del numeral anterior para construir el interpolador de mínimos cuadrados y aproximar y(4.2367), y(4.56982) y y(4.12563). c) Si conoce que la solución exacta es y(t) = aproximados en el numeral anterior. 5 , 65−2t5/2 comparar los resultados reales con los 5. Sea y 0 = −y + t + 1 0≤t≤1 sujeto a: y(0) = 1 un problema de valor inicial. Para cualquier elección de h, mostrar que los métodos de Euler y Heun dan las mismas aproximaciones a la solución de dicho problema de valor inicial. 6. Utilizar algún método de esta sección para aproximar Z 1 sin √ x dx 0 Z Sugerencia: Definir y(t) = t sin √ x dx y utilizar el teorema fundamental del cálculo para 0 construir un problema de valor inicial. 4.1.6. Método de Runge-Kutta orden 4 (RK4) El método de Runge-Kutta de orden 4 (RK4) es uno de los métodos más utilizados en la práctica. Su deducción sigue las ideas de los métodos de Runge-Kutta orden 2 y como los anteriores métodos, es un método recursivo y su cálculo no implica utilizar información adicional como ocurre en los métodos de Taylor. Su esquema se encuentra a continuación. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 98 — #100 i 98 i CAPÍTULO 4. ECUACIONES DIFERENCIALES Método de Runge-Kutta de orden 4: y0 = α k1 = hf (ti , yi ) h k2 = hf ti + , yi + 2 h k3 = hf ti + , yi + 2 1 k1 2 1 k2 2 k4 = hf (ti+1 , yi + k3 ) 1 yi+1 = yi + (k1 + 2k2 + 2k3 + k4 ) 6 Ejemplo 40. Utilizar el método de Runge-Kutta de orden 4 para aproximar la solución del siguiente problema de valor inicial. y 0 = −3(t2 − 1)(y + ty) 0≤t≤1 sujeto a: y(0) = −2 con N = 10. Solución: como N = 10 se tiene que h = 0.2. En el cuadro 4.4 se resumen los resultados donde y(ti ) representa el valor real. ♦ ti y(ti ) RK4 Error 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 -2 -2.10585459 -2.227013791 -2.369294038 -2.539123488 -2.743606354 -2.990594002 -3.288763537 -3.647704642 -4.078015556 -4.591409142 -2 -2.105854583 -2.227013731 -2.369293871 -2.539123149 -2.743605763 -2.990593068 -3.288762149 -3.647702672 -4.078012852 -4.591405528 0 7.04491E-09 5.93929E-08 1.66495E-07 3.3929E-07 5.9041E-07 9.34419E-07 1.38808E-06 1.97065E-06 2.70422E-06 3.61412E-06 Cuadro 4.4: solución aproximada del problema y 0 = −3(t2 − 1)(y + ty). Aunque los resultados del cuadro 4.4 dan muestra de la precisión del método de Runge-Kutta orden 4 (RK4), un elemento no tan positivo, es la cantidad de evaluaciones de la función f (t, y) que utiliza este método en comparación con los métodos de Euler, modificado de Euler, punto medio y Heun. Otra característica del método RK4, radica en que sí en un método de Runge-Kutta orden 2 se utiliza un tamaño de paso h, entonces en el método RK4 es suficiente utilizar un tamaño de paso igual a 2h para alcanzar una mejor precisión. Lo anterior, de manera muy informal, brinda un equilibrio entre la cantidad de evaluaciones de la función f (t, y) entre los diferentes métodos. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 99 — #101 i 4.1. PROBLEMAS DE VALOR INICIAL i 99 Ejercicios 15 1. Utilizar el método de Runge-Kutta de orden 4 para aproximar la solución de las siguientes problemas de valor inicial. a) y 0 = −2t + yt, 1 ≤ t ≤ 2, y(1) = −3; con N = 5 b) y 0 = −2e−ty , 0 ≤ t ≤ 3, y(0) = 1; con N = 10 c) y 0 = −2 cos(2t) + sin(y), −2 ≤ t ≤ −1, y(−1) = 0; con N = 10 d) y 0 = 1 + y/t, −2.5 ≤ t ≤ −0.5, y(−2.5) = 1; con N = 10 e) y 0 = 5t2 − 3t + e−t , 2 ≤ t ≤ 4, y(2) = 2; con N = 15 Comparar los resultados con el uso del método de Heun. 2. Sea y 0 = y 2 t3/2 4≤t≤5 sujeto a: y(4) = 5 un problema de valor inicial. a) Aproximar la solución utilizando h = 0.05 y el método de Heun. b) Aproximar la solución utilizando h = 0.1 y el método RK4. Comparar con los resultados del numeral anterior. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 100 — #102 i 100 i CAPÍTULO 4. ECUACIONES DIFERENCIALES i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 101 — #103 i i Apéndices i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 102 — #104 i i i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 103 — #105 i i Apéndice A Tutorial de Python A.1. Generalidades Python es un lenguaje de programación de alto nivel, multi-paradigma y multi-propósito. Es un lenguaje interpretado donde se enfatiza la legibilidad del código, que permite un expresión rica en pocas líneas de código, y también es usado ampliamente por la comunidad. Estos últimos aspectos se pueden evidenciar con el tradicional programa “Hola Mundo”, que utiliza solamente una línea de código en Python: 1 print " Hola Mundo " Al ejecutar el anterior código en la consola interactiva (a explorar en más detalle en un instante), se obtiene, como es de esperar: Hola Mundo A.2. Salida Consola interactiva Al ser Python de naturaleza interpretada, las instrucciones escritas se van ejecutando una a una en la consola interactiva. Dicha consola indica con >>> que se encuentra lista para recibir un comando de entrada, mientras que ... indica la continuación de una línea. >>> x = 12 >>> y = 17 >>> z = 2*x+y**3 >>> z 4937 >>> 7**52 88124787089723195184393736687912818113311201L >>> 1/8 103 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 104 — #106 i 104 i APÉNDICE A. TUTORIAL DE PYTHON 0 >>> 1.0/8 0.125 >>> from math import * >>> sqrt(2) 1.4142135623730951 >>> exp(1) 2.718281828459045 >>> pi 3.141592653589793 A.3. Funciones La construcción de las funciones se hacen con la palabra clave def, seguida del nombre de la función y sus argumentos entre paréntesis. La construcción termina con : y en la siguiente línea, con una indentación (por convención de cuatro espacios en blanco) se prosigue al bloque donde se encuentra el cuerpo de la función. Como se verá más adelante en las estructuras de control, la indentación es fundamental en Python. 1 2 3 def␣f(entrada): ␣␣␣␣return␣entrada**3 print␣f(7) Salida 343 Sobre el tema de asignación de variables y otros identificadores, las siguientes palabras son reservadas por Python: and as assert break class continue def 1 2 3 4 del elif else except exec finally for from global if import in is lambda not or pass print raise return try while with yield A.4. Estructuras básicas de control A.4.1. if if␣x␣==␣y: ␣␣␣␣print␣" x␣es␣igual␣a␣y " else: ␣␣␣␣if␣x␣<␣y: i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 105 — #107 i A.5. EJEMPLOS 5 6 7 2 3 4 while i␣=␣1 while␣i␣<␣5: ␣␣␣␣print␣i*6␣+␣1 ␣␣␣␣i␣+=␣1 Salida 7 13 19 25 A.4.3. 1 2 for for␣i␣in␣range(5): ␣␣␣␣print␣i*i␣+␣1 Salida 1 2 5 10 17 1 2 3 4 5 105 ␣␣␣␣␣␣␣␣print␣" x␣es␣menor␣a␣y " ␣␣␣␣else: ␣␣␣␣␣␣␣␣print␣" x␣es␣mayor␣a␣y " A.4.2. 1 i A.5. Ejemplos A.5.1. Factorial def␣factorial(n): ␣␣␣␣if␣n␣==␣0: ␣␣␣␣␣␣␣␣return␣1 ␣␣␣␣else: ␣␣␣␣␣␣␣␣return␣n*factorial(n-1) 6 7 8 print␣factorial(5) print␣factorial(10) 120 3628800 Salida i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 106 — #108 i 106 A.5.2. 1 2 3 4 5 6 7 i APÉNDICE A. TUTORIAL DE PYTHON GCD def␣gcd(a,␣b): ␣␣␣␣if␣a␣==␣b: ␣␣␣␣␣␣␣␣return␣a ␣␣␣␣if␣b␣<␣a: ␣␣␣␣␣␣␣␣return␣gcd(a-b,␣b) ␣␣␣␣if␣b␣>␣a: ␣␣␣␣␣␣␣␣return␣gcd(a,␣b-a) 8 9 10 11 print␣gcd(75,␣60) print␣gcd(7,␣13) print␣gcd(1024,␣888) Salida 15 1 8 A.5.3. 1 2 3 4 5 6 7 ¿Es palíndromo? def␣espalin(palabra): ␣␣␣␣if␣len(palabra)␣<␣2: ␣␣␣␣␣␣␣␣return␣True ␣␣␣␣elif␣palabra[0]␣!=␣palabra[-1]: ␣␣␣␣␣␣␣␣return␣False ␣␣␣␣else: ␣␣␣␣␣␣␣␣return␣espalin(palabra[1:-1]) 8 9 10 11 12 print␣espalin(" python " ) print␣espalin(" no " ) print␣espalin(" y " ) print␣espalin(" anilina " ) Salida False False True True A.5.4. Numpy Numpy es un poderoso módulo de Python para cálculo científico matricial. Brinda a Python de una funcionalidad semejante a la de MATLAB. 1 2 import numpy as np from numpy.linalg import solve, inv i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 107 — #109 i A.5. EJEMPLOS i 107 3 4 5 6 7 8 9 10 11 a=np.array([[-1.1, 2.5], [1.3, 4.2]]) # crear matriz print a print a.transpose() # transpuesta print inv(a) # inversa b=np.array([2, -3]) print b s=solve(a, b) # solucionar el sistema de ecuaciones print s [[-1.1 2.5] [ 1.3 4.2]] [[-1.1 1.3] [ 2.5 4.2]] [[-0.53367217 0.31766201] [ 0.16518424 0.13977128]] [ 2 -3] [-2.02033037 -0.08894536] Salida Ejercicios 16 1. Calcular el valor de la expresión ln 4 + cos π 4 + q arctan 7 + π3 2. Diseñar una función que imprima los n primeros números triangulares, esto es, números de la n(n + 1) forma . 2 3. Dado un entero n, diseñar una función que retorne la suma de los dígitos de n. 4. Encontrar la solución del sistema de ecuaciones 2x + y − z = 2 2x − y + 2z = −1 x+y−z =3 ( n/2 si n 5. Dada la función f (n) = 3n + 1 si n ( m término de la sucesión ai = f (ai−1 ) es par , diseñar un procedimiento que retorne el i-ésimo es impar para i = 0 , donde m es un entero positivo arbitrario. para i > 0 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 108 — #110 i i i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 109 — #111 i i Apéndice B Compendio de algoritmos 1 2 B.1. Ecuaciones de una variable B.1.1. Bisección #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método de bisección y algunos casos de salida. 21 22 from math import * 23 24 25 26 def pol(x): return x**3+4*x**2-10 # retorna pol(x) = x3 + 4x2 − 10 27 28 109 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 110 — #112 i 110 29 30 i APÉNDICE B. COMPENDIO DE ALGORITMOS def trig(x): return x*cos(x-1)-sin(x) # retorna trig(x) = x cos(x − 1) − sin(x) 31 32 33 34 def pote(x): # retorna pote(x) = 7x − 13 return pow(7.0, x)-13 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 def bisec(f, a, b, tol, n): # Método de bisección i = 1 while i <= n: p = a+(b-a)/2.0 print " Iter = " , " %03d " % i, " ; p = " , " %.14f " % p if abs(f(p)) <= 1e-15 or (b-a)/2.0 < tol: return p i += 1 if f(a)*f(p) > 0: a = p else: b = p print " Iteraciones agotadas: Error! " return 51 52 53 54 # pol(x), a = 1.0, b = 2.0, T ol = 10−8 , N0 = 100 print " \n " +r" -- Bisecci \ ’ on funci \ ’ on pol(x): " +" \n " bisec(pol, 1.0, 2.0, 1e-8, 100) 55 56 57 58 # trig(x), a = 4.0, b = 6.0, T ol = 10−8 , N0 = 100 print " \n " +r" -- Bisecci \ ’ on funci \ ’ on trig(x): " +" \n " bisec(trig, 4.0, 6.0, 1e-8, 100) 59 60 61 62 # pote(x), a = 0, b = 2.0, T ol = 10−8 , N0 = 100 print " \n " +r" -- Bisecci \ ’ on funci \ ’ on pote(x): " +" \n " bisec(pote, 0.0, 2.0, 1e-8, 100) Salida -- Bisecci\'on funci\'on pol(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = 001 002 003 004 005 006 007 008 009 010 ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p = = = = = = = = = = 1.50000000000000 1.25000000000000 1.37500000000000 1.31250000000000 1.34375000000000 1.35937500000000 1.36718750000000 1.36328125000000 1.36523437500000 1.36425781250000 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 111 — #113 i B.1. ECUACIONES DE UNA VARIABLE Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = = = = 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p p p p = = = = = = = = = = = = = = = = = i 111 1.36474609375000 1.36499023437500 1.36511230468750 1.36517333984375 1.36520385742188 1.36521911621094 1.36522674560547 1.36523056030273 1.36522865295410 1.36522960662842 1.36523008346558 1.36522984504700 1.36522996425629 1.36523002386093 1.36522999405861 1.36523000895977 1.36523001641035 -- Bisecci\'on funci\'on trig(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = = = = = = = = = = = = = = = 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p p p p p p p p p p p p p p p = = = = = = = = = = = = = = = = = = = = = = = = = = = = 5.00000000000000 5.50000000000000 5.75000000000000 5.62500000000000 5.56250000000000 5.59375000000000 5.60937500000000 5.60156250000000 5.59765625000000 5.59960937500000 5.59863281250000 5.59912109375000 5.59936523437500 5.59924316406250 5.59930419921875 5.59933471679688 5.59931945800781 5.59931182861328 5.59931564331055 5.59931373596191 5.59931278228760 5.59931325912476 5.59931302070618 5.59931313991547 5.59931308031082 5.59931305050850 5.59931303560734 5.59931302815676 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 112 — #114 i 112 i APÉNDICE B. COMPENDIO DE ALGORITMOS -- Bisecci\'on funci\'on pote(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = = = = = = = = = = = = = = = B.1.2. 1 2 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p p p p p p p p p p p p p p p = = = = = = = = = = = = = = = = = = = = = = = = = = = = 1.00000000000000 1.50000000000000 1.25000000000000 1.37500000000000 1.31250000000000 1.34375000000000 1.32812500000000 1.32031250000000 1.31640625000000 1.31835937500000 1.31738281250000 1.31787109375000 1.31811523437500 1.31823730468750 1.31817626953125 1.31814575195312 1.31813049316406 1.31812286376953 1.31812667846680 1.31812477111816 1.31812381744385 1.31812334060669 1.31812310218811 1.31812322139740 1.31812328100204 1.31812325119972 1.31812323629856 1.31812322884798 Regula falsi #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 113 — #115 i B.1. ECUACIONES DE UNA VARIABLE 16 17 18 i 113 # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/> # --------------------------------------------------------------------- 19 20 # Implementación del método de regula falsi y algunos casos de salida. 21 22 from math import * 23 24 25 26 def pol(x): return x**3+4*x**2-10 # retorna pol(x) = x3 + 4x2 − 10 27 28 29 30 def trig(x): return x*cos(x-1)-sin(x) # retorna trig(x) = x cos(x − 1) − sin(x) 31 32 33 34 def pote(x): # retorna pote(x) = 7x − 13 return pow(7.0, x)-13 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 def regula(f, p0, p1, tol, n): # Método de Regula falsi i = 2 while i <= n: q0 = f(p0) q1 = f(p1) p = p1-(q1*(p1-p0))/(q1-q0) print " Iter = " , " %03d " % i, " ; p = " , " %.14f " % p if abs(p-p1) < tol: return p i += 1 q = f(p) if q*q1 < 0: p0 = p1 q0 = q1 p1 = p q1 = q print " Iteraciones agotadas: Error! " return 55 56 57 58 # pol(x), a = 1.0, b = 2.0, T ol = 10−8 , N0 = 100 print " \n " +r" -- Regula falsi funci \ ’ on pol(x): " +" \n " regula(pol, 1.0, 2.0, 1e-8, 100) 59 60 61 62 # trig(x), a = 4.0, b = 6.0, T ol = 10−8 , N0 = 100 print " \n " +r" -- Regula falsi funci \ ’ on trig(x): " +" \n " regula(trig, 4.0, 6.0, 1e-8, 100) 63 64 # pote(x), a = 0, b = 2.0, T ol = 10−8 , N0 = 100 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 114 — #116 i 114 65 66 i APÉNDICE B. COMPENDIO DE ALGORITMOS print " \n " +r" -- Regula falsi funci \ ’ on pote(x): " +" \n " regula(pote, 0.0, 2.0, 1e-8, 100) Salida -- Regula falsi funci\'on pol(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = 002 003 004 005 006 007 008 009 010 011 012 013 014 015 ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p = = = = = = = = = = = = = = 1.26315789473684 1.33882783882784 1.35854634182478 1.36354744004209 1.36480703182678 1.36512371788438 1.36520330366260 1.36522330198554 1.36522832702552 1.36522958967385 1.36522990694057 1.36522998666042 1.36523000669168 1.36523001172495 -- Regula falsi funci\'on trig(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = 002 003 004 005 006 007 008 009 010 ; ; ; ; ; ; ; ; ; p p p p p p p p p = = = = = = = = = 5.23565737472245 5.56947741050970 5.59762303531170 5.59922074987343 5.59930799603642 5.59931274963277 5.59931300860022 5.59931302270821 5.59931302347678 -- Regula falsi funci\'on pote(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = 002 003 004 005 006 007 008 009 010 011 012 013 014 ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p = = = = = = = = = = = = = 0.50000000000000 0.83505824110381 1.04516978342356 1.16884708035964 1.23819700824382 1.27586210147702 1.29593375501013 1.30651664223152 1.31206443941295 1.31496381829887 1.31647664069380 1.31726532550939 1.31767631153884 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 115 — #117 i B.1. ECUACIONES DE UNA VARIABLE Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = = = = B.1.3. 1 2 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p p p p = = = = = = = = = = = = = = = = = i 115 1.31789042821980 1.31800196593592 1.31806006455273 1.31809032641627 1.31810608866450 1.31811429854456 1.31811857469975 1.31812080195024 1.31812196202005 1.31812256624534 1.31812288095750 1.31812304487605 1.31812313025338 1.31812317472235 1.31812319788411 1.31812320994797 1.31812321623145 Newton #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método de Newton y algunos casos de salida. 21 22 from math import * 23 24 25 26 def expo(x): # retorna expo(x) = x2 + e−2x − 2xe−x return x**2+exp(-2*x)-2*x*exp(-x) 27 28 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 116 — #118 i 116 29 i APÉNDICE B. COMPENDIO DE ALGORITMOS d expo(x) dx return 2*x-2*exp(-2*x)-2*exp(-x)+2*x*exp(-x) def expoprima(x): 30 # retorna expoprima(x) = 31 32 33 34 def trig(x): # retorna trig(x) = cos(x) − x return cos(x)-x 35 36 37 def trigprima(x): # retorna trigprima(x) = return -sin(x)-1 38 d trig(x) dx 39 40 41 42 43 44 45 46 47 48 49 50 51 def newton(f, fprima, p0, tol, n): # Método de Newton i = 1 while i <= n: p = p0-f(p0)/fprima(p0) print " Iter = " , " %03d " % i, " ; p = " , " %.14f " % p if abs(p-p0) < tol: return p p0 = p i += 1 print " Iteraciones agotadas: Error! " return 52 53 54 55 # trig(x), trigprima(x), p0 = π4 , T ol = 10−10 , N0 = 100 print " \n " +r" -- Newton funci \ ’ on trig(x): " +" \n " newton(trig, trigprima, pi/4, 1e-10, 100) 56 57 58 59 # expo(x), expoprima(x), p0 = 4.0, T ol = 10−8 , N0 = 100 print " \n " +r" -- Newton funci \ ’ on expo(x): " +" \n " newton(expo, expoprima, 4.0, 1e-8, 100) Salida -- Newton funci\'on trig(x): Iter Iter Iter Iter = = = = 001 002 003 004 ; ; ; ; p p p p = = = = 0.73953613351524 0.73908517810601 0.73908513321516 0.73908513321516 -- Newton funci\'on expo(x): Iter Iter Iter Iter Iter = = = = = 001 002 003 004 005 ; ; ; ; ; p p p p p = = = = = 2.04496552490523 1.19690154878521 0.85332087193837 0.70348791030730 0.63370473523551 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 117 — #119 i B.1. ECUACIONES DE UNA VARIABLE Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = = = = = = = = = = B.1.4. 1 2 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p p p p p p p p p p = = = = = = = = = = = = = = = = = = = = = = = i 117 0.60003137481868 0.58349045862567 0.57529281785962 0.57121206025870 0.56917617940458 0.56815936124237 0.56765123244958 0.56739723809056 0.56727025841597 0.56720677295439 0.56717503131751 0.56715916077200 0.56715122556949 0.56714725798531 0.56714527419961 0.56714428230315 0.56714378635442 0.56714353837910 0.56714341450390 0.56714335239325 0.56714332139724 0.56714330535002 0.56714329778561 Secante #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método de la secante y algunos casos de salida. 21 22 from math import * i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 118 — #120 i 118 i APÉNDICE B. COMPENDIO DE ALGORITMOS 23 24 25 26 def trig(x): # retorna trig(x) = sin(2/x) return sin(2/x) 27 28 29 30 def pol(x): # retorna pol(x) = x3 − 2 return x**3-2 31 32 33 34 35 36 37 38 39 40 41 42 43 44 def secante(f, p0, p1, tol, n): # Método de la secante i = 2 while i <= n: p = p1-(f(p1)*(p1-p0))/(f(p1)-f(p0)) print " Iter = " , " %03d " % i, " ; p = " , " %.14f " % p if abs(p-p1) < tol: return p p0 = p1 p1 = p i += 1 print " Iteraciones agotadas: Error! " return 45 46 47 48 # pol(x), p0 = −3.0, p1 = 3.0,T ol = 10−10 , N0 = 100 print " \n " +r" -- Secante funci \ ’ on pol(x): " +" \n " secante(pol, -3.0, 3.0, 1e-10, 100) 49 50 51 52 # trig(x), p0 = 1.1, p1 = 0.8,T ol = 10−8 , N0 = 100 print " \n " +r" -- Secante funci \ ’ on trig(x): " +" \n " secante(trig, 1.1, 0.8, 1e-8, 100) Salida -- Secante funci\'on pol(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = 002 003 004 005 006 007 008 009 010 011 012 013 014 015 ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p = = = = = = = = = = = = = = 0.22222222222222 0.42693773824651 6.31355877988707 0.47191278930293 0.51591568078189 3.05938543642494 0.68216111845434 0.82340822908250 1.66897585774860 1.12142575196627 1.22112631430500 1.26462114511073 1.25977368664182 1.25992050148297 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 119 — #121 i B.1. ECUACIONES DE UNA VARIABLE Iter = Iter = i 119 016 ; p = 1.25992104995902 017 ; p = 1.25992104989487 -- Secante funci\'on trig(x): Iter Iter Iter Iter Iter Iter = = = = = = B.1.5. 1 2 002 003 004 005 006 007 ; ; ; ; ; ; p p p p p p = = = = = = 0.31616955314644 0.27916396598709 0.31832835636724 0.31830985629667 0.31830988618553 0.31830988618379 Punto fijo #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método del punto fijo y algunos casos de salida. 21 22 from math import * 23 24 25 26 def pote(x): # retorna pote(x) = 2−x return pow(2.0, -x) 27 28 29 30 def pol(x): # retorna pol(x) = return (x**2-1)/3 x2 −1 3 31 32 33 34 def puntofijo(f, p0, tol, n): i = 1 # Método del punto fijo i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 120 — #122 i 120 i APÉNDICE B. COMPENDIO DE ALGORITMOS while i <= n: p = f(p0) print " Iter = " , " %03d " % i, " ; p = " , " %.14f " % p if abs(p-p0) < tol: return p p0 = p i += 1 print " Iteraciones agotadas: Error! " return 35 36 37 38 39 40 41 42 43 44 45 46 47 # pol(x), p0 = 0.9,T ol = 10−10 , N0 = 100 print " \n " +r" -- Punto fijo funci \ ’ on pol(x): " +" \n " puntofijo(pol, 0.9, 1e-10, 100) 48 49 50 51 # pote(x), p0 = 0.5,T ol = 10−8 , N0 = 100 print " \n " +r" -- Punto fijo funci \ ’ on pote(x): " +" \n " puntofijo(pote, 0.5, 1e-8, 100) Salida -- Punto fijo funci\'on pol(x): Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = = = = = = = = = 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p p p = = = = = = = = = = = = = = = = -0.06333333333333 -0.33199629629630 -0.29659281974851 -0.30401089975788 -0.30252579094280 -0.30282604860481 -0.30276546142880 -0.30277769178860 -0.30277522311839 -0.30277572142187 -0.30277562083916 -0.30277564114182 -0.30277563704372 -0.30277563787092 -0.30277563770395 -0.30277563773766 -- Punto fijo funci\'on pote(x): Iter Iter Iter Iter Iter Iter Iter Iter = = = = = = = = 001 002 003 004 005 006 007 008 ; ; ; ; ; ; ; ; p p p p p p p p = = = = = = = = 0.70710678118655 0.61254732653607 0.65404086004207 0.63549784581337 0.64371864172287 0.64006102117724 0.64168580704300 0.64096353717796 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 121 — #123 i B.2. INTERPOLACIÓN Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter Iter 1 2 = = = = = = = = = = = = = = 009 010 011 012 013 014 015 016 017 018 019 020 021 022 ; ; ; ; ; ; ; ; ; ; ; ; ; ; p p p p p p p p p p p p p p = = = = = = = = = = = = = = i 121 0.64128450906659 0.64114185147174 0.64120525244986 0.64117707452884 0.64118959776687 0.64118403197862 0.64118650561396 0.64118540624078 0.64118589484183 0.64118567768987 0.64118577420003 0.64118573130743 0.64118575037045 0.64118574189816 B.2. Interpolación B.2.1. Lagrange #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del interpolador de Lagrange y algunos casos de salida. 21 22 from math import * 23 24 25 def LagrangePol(datos): 26 27 def L(k, x): # pol Lk (x) = Q i 6= k x−xi xk −xi i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 122 — #124 i 122 i APÉNDICE B. COMPENDIO DE ALGORITMOS out = 1.0 for i, p in enumerate(datos): if i != k: out *= (x-p[0])/(datos[k][0]-p[0]) return out 28 29 30 31 32 33 def P(x): 34 # polinomio P (x) = P f (xk )Lk (x) k lag = 0.0 for k, p in enumerate(datos): lag += p[1]*L(k, x) return lag 35 36 37 38 39 return P 40 41 42 43 44 45 46 # datos para f (x) = x1 con x0 = 2, x1 = 2.75 y x2 = 4 datosf = [(2.0, 1.0/2.0), (11.0/4.0, 4.0/11.0), (4.0, 1.0/4.0)] Pf = LagrangePol(datosf) print " \n " +r" -- Polinomio de Lagrange en x=3: " +" \n " print Pf(3) 47 48 49 50 51 52 53 # datos g(x) = sin(3x), x0 = 1, x1 = 1.3, x2 = 1.6, x3 = 1.9 y x4 = 2.2 datosg = [(1.0, 0.1411), (1.3, -0.6878), (1.6, -0.9962), (1.9, -0.5507), (2.2, 0.3115)] Pg = LagrangePol(datosg) print " \n " +r" -- Polinomio de Lagrange en x=1.5: " +" \n " print Pg(1.5) Salida -- Polinomio de Lagrange en x=3: 0.329545454545 -- Polinomio de Lagrange en x=1.5: -0.977381481481 B.2.2. 1 2 Diferencias divididas de Newton #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 123 — #125 i B.2. INTERPOLACIÓN 10 11 12 13 14 15 16 17 18 # # # # # # # # # i 123 the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del interpolador de Newton y algunos casos de salida. 21 22 23 from math import * from pprint import pprint 24 25 26 27 28 def NewtonPol(datos): n = len(datos)-1 F = [[0 for x in datos] for x in datos] # crear tabla nula 29 30 31 for i, p in enumerate(datos): F[i][0] = p[1] # condiciones iniciales 32 33 34 35 for i in range(1, n+1): # tabla de diferencias divididas for j in range(1, i+1): F[i][j] = (F[i][j-1]-F[i-1][j-1])/(datos[i][0]-datos[i-j][0]) 36 37 def L(k, x): # polinomio Lk (x) = Q (x − xi ) i ≤ k 38 39 40 41 42 out = 1.0 for i, p in enumerate(datos): if i <= k: out *= (x-p[0]) return out 43 44 45 46 47 48 Pn def P(x): # P (x) = f [x0 ] + k=1 f [x0 , x1 , . . . , xk ]Lk−1 (x) newt = 0.0 for i in range(1, n+1): newt += F[i][i]*L(i-1, x) return newt + F[0][0] 49 50 return F, P 51 52 53 54 55 56 57 datost = [(-1.0, 3.0), (0.0, -4.0), (1.0, 5.0), (2.0, -6.0)] T, P = NewtonPol(datost) print " \n Tabla de diferencias divididas: " pprint(T) print " \n Evaluar el polinomio en x=0 " print P(0.0) i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 124 — #126 i 124 i APÉNDICE B. COMPENDIO DE ALGORITMOS 58 59 60 61 62 63 64 datosf = [(2.0, 1.0/2.0), (11.0/4.0, 4.0/11.0), (4.0, 1.0/4.0)] T, P = NewtonPol(datosf) print " \n Tabla de diferencias divididas: " pprint(T) print " \n Evaluar el polinomio en x=3 " print P(3.0) Salida Tabla de diferencias divididas: [[3.0, 0, 0, 0], [-4.0, -7.0, 0, 0], [5.0, 9.0, 8.0, 0], [-6.0, -11.0, -10.0, -6.0]] Evaluar el polinomio en x=0 -4.0 Tabla de diferencias divididas: [[0.5, 0, 0], [0.36363636363636365, -0.1818181818181818, 0], [0.25, -0.09090909090909091, 0.04545454545454544]] Evaluar el polinomio en x=3 0.329545454545 B.2.3. 1 2 Trazadores cúbicos #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 125 — #127 i B.2. INTERPOLACIÓN 20 i 125 # Implementaci\’on de trazadores c\’ubicos naturales y algunos casos de salida. 21 22 from math import * 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 def CubicSplines(datos): n = len(datos)-1 # Inicializar vectores auxiliares A = [x[1] for x in datos] X = [x[0] for x in datos] H = [0.0 for x in range(n)] B = [0.0 for x in range(n+1)] C = [0.0 for x in range(n+1)] D = [0.0 for x in range(n+1)] alpha = [0.0 for x in range(n)] mu = [0.0 for x in range(n+1)] l = [1.0 for x in range(n+1)] z = [0.0 for x in range(n+1)] 38 39 40 41 # Crear vector H for i in range(n): H[i] = X[i+1]-X[i] 42 43 44 45 # Crear vector α for i in range(1, n): alpha[i] = (3.0/H[i])*(A[i+1]-A[i])-(3.0/H[i-1])*(A[i]-A[i-1]) 46 47 48 49 50 51 # Solucionar sistema tridiagonal for i in range(1, n): l[i] = 2.0*(X[i+1]-X[i-1])-H[i-1]*mu[i-1] mu[i] = float(H[i])/l[i] z[i] = (alpha[i]-H[i-1]*z[i-1])/float(l[i]) 52 53 54 55 56 57 # Solucionar sistema tridiagonal for j in range(n-1, -1, -1): C[j] = z[j]-mu[j]*C[j+1] B[j] = (A[j+1]-A[j])/float(H[j])-H[j]*(C[j+1]+2*C[j])/3.0 D[j] = (C[j+1]-C[j])/(3.0*H[j]) 58 59 60 # Retornar vectores A, B, C, D return A[:-1], B[:-1], C[:-1], D[:-1] 61 62 63 64 65 66 67 68 # Datos de prueba (1, 2), (2, 3), (3, 5) datosPrueba = [(1.0, 2.0), (2.0, 3.0), (3.0, 5.0)] a, b, c, d = CubicSplines(datosPrueba) print " \n Vectores de coeficientes: " print " A = " , a print " B = " , b print " C = " , c i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 126 — #128 i 126 69 i APÉNDICE B. COMPENDIO DE ALGORITMOS print " D = " , d 70 71 72 73 74 75 76 77 78 79 # Datos de prueba (0, 1), (1, e), (2, e2 ) y (3, e3 ) datosPrueba = [(0.0, exp(0.0)), (1.0, exp(1.0)), (2.0, exp(2.0)), (3.0, exp(3.0))] a, b, c, d = CubicSplines(datosPrueba) print " \n Vectores de coeficientes: " print " A = " , a print " B = " , b print " C = " , c print " D = " , d Salida Vectores de coeficientes: A = [2.0, 3.0] B = [0.75, 1.5] C = [0.0, 0.75] D = [0.25, -0.25] Vectores de coeficientes: A = [1.0, 2.718281828459045, 7.38905609893065] B = [1.465997614174723, 2.222850257027689, 8.809769654506473] C = [0.0, 0.756852642852966, 5.830066754625817] D = [0.252284214284322, 1.6910713705909506, -1.9433555848752724] B.2.4. 1 2 Recta de ajuste mínimos cuadrados #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación de la recta de mínimos cuadrados. i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 127 — #129 i B.2. INTERPOLACIÓN i 127 21 22 from math import * 23 24 25 26 27 28 29 30 def RectaMinSq(datos): X = sum([p[0] for p Y = sum([p[1] for p XX = sum([(p[0])**2 XY = sum([p[0]*p[1] m = len(datos) in datos]) in datos]) for p in datos]) for p in datos]) 31 32 33 34 35 36 def P(x): # recta de mínimos cuadrados a0 = float(Y*XX-X*XY)/float(m*XX-X**2) a1 = float(m*XY-X*Y)/float(m*XX-X**2) return a0+a1*x return P 37 38 39 40 41 def ErrorSq(f, datos): # Error cuadrático E = sum([(p[1]-f(p[0]))**2 for p in datos]) return E 42 43 44 45 46 47 48 49 50 # datos de prueba datos = [(-1.0, 2.0), (0.0, -1.0), (1.0, 1.0), (2.0, -2.0)] f = RectaMinSq(datos) print " Evaluar en x=1: " print f(1.0) print r" Error cuadr \ ’ atico: " print ErrorSq(f, datos) # calcular error cuadrático print " \n " 51 52 53 54 55 56 57 58 59 # datos de prueba datos = [(1.0, 1.3), (2.0, 3.5), (3.0, 4.2), (4.0, 5.0), (5.0, 7.0), (6.0, 8.8), (7.0, 10.1), (8.0, 12.5), (9.0, 13.0), (10.0, 15.6)] print " Evaluar en x=1: " print f(1.0) print r" Error cuadr \ ’ atico: " print ErrorSq(f, datos) # calcular error cuadr\’atico print " \n " Evaluar en x=1: -0.5 Error cuadr\'atico: 5.0 Salida Evaluar en x=1: -0.5 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 128 — #130 i 128 i APÉNDICE B. COMPENDIO DE ALGORITMOS Error cuadr\'atico: 2249.94 1 2 B.3. Sistemas de ecuaciones B.3.1. LU #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método LU y algunos casos de salida. 21 22 23 from math import * from pprint import pprint 24 25 26 27 28 29 30 def lu(A): n = len(A) # crear matrices nulas L = [[0.0 for x in range(n)] for x in range(n)] U = [[0.0 for x in range(n)] for x in range(n)] 31 32 33 34 # Doolittle L[0][0] = 1.0 U[0][0] = float(A[0][0]) 35 36 37 38 if abs(L[0][0]*U[0][0]) <= 1e-15: print " Imposible descomponer " return i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 129 — #131 i B.3. SISTEMAS DE ECUACIONES i 129 39 40 41 42 for j in range(1, n): U[0][j] = A[0][j]/L[0][0] L[j][0] = A[j][0]/U[0][0] 43 44 45 46 47 for i in range(1, n-1): L[i][i] = 1.0 s = sum([L[i][k]*U[k][i] for k in range(i)]) U[i][i] = float(A[i][i])-float(s) 48 49 50 51 if abs(L[i][i]*U[i][i]) <= 1e-15: print " Imposible descomponer " return 52 53 54 55 56 57 for j in range(i+1, n): s1 = sum([L[i][k]*U[k][j] for k in range(i)]) s2 = sum([L[j][k]*U[k][i] for k in range(i)]) U[i][j] = float(A[i][j])-float(s1) L[j][i] = (float(A[j][i])-float(s2))/float(U[i][i]) 58 59 60 61 L[n-1][n-1] = 1.0 s3 = sum([L[n-1][k]*U[k][n-1] for k in range(n)]) U[n-1][n-1] = float(A[n-1][n-1])-float(s3) 62 63 64 65 if abs(L[n-1][n-1]*U[n-1][n-1]) <= 1e-15: print " Imposible descomponer " return 66 67 68 69 70 71 print " Matriz L: \n " pprint(L) print print " Matriz U: \n " pprint(U) 72 73 74 75 76 77 78 79 A = [[4, 3], [6, 3]] print " Matriz A: \n " pprint(A) print lu(A) print " --------- " 80 81 82 83 84 85 86 A = [[0, 1], [1, 1]] print " Matriz A: \n " pprint(A) print lu(A) print " --------- " 87 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 130 — #132 i 130 88 89 90 91 92 93 i APÉNDICE B. COMPENDIO DE ALGORITMOS A = [[3, 1, 6], [-6, 0, -16], [0, 8, -17]] print " Matriz A: \n " pprint(A) print lu(A) print " --------- " 94 95 96 97 98 99 100 A = [[1, 2, 3], [2, 4, 5], [1, 3, 4]] print " Matriz A: \n " pprint(A) print lu(A) print " --------- " Matriz A: Salida [[4, 3], [6, 3]] Matriz L: [[1.0, 0.0], [1.5, 1.0]] Matriz U: [[4.0, 3.0], [0.0, -1.5]] --------Matriz A: [[0, 1], [1, 1]] Imposible descomponer --------Matriz A: [[3, 1, 6], [-6, 0, -16], [0, 8, -17]] Matriz L: [[1.0, 0.0, 0.0], [-2.0, 1.0, 0.0], [0.0, 4.0, 1.0]] Matriz U: [[3.0, 1.0, 6.0], [0.0, 2.0, -4.0], [0.0, 0.0, -1.0]] --------Matriz A: [[1, 2, 3], [2, 4, 5], [1, 3, 4]] i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 131 — #133 i B.3. SISTEMAS DE ECUACIONES i 131 Imposible descomponer --------- B.3.2. 1 2 Jacobi #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método de Jacobi y algunos casos de salida. 21 22 23 from math import * from pprint import pprint 24 25 26 27 def distinf(x, y): return max([abs(x[i]-y[i]) for i in range(len(x))]) 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 def Jacobi(A, b, x0, TOL, MAX): n = len(A) x = [0.0 for x in range(n)] k = 1 while k <= MAX: for i in range(n): if abs(A[i][i]) <= 1e-15: print " Imposible iterar " return s = sum([A[i][j]*x0[j] for j in range(n) if j != i]) x[i] = (b[i]-float(s))/float(A[i][i]) pprint(x) if distinf(x, x0) < TOL: print r" Soluci \ ’ on encontrada " i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 132 — #134 i 132 44 45 46 47 48 49 i APÉNDICE B. COMPENDIO DE ALGORITMOS return k += 1 for i in range(n): x0[i] = x[i] print " Iteraciones agotadas " return 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 A = [[2, 1], [5, 7]] b = [11, 13] x0 = [1, 1] print " Matriz A: \n " pprint(A) print print " Vector b: \n " pprint(b) print print " Semilla x0: \n " pprint(x0) print " \n " +r" Iteraci \ ’ on de Jacobi " # T OL = 10−5 , M AX = 50 Jacobi(A, b, x0, 1e-5, 50) 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 A = [[10, -1, 2], [-1, 11, -1], [2, -1, 10]] b = [6, 25, -11] x0 = [0, 0, 0] print " \n " +" Matriz A: \n " pprint(A) print print " Vector b: \n " pprint(b) print print " Semilla x0: \n " pprint(x0) print " \n " +r" Iteraci \ ’ on de Jacobi " # T OL = 10−10 , M AX = 50 Jacobi(A, b, x0, 1e-10, 50) Matriz A: Salida [[2, 1], [5, 7]] Vector b: [11, 13] Semilla x0: i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 133 — #135 i B.3. SISTEMAS DE ECUACIONES i 133 [1, 1] Iteraci\'on de Jacobi [5.0, 1.1428571428571428] [4.928571428571429, -1.7142857142857142] [6.357142857142857, -1.6632653061224494] [6.331632653061225, -2.683673469387755] [6.841836734693878, -2.6654518950437316] [6.832725947521865, -3.0298833819241984] [7.014941690962099, -3.0233756768013325] [7.0116878384006665, -3.1535297792586428] [7.076764889629321, -3.151205598857619] [7.075602799428809, -3.197689206878086] [7.098844603439043, -3.1968591424491493] [7.098429571224575, -3.213460431027888] [7.106730215513944, -3.2131639794461244] [7.106581989723062, -3.2190930110813887] [7.109546505540695, -3.2189871355164734] [7.1094935677582365, -3.221104646814782] [7.110552323407391, -3.2210668341130266] [7.110533417056513, -3.221823088148137] [7.110911544074068, -3.221809583611795] [7.110904791805897, -3.22207967433862] [7.11103983716931, -3.2220748512899258] [7.111037425644962, -3.2221713122637925] [7.1110856561318965, -3.2221695897464024] [7.111084794873201, -3.222204040094212] [7.111102020047106, -3.22220342490943] [7.111101712454715, -3.2222157286050757] [7.111107864302538, -3.2222155088962245] Soluci\'on encontrada Matriz A: [[10, -1, 2], [-1, 11, -1], [2, -1, 10]] Vector b: [6, 25, -11] Semilla x0: [0, 0, 0] Iteraci\'on de Jacobi [0.6, 2.272727272727273, -1.1] [1.0472727272727274, 2.227272727272727, -0.9927272727272728] [1.0212727272727273, 2.277685950413223, -1.0867272727272728] [1.0451140495867768, 2.266776859504132, -1.0764859504132231] i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 134 — #136 i 134 i APÉNDICE B. COMPENDIO DE ALGORITMOS [1.0419748760330578, 2.2698752817430505, -1.0823451239669422] [1.0434565529676934, 2.2690572501878283, -1.0814074470323065] [1.043187214425244, 2.2692771914486713, -1.0817855855747558] [1.0432848362598182, 2.269218329895499, -1.0817097237401818] [1.0432637777375864, 2.269234101138149, -1.0817351342624137] [1.0432704369662977, 2.269229876679561, -1.0817293454337025] [1.0432688567546966, 2.269231008321145, -1.0817310997253036] [1.0432693207771753, 2.26923070518449, -1.0817306705188248] [1.043269204622214, 2.269230786387123, -1.0817307936369862] [1.0432692373661094, 2.2692307646350205, -1.0817307622857304] [1.0432692289206482, 2.2692307704618524, -1.08173077100972] [1.043269231248129, 2.2692307689009934, -1.0817307687379443] [1.0432692306376883, 2.269230769319108, -1.0817307693595264] [1.043269230803816, 2.269230769207106, -1.081730769195627] [1.0432692307598361, 2.269230769237108, -1.0817307692400526] Soluci\'on encontrada B.3.3. 1 2 Gauss-Seidel #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método de Gauss-Seidel y algunos casos de salida. 21 22 23 from math import * from pprint import pprint 24 25 26 27 def distinf(x, y): return max([abs(x[i]-y[i]) for i in range(len(x))]) 28 29 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 135 — #137 i B.3. SISTEMAS DE ECUACIONES 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 i 135 def GaussSeidel(A, b, x0, TOL, MAX): n = len(A) x = [0.0 for x in range(n)] k = 1 while k <= MAX: for i in range(n): if abs(A[i][i]) <= 1e-15: print " Imposible iterar " return s1 = sum([A[i][j]*x[j] for j in range(i)]) s2 = sum([A[i][j]*x0[j] for j in range(i+1, n)]) x[i] = (b[i]-float(s1)-float(s2))/float(A[i][i]) pprint(x) if distinf(x, x0) < TOL: print r" Soluci \ ’ on encontrada " return k += 1 for i in range(n): x0[i] = x[i] print " Iteraciones agotadas " return 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 A = [[2, 1], [5, 7]] b = [11, 13] x0 = [1, 1] print " Matriz A: \n " pprint(A) print print " Vector b: \n " pprint(b) print print " Semilla x0: \n " pprint(x0) print " \n " +r" Iteraci \ ’ on de Gauss-Seidel " # T OL = 10−5 , M AX = 50 GaussSeidel(A, b, x0, 1e-5, 50) 66 67 68 69 70 71 72 73 74 75 76 77 78 A = [[10, -1, 2], [-1, 11, -1], [2, -1, 10]] b = [6, 25, -11] x0 = [0, 0, 0] print " \n " +" Matriz A: \n " pprint(A) print print " Vector b: \n " pprint(b) print print " Semilla x0: \n " pprint(x0) i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 136 — #138 i 136 79 80 81 i APÉNDICE B. COMPENDIO DE ALGORITMOS print " \n " +r" Iteraci \ ’ on de Gauss-Seidel " # T OL = 10−10 , M AX = 50 GaussSeidel(A, b, x0, 1e-10, 50) Matriz A: Salida [[2, 1], [5, 7]] Vector b: [11, 13] Semilla x0: [1, 1] Iteraci\'on de Gauss-Seidel [5.0, -1.7142857142857142] [6.357142857142857, -2.683673469387755] [6.841836734693878, -3.0298833819241984] [7.014941690962099, -3.1535297792586428] [7.076764889629321, -3.197689206878086] [7.098844603439043, -3.213460431027888] [7.106730215513944, -3.2190930110813887] [7.109546505540695, -3.221104646814782] [7.110552323407391, -3.221823088148137] [7.110911544074068, -3.22207967433862] [7.11103983716931, -3.2221713122637925] [7.1110856561318965, -3.222204040094212] [7.111102020047106, -3.2222157286050757] [7.111107864302538, -3.2222199030732415] Soluci\'on encontrada Matriz A: [[10, -1, 2], [-1, 11, -1], [2, -1, 10]] Vector b: [6, 25, -11] Semilla x0: [0, 0, 0] Iteraci\'on de Gauss-Seidel [0.6, 2.3272727272727276, -0.9872727272727273] [1.0301818181818183, 2.276628099173554, -1.0783735537190082] i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 137 — #139 i B.4. ECUACIONES DIFERENCIALES i 137 [1.043337520661157, 2.2695421788129226, -1.081713286250939] [1.0432968751314802, 2.2692348717164132, -1.0817358878546546] [1.0432706647425722, 2.269230434262538, -1.0817310895222607] [1.043269261330706, 2.269230742891677, -1.0817307779769734] [1.0432692298845623, 2.2692307683552353, -1.0817307691413889] [1.0432692306638014, 2.2692307692293103, -1.0817307692098292] [1.043269230764897, 2.2692307692322786, -1.0817307692297515] [1.043269230769178, 2.269230769230857, -1.0817307692307498] Soluci\'on encontrada 1 2 B.4. Ecuaciones diferenciales B.4.1. Euler #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método de Euler y algunos casos de salida. 21 22 from math import * 23 24 25 26 def test1(t, y): # return y-t**2+1 dy dt = y − t2 + 1 27 28 29 30 −4t − 2y def test2(t, y): # dy dt = 2 − e return 2.0-exp(-4*t)-2*y 31 32 33 def Euler(a, b, y0, f, N): i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 138 — #140 i 138 34 35 36 37 38 39 40 41 i APÉNDICE B. COMPENDIO DE ALGORITMOS h = (b-a)/float(N) t = a w = y0 print t, " --> " , w for i in range(1, N+1): w = w+h*f(t, w) t = a+i*h print t, " --> " , w 42 43 44 45 2 # dy dt = y − t + 1, a = 0, b = 2, y0 = 0.5, N = 10 print " \n " +r" M \ ’ etodo de Euler " +" \n " Euler(0, 2, 0.5, test1, 10) 46 47 48 49 −4t # dy − 2y, a = 0, b = 1, y0 = 1, N = 20 dt = 2 − e print " \n " +r" M \ ’ etodo de Euler " +" \n " Euler(0, 1, 1, test2, 20) Salida M\'etodo de Euler 0 --> 0.5 0.2 --> 0.8 0.4 --> 1.152 0.6 --> 1.5504 0.8 --> 1.98848 1.0 --> 2.458176 1.2 --> 2.9498112 1.4 --> 3.45177344 1.6 --> 3.950128128 1.8 --> 4.4281537536 2.0 --> 4.86578450432 M\'etodo de Euler 0 --> 1 0.05 --> 0.95 0.1 --> 0.914063462346 0.15 --> 0.88914111381 0.2 --> 0.872786420624 0.25 --> 0.863041330356 0.3 --> 0.858343225262 0.35 --> 0.85744919214 0.4 --> 0.859374424729 0.45 --> 0.863342156356 0.5 --> 0.868742996309 0.55 --> 0.875101932517 0.6 --> 0.882051581347 0.65 --> 0.889310525548 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 139 — #141 i B.4. ECUACIONES DIFERENCIALES i 139 0.7 --> 0.896665794082 0.75 --> 0.903958711543 0.8 --> 0.91107348697 0.85 --> 0.917928028074 0.9 --> 0.924466561769 0.95 --> 0.93065371947 1.0 --> 0.93646980893 B.4.2. 1 2 Verlet #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método de Verlet y algunos casos de salida. 21 22 from math import * 23 24 25 26 def test1(x): return x # d2 x dt2 =x def test2(x): return -x # d2 x dt2 = −x 27 28 29 30 31 32 33 34 35 36 37 38 def Verlet(a, b, x0, v0, f, N): h = (b-a)/float(N) p0 = x0 p1 = p0 + v0*h + 0.5*f(p0)*h**2 print a, " --> " , p0 for i in range(1, N+1): i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 140 — #142 i 140 i APÉNDICE B. COMPENDIO DE ALGORITMOS p = 2.0*p1-p0+f(p1)*h**2 print a+i*h, " --> " , p1 p0 = p1 p1 = p 39 40 41 42 43 2 44 45 46 # ddt2x = x, a = 0, b = 1, x0 = 1, v0 = 1, N = 20 print " \n " +r" M \ ’ etodo de Verlet " +" \n " Verlet(0, 1.0, 1.0, 1.0, test1, 20) 47 2 48 49 50 # ddt2x = −x, a = 0, b = 1, x0 = 1, v0 = 0, N = 20 print " \n " +r" M \ ’ etodo de Verlet " +" \n " Verlet(0, 1.0, 1.0, 0, test2, 20) Salida M\'etodo de Verlet 0 --> 1.0 0.05 --> 1.05125 0.1 --> 1.105128125 0.15 --> 1.16176907031 0.2 --> 1.2213144383 0.25 --> 1.28391309238 0.3 --> 1.3497215292 0.35 --> 1.41890426984 0.4 --> 1.49163427115 0.45 --> 1.56809335814 0.5 --> 1.64847267853 0.55 --> 1.73297318061 0.6 --> 1.82180611564 0.65 --> 1.91519356597 0.7 --> 2.0133690002 0.75 --> 2.11657785694 0.8 --> 2.22507815832 0.85 --> 2.3391411551 0.9 --> 2.45905200476 0.95 --> 2.58511048444 1.0 --> 2.71763174033 M\'etodo de Verlet 0 --> 1.0 0.05 --> 0.99875 0.1 --> 0.995003125 0.15 --> 0.988768742188 0.2 --> 0.98006243752 0.25 --> 0.968905976758 0.3 --> 0.955327251054 0.35 --> 0.939360207223 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 141 — #143 i B.4. ECUACIONES DIFERENCIALES i 141 0.4 --> 0.921044762873 0.45 --> 0.900426706617 0.5 --> 0.877557583594 0.55 --> 0.852494566612 0.6 --> 0.825300313213 0.65 --> 0.796042809032 0.7 --> 0.764795197827 0.75 --> 0.731635598629 0.8 --> 0.696646910433 0.85 --> 0.659916604962 0.9 --> 0.621536507978 0.95 --> 0.581602569724 1.0 --> 0.540214625046 B.4.3. 1 2 RK4 #!/usr/bin/env python # -*- coding: utf-8 -*- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # --------------------------------------------------------------------Compendio de algoritmos. Matemáticas para Ingeniería. Métodos numéricos con Python. Copyright (C) 2017 Los autores del texto. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --------------------------------------------------------------------- 19 20 # Implementación del método RK4 y algunos casos de salida. 21 22 from math import * 23 24 25 26 def test1(t, y): # return y-t**2+1 dy dt = y − t2 + 1 27 28 29 30 −4t − 2y def test2(t, y): # dy dt = 2 − e return 2.0-exp(-4*t)-2*y 31 32 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 142 — #144 i 142 33 34 35 36 37 i APÉNDICE B. COMPENDIO DE ALGORITMOS def RK4(a, b, y0, f, N): h = (b-a)/float(N) t = a w = y0 print t, " --> " , w 38 39 40 41 42 43 44 45 46 for i in range(1, N+1): k1 = h*f(t, w) k2 = h*f(t+h/2.0, w+k1/2.0) k3 = h*f(t+h/2.0, w+k2/2.0) k4 = h*f(t+h, w+k3) w = w+(k1+2.0*k2+2.0*k3+k4)/6.0 t = a+i*h print t, " --> " , w 47 48 49 50 2 # dy dt = y − t + 1, a = 0, b = 2, y0 = 0.5, N = 10 print " \n " +r" M \ ’ etodo RK4 " +" \n " RK4(0, 2, 0.5, test1, 10) 51 52 53 54 −4t # dy − 2y, a = 0, b = 1, y0 = 1, N = 20 dt = 2 − e print " \n " +r" M \ ’ etodo RK4 " +" \n " RK4(0, 1, 1, test2, 20) Salida M\'etodo RK4 0 --> 0.5 0.2 --> 0.829293333333 0.4 --> 1.21407621067 0.6 --> 1.64892201704 0.8 --> 2.12720268495 1.0 --> 2.64082269273 1.2 --> 3.17989417023 1.4 --> 3.73234007285 1.6 --> 4.28340949832 1.8 --> 4.81508569458 2.0 --> 5.30536300069 M\'etodo RK4 0 --> 1 0.05 --> 0.956946773927 0.1 --> 0.925794826349 0.15 --> 0.903996935703 0.2 --> 0.88950471587 0.25 --> 0.880674661873 0.3 --> 0.876191562614 0.35 --> 0.875006100539 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 143 — #145 i B.4. ECUACIONES DIFERENCIALES i 143 0.4 --> 0.876284037659 0.45 --> 0.879364861493 0.5 --> 0.883728152457 0.55 --> 0.888966251604 0.6 --> 0.894762067259 0.65 --> 0.900871071482 0.7 --> 0.907106710988 0.75 --> 0.91332859923 0.8 --> 0.919432972496 0.85 --> 0.925344987868 0.9 --> 0.931012518523 0.95 --> 0.93640116533 1.0 --> 0.941490255536 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 144 — #146 i 144 i APÉNDICE B. COMPENDIO DE ALGORITMOS i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 145 — #147 i i Bibliografía [1] R. Burden. Análisis Numérico. Grupo Editorial Iberoamericano. 2002. [2] W.E Boyce, R.C. DiPrima. Elementary Differential Equations and Boundary Value Problems. Wiley. 2008. [3] A.B. Downey. Think Python. Green Tea Press. 2012 [4] H. Th. Jongen, K. Meer, E. Triesch. Optimization Theory, Springer. 2004 [5] D. Kincaid, W. Cheney. Análisis Numérico. Addison Wesley. 1994 [6] E. Kreyszig. Matemáticas avanzadas para Ingeniería. Limusa Wiley. 2003. [7] L. Leithold. Álgebra y Trigonometría con Geometría Analítica. Editorial Harla. 1987 [8] I. Mantilla Prada. Análisis Numérico. Universidad Nacional de Colombia. 2004 [9] H.M. Mora Escobar. Introducción a C y a Métodos Numéricos. Universidad Nacional de Colombia. 2004 [10] S. Nakamura. Métodos Numéricos aplicados con Software. Prentice Hall. 1998 [11] A. Nieves, F.C. Domínguez. Métodos Numéricos aplicados a la Ingeniería. Grupo Editorial Patria. 2014 [12] M. Pilgrim. Dive Into Python. Apress. 2004 145 i i i i i i “LibMetNum” — 2017/4/3 — 20:44 — page 146 — #148 i 146 i BIBLIOGRAFÍA i i i i