Métodos Numéricos

Ejercicios prácticos



Elena E. Álvarez Saiz

Dpto. Matemática Aplicada y C. de la Computación

Fondo Editorial RED Descartes

Córdoba (España)
2025

Métodos Numéricos
Ejercicios prácticos


Autores:
Elena E. Álvarez Saiz


Código JavaScript para el libro: Joel Espinosa Longi, IMATE, UNAM.
Recursos interactivos: DescartesJS, WebSim
Videos: Math-GPT
Fuentes: Lato y UbuntuMono
Imagen de portada: ilustración generada por Pollinations AI


Red Educativa Digital Descartes
Córdoba (España)
descartes@proyectodescartes.org
https://proyectodescartes.org

Proyecto iCartesiLibri
https://proyectodescartes.org/iCartesiLibri/index.htRes

ISBN:


Esta obra está bajo una licencia Creative Commons 4.0 internacional: Reconocimiento-No Comercial-Compartir Igual.

Tabla de contenido

Prefacio

Los métodos numéricos son una herramienta esencial para los ingenieros, ya que permiten resolver problemas complejos que a menudo no tienen una solución analítica simple. Estas técnicas posibilitan abordar situaciones reales mediante aproximaciones, convirtiéndose en un recurso indispensable en la práctica profesional.

Este libro está diseñado para quienes deseen adquirir una comprensión de los métodos numéricos para el cálculo de raíces de funciones no lineales, la aproximación de funciones mediante polinomios, la integración numérica, la resolución de ecuaciones diferenciales ordinarias y la optimización.

Este libro ofrece:

  • Ejercicios resueltos paso a paso, que ilustran cómo aplicar las técnicas numéricas.
  • Explicaciones detalladas que conectan la teoría con la práctica, facilitando la comprensión de cómo y por qué funcionan los algoritmos.
  • Una introducción gradual a herramientas como Matlab/Octave, permitiendo a los lectores implementar las soluciones y comprobar sus resultados.
  • Herramientas interactivas gráficas y visuales que refuerzan las explicaciones, ayudando a que los conceptos abstractos sean más comprensibles

Este enfoque busca no solo facilitar el aprendizaje, sino también despertar el interés por profundizar en este campo. Se busca así acompañar al lector en el aprendizaje de los métodos numéricos mediante una exposición clara y organizada. Se busca que cada

contenido contribuya a construir una base sólida, permitiendo conectar conceptos teóricos con su aplicación.

Este libro está inspirado en los apuntes del profesor Eduardo Casas Rentería de la Universidad de Cantabria, , cuyo enfoque teórico ha sido una referencia clave para la estructura conceptual de este contenido. Este material aporta un enfoque práctico, combinando teoría, ejemplos y ejercicios diseñados para facilitar la comprensión y el dominio de los conceptos fundamentales. Además, se utiliza la programación en Matlab/Octave para facilitar los cálculos en el desarrollo y resolución de los ejemplos.

La estructura del libro comprende siete temas principales, que abarcan desde conceptos básicos hasta aplicaciones avanzadas. El primer tema introduce los métodos numéricos y el uso de MATLAB, estableciendo una base para el aprendizaje y la implementación computacional. El segundo tema cubre la aritmética computacional básica, destacando los principios para trabajar con números en un entorno digital. En el tercer tema se aborda la resolución aproximada de ecuaciones no lineales, explorando métodos para encontrar raíces de funciones. El cuarto tema se dedica a la aproximación de funciones mediante polinomios, una herramienta clave en el análisis numérico. El quinto capítulo está enfocado en la integración numérica, presentando técnicas para calcular integrales de manera aproximada. Posteriormente, se introduce la resolución de ecuaciones diferenciales ordinarias, ofreciendo métodos aproximados para su solución. Finalmente, el libro concluye con el tema de optimización, abordando estrategias para encontrar soluciones óptimas a problemas matemáticos y aplicados.

Consciente de que puedan existir erratas o inconsistencias en este libro, animamos a los lectores a compartir cualquier observación o

corrección que consideren necesaria. Estas contribuciones serán de gran ayuda para mejorar futuras ediciones y garantizar que este recurso sea de utilidad.



Capítulo

Introducción a los Métodos Numéricos y Matlab

Los métodos numéricos

El análisis numérico es una rama de las matemáticas que se centra en el estudio de métodos y algoritmos para obtener soluciones aproximadas a problemas matemáticos que no pueden resolverse de manera exacta mediante métodos analíticos convencionales. Estos problemas incluyen ecuaciones algebraicas, ecuaciones diferenciales, integrales, sistemas de ecuaciones lineales y no lineales, entre otros.

El estudio de los métodos numéricos exige abordar las siguientes cuestiones:

  • Desarrollo de métodos. Diseñar y analizar algoritmos que permitan obtener soluciones aproximadas que sean lo suficientemente precisas y rápidas para aplicarse a problemas reales.
  • Estimación y control del error. Dado que las soluciones numéricas son aproximadas, se debe estudiar y cuantificar el error asociado a las soluciones obtenidas. Esto incluye tanto el error debido a la naturaleza aproximada de los métodos como el error de redondeo y truncamiento producido por las limitaciones en la representación numérica de las computadoras.
  • Convergencia de los métodos. Esto es, analizar si un algoritmo converge a una solución exacta cuando el número de iteraciones o cálculos aumenta. La convergencia es crucial para garantizar que el método numérico mejorará la aproximación con más cálculos.
  • Estabilidad y eficiencia. Los algoritmos numéricos deben ser estables, es decir, pequeñas perturbaciones en los datos de entrada no deben provocar grandes cambios en los resultados.
  • Además, los métodos deben ser eficientes en términos del tiempo de cálculo y los recursos computacionales que utilizan, especialmente cuando se aplican a problemas grandes y complejos.

Ejemplo de introducción

Como aplicación de un método numérico, consideremos que tenemos un sistema de baterías conectado a un panel solar que genera electricidad a lo largo del día. Se quiere modelar cómo la batería se carga con el tiempo, sabiendo que:

  • La potencia solar $P_{solar}(t)$ varía a lo largo del día, dependiendo de la luz solar.
  • La batería tiene una capacidad máxima de almacenamiento.
  • La velocidad de carga disminuye a medida que la batería se acerca a su capacidad máxima (comportamiento típico de una batería).

La ecuación que podría modelizar cómo la energía se almacena en la batería podría ser la siguiente ecuación diferencial ordinaria (EDO):

$$ dE/dt = P_{solar}(t) - kE(t) $$

donde:

  • $E(t)$: Energía almacenada en la batería (kWh).
  • $P_{solar}(t)$: Potencia solar disponible en función del tiempo (kW).
  • $k$: Coeficiente de ineficiencia de la batería.
  • $t$: Tiempo en horas.

Se consideran los siguientes datos y parámetros

  • Capacidad máxima de la batería: 100 kWh.
  • Coeficiente de ineficiencia (k): 0.05
  • Tiempo de simulación: 24 horas.
  • La potencia solar varía a lo largo del día como la función senoidal siguiente (máximo de 50 kW) considerando $t=0$ el momento en el que sale el sol
$${P_{solar}}(t) = 50\,{\rm{sen}}\left( {\frac{{\pi t}}{{12}}} \right)$$

La gráfica de la Figura 1.1 muestra la evolucion de la energía almacenada en la batería en un día (24 horas) en función de la potencia solar disponible utilizando como método de resolución el método de Euler.

Se observa cómo la batería se carga durante las horas de sol y comienza a descargarse lentamente debido a las ineficiencias cuando no hay suficiente energía solar disponible.

Simulación de almacenamiento de energía en batería solar
  • La línea azul muestra cómo la energía almacenada en la batería varía con el tiempo, dependiendo de la energía solar recibida.
  • La línea discontinua naranja representa la potencia solar disponible a lo largo del día, que sigue una curva senoidal para simular el ciclo diurno.
¿Cómo se aplica un método numérico para obtener $E(t)$?

Supongamos que tenemos una ecuación diferencial: $\frac{dy}{dx} = f(x, y)$

La ecuación indica que conocemos la pendiente de la función \( y(x) \) en cualquier punto, pero no cómo obtener $y(x)$ solución de la EDO. El Método de Euler permite aproximar \( y(x) \) avanzando a través de pequeños pasos en el eje \( x \).

Imagina que intentas seguir una curva en un gráfico, pero en lugar de moverte suavemente a lo largo de la curva, solo conoces la dirección (pendiente) en el punto donde estás parado. La idea es dar un paso pequeño en esa dirección, recalculando la dirección en el nuevo punto, y seguir avanzando de la misma forma. Así es como el Método de Euler aproxima la curva.

Pasos del Método de Euler
  1. Punto inicial: Necesitamos un valor inicial \( y(x_0) = y_0 \) en un punto conocido \( x_0 \). Es decir, queremos que la solución pase por el punto \( (x_0 , y_0 )\),
  2. Aproximación por pasos: A partir del punto inicial, avanzamos con pasos pequeños \( \Delta x \), calculando el valor aproximado de \( y \) en el siguiente punto usando la pendiente. Se obtendría así una lista de puntos \( (x_0 , y_0) \), \( (x_1 , y_1) \), ... \( (x_n , y_n) \) donde $x_n=x_{n-1}+\Delta x$
  3. Fórmula de actualización: En cada paso, el valor de \( y \) se actualiza según la fórmula: $ y_{n+1} = y_n + \Delta x \cdot f(x_n, y_n) $

En el ejemplo que estábamos viendo, la fórmula de Euler que permite encontrar la solución aproximada de

$$ dE/dt = P_{solar}(t) - kE(t) $$ es: $$ E_{n+1} = E_n + Δt \cdot (P_{solar}(t_n) - k \cdot E_n) $$

Donde $Δt$ es el paso de tiempo (1 hora) y $E_n$ es la energía almacenada en la batería en el instante $n$.

El método permite calcular la energía almacenada en la batería a lo largo de 24 horas utilizando la potencia solar que varía con el tiempo.

Condición inicial:
  • Energía inicial en la batería: \(E(0) = 0\) kWh
Paso 1: \(t = 1 \, \text{h}\)
  • \(P_{\text{solar}}(0) = 50 \sin(0) = 0 \, \text{kW}\)
  • \(E(1) = 0 + 1 \cdot (0 - 0.05 \cdot 0) = 0 \, \text{kWh}\)
Paso 2: \(t = 2 \, \text{h}\)
  • \(P_{\text{solar}}(1) = 50 \sin\left(\frac{\pi}{12} \times 1\right) \approx 12.94 \, \text{kW}\)
  • \(E(2) = 0 + 1 \cdot (12.94 - 0.05 \cdot 0) = 12.94 \, \text{kWh}\)
Paso 3: \(t = 3 \, \text{h}\)
  • \(P_{\text{solar}}(2) = 50 \sin\left(\frac{\pi}{12} \times 2\right) = 25 \, \text{kW}\)
  • De esta forma, se completaría la energía almacenada: \(E(3) = 12.94 + 1 \cdot (25 - 0.05 \cdot 12.94) \approx 37.29 \, \text{kWh}\)
Paso 4: \(t = 4 \, \text{h}\)
  • \(P_{\text{solar}}(3) = 50 \sin\left(\frac{\pi}{12} \times 3\right) \approx 36.60 \, \text{kW}\)
  • Usamos el método de Euler: \(E(4) = 37.29 + 1 \cdot (36.60 - 0.05 \cdot 37.29) \approx 72.24 \, \text{kWh}\)
Paso 5: \(t = 5 \, \text{h}\)
  • \(P_{\text{solar}}(4) = 50 \sin\left(\frac{\pi}{12} \times 4\right) \approx 47.55 \, \text{kW}\)
  • Calculamos: \(E(5) = 72.24 + 1 \cdot (47.55 - 0.05 \cdot 72.24) \approx 116.63 \, \text{kWh}\)
  • Pero, como la capacidad máxima de la batería es 100 kWh, limitamos el valor a \(E(5) = 100 \, \text{kWh}\).
    ...

Se continuaría de esta manera completando el cálculo para las 24 horas del día.

Errores en cálculos numéricos

Misiles Patriot

El 25 de febrero de 1991, durante la Guerra del Golfo, una batería de misiles Patriot estadounidense en Dharan, Arabia Saudita, no pudo interceptar un misil Scud iraquí entrante. El Scud atacó un cuartel del ejército estadounidense y mató a 28 soldados. Un informe de la entonces Oficina General de Contabilidad titulado "Patriot Missile Defense: Problema de software conducido a una falla del sistema en Dhahran, Arabia Saudita" informó sobre la causa del fallo: un cálculo inexacto del tiempo desde el inicio debido a errores aritméticos del computador .

Misil Patriot

Específicamente, el tiempo en décimas de segundo, medido por el reloj interno del sistema, se multiplicó por 10 para producir el tiempo en segundos. Este cálculo se realizó utilizando un registro de punto fijo de 24 bits. En particular, el valor 1/10, que tiene una expansión binaria infinita, se cortó a 24 bits después del punto de base. El pequeño error de corte, cuando se multiplica por el gran número que da el tiempo en décimas de segundo, conduce a un error significativo .

La explosión del cohete Ariane

El Programa Ariane, es un programa emprendido por Europa en 1973 para dotarse de un lanzador que le permitiera un acceso independiente al espacio. El desarrollo del lanzador Ariane se efectúa bajo la dirección de la Agencia Espacial Europea (ESA, por sus siglas en inglés); el Centro Nacional de Estudios Espaciales(CNES) francés fue el contratista principal hasta mayo de 2003, fecha en la que pasó a actuar como tal el consorcio europeo EADS (European Aeronautic Defenceand Space Company) .

La explotación comercial es gestionada por la sociedad Arianespace, creada en 1980. En total, unas 40 compañías europeas están comprometidas en el desarrollo y construcción del lanzador Ariane.

Todos los lanzamientos se efectúan desde el centro espacial de Kourou, en la Guayana Francesa, que cuenta con varias rampas de lanzamiento, y en el que trabajan de forma permanente varios cientos de personas.

El 4 de junio de 1996, el cohete Ariane 5 Flight 501,de la Agencia Europea del Espacio (ESA) explotó 40 segundos después de su despegue a una altura de 3.7km. tras desviarse de la trayectoria prevista.

Cohete Ariane

Era su primer viaje tras una década de investigación que costó más de 7000 millones de euros. El cohete y su carga estaban valorados en más de 500 millones de euros. La causa del error fue un fallo en el sistema de guiado de la trayectoria provocado 37 segundos después del despegue. Este error se produjo en el software que controlaba el sistema de referencia inercial (SRI).

En concreto, se produjo una excepción debido al intento de convertir un número en punto flotante de 64 bits, relacionado con la velocidad horizontal del cohete respecto de la plataforma de lanzamiento, en un entero con signo de 16 bits. El número mas grande que se puede representar de esta forma es 32767.

Más información en puede encontrarse en .

El hundimiento de la plataforma petrolífera Sleipner A

El 23 de agosto de 1991, la plataforma petrolífera Sleipner A propiedad de la empresa noruega Statoil situada en el mar del Norte a 82 metros de profundidad se hundió. La causa del error fue un fallo en el modelado numérico de la plataforma utilizando elementos finitos. En concreto se produjo una fuga de agua en una de las paredes de uno de los 24 tanques de aire de 12 metros de diámetro que permitían la flotación de la plataforma de 57000 toneladas de peso que además soportaba a mas de 20 0personas y a equipamiento de extracción con un peso adicional de unas 40000 toneladas. Las bombas de extracción de agua no fueron capaces de evacuar toda el agua. El fallo tuvo un coste económico total de 700 millones de euros .

Para modelar los tanques de la plataforma se utilizó el programa NASTRAN de elementos finitos y una aproximación mediante un modelo elástico lineal. Esta aproximación no era correcta y subestimó en un 47% los esfuerzos que debían soportar las paredes de los tanques. En particular, ciertas paredes fueron diseñadas con un grosor insuficiente.

Un análisis con elementos finitos correcto, pero posterior al accidente, demostró que el diseño de la plataforma provocaría fugas en algunas de los tanques cuando ésta estuviese sobre agua a 62 metros de profundidad.La fuga real se produjo cuando ésta estaba sobre 65 metros de agua, lo que ratifica la supuesta causa del fallo.

Plataforma petrolífera

Introducción a Matlab/Octave

Matlab es un acrónimo de "Matrix Laboratory", lo que refleja su origen como una herramienta diseñada para trabajar principalmente con matrices. Con el tiempo, el programa ha evolucionado para convertirse en un entorno de programación de alto nivel que permite realizar cálculos numéricos, análisis de datos, simulaciones, desarrollo de algoritmos y visualización gráfica.

En este libro, se utiliza Matlab como la herramienta principal para desarrollar y resolver los ejercicios y ejemplos propuestos. Su interfaz intuitiva y su amplia biblioteca de funciones lo convierten en una herramienta ideal para ilustrar conceptos matemáticos, realizar simulaciones y aplicar métodos computacionales en un entorno práctico.

Aunque Matlab es un software de pago, se puede utilizar para realizar los ejercicios el programa Octave, que es software libre y gratuito. Para ejecutar el código de los ejemplos sin realizar ninguna instalación puede utilizar los siguientes enlaces:

La información que se recoge seguidamente pretende ser un recordatorio de las principales características de Matlab/Octave que se utilizarán en los ejemplos propuestos en los siguientes capítulos. Para una mayor información se puede consultar .

Entorno de trabajo

La ventana de Matlab muestra un escritorio dividido en varias partes:

  • Las órdenes se escriben en la ventana de comandos, Command Window.
  • La ventana Workspace proporciona información sobre las variables utilizadas y permite explorar datos que cree o importe de archivos.
  • Current Folder: carpeta actual donde se ejecutan los archivos.
Ventana Matlab

Directorio de trabajo

Cuando se guarda código en un fichero y queremos utilizarlo en un momento dado, debemos decir al programa dónde se encuentran. Matlab ya sabe, porque así viene configurado, dónde tiene guardadas las funciones propias del programa y de los distintos paquetes pero no sabe dónde están las que hemos escrito.

Matlab busca funciones y scripts en los directorios especificados por la función path. El primero de ellos es siempre el especificado en el diálogo Current Directory.

En la figura aparece marcado en rojo el directorio actual. Tecleando el comando path en la ventana de comandos puede ver el listado de directorios activos.

Directorio de trabajo

Ayuda de Matlab

Desde la ventana de comandos, se puede utilizar el comando help

help nombreDelComando
Ejemplo:
>>help plot

Además, desde el menú help se puede acceder a la ayuda de MathWorks en el caso de Matlab.

Creación de variables

En Matlab/Octave, crear variables es sencillo, basta asignar un valor al nombre de la variable. Las variables se almacenan en la memoria y pueden contener números, matrices, cadenas de texto, entre otros. El contenido de una variable se puede recuperar y modificar a lo largo de una sesión de trabajo.

Reglas para los nombres de las variables

  • El nombre de una variable puede tener letras, números y el guion de subrayar.
  • El primer carácter tiene que ser una letra, modulo2 es un nombre válido, pero no lo es 2modulo
  • Las mayúsculas y las minúsculas tienen valor distintivo. La variable Modulo es distinta de la variable modulo.
  • Dentro de un nombre de variable no puede haber espacios en blanco, modulo1 es un nombre de variable válido, pero no modulo 1.
  • Existen nombres que deben evitarse porque tienen significado propio en Matlab: ans, pi, Inf, i,j, ... . Para obtener una lista de palabras reservadas teclea en la venta de comando iskeyword()

Un ejemplo de declaración de variable:

x=5; % x es una variable escalar
x=x+6; % El valor de x es 11

Las variables creadas desde la línea de comandos pertenecen al espacio de trabajo (Workspace).

Matlab ignora cualquier texto que vaya precedido por el símbolo %, por lo tanto, este símbolo sirve para incluir comentarios.

¿Qué resultado esperarías del siguiente código?
>> x=5;  2*x;  y=x^2;   x=y/x;     
Indica cuáles de las siguientes expresiones son incorrectas y por qué
  1. Numero-6+2
  2. 8num=3*2
  3. Num valores=3+2
  4. A234_7899000=3
  5. B-32=0
    

Visualizacion de números

El comando format en Matlab/Octave se utiliza para controlar la forma en que Matlab/Octave muestra los números en la ventana de comandos. No cambia la precisión interna de los cálculos, solo afecta a la presentación de los resultados. Aquí tienes algunos de los modos más comunes de format al escribir el nùmero $\pi$.

format short 4 dígitos después del punto decimal 3.1416
format long 15 dígitos después del punto decimal 3.141592653589793
format short e Notacion decimal con 4 dígitos 3.1416e+00
format long e Notacion decimal con 15 dígitos 3.141592653589793e+00

Operaciones aritméticas

Matlab/Octave permite realizar operaciones aritméticas básicas de manera directa. Las operaciones estándar incluyen suma (+), resta (-), multiplicación (*), división (/) y exponenciación (^):

x = 4; y = x + 3; % Suma
z = x * 2; % Multiplicación
A= 2*(x + z); % El valor de A es 20

Precedencia de operadores

Las expresiones se evalúan de izquierda a derecha, la potencia tiene el orden de prioridad más , seguido del producto y la división (ambas

tienen la misma prioridad) y por último la suma y la resta (con igual prioridad entre ellas). Para alterar este orden se deben introducir adecuadamente paréntesis.

x= 2+3^4/2; % x toma el valor 2+81/2
B =2+3^(4/2); % B toma el valor 11=2+3^2
Utilizar Matlab/Octave como calculadora para calcular \[\frac{{\left( {\frac{\pi }{2} + 4} \right){2^{3 + {2^2}}}}}{{1 + {3^2}}}\]     
Calcular\[\sqrt[3]{{3\frac{{27}}{{91}}}} + \frac{2}{4}\sqrt[4]{{3\frac{{27}}{{91}}}} - \frac{1}{2}\sqrt[5]{{3\frac{{27}}{{91}}}}\]    
Un proyecto cuesta \(C_{\text{inst}} = 10,000\) euros y genera un beneficio anual neto de \(B_{\text{anual}} = 2,000\) euros durante \(N = 5\) años. Calcula el retorno de inversión (\(ROI\)) con una tasa de descuento de \(r = 4\%\). Beneficios totales y retorno de la inversión (RPI): \[ B_{\text{total}} = \sum_{t=1}^{N} \frac{B_{\text{anual}}}{(1 + r)^t} \,\,\, \,\,\, \,\,\, ROI = \frac{B_{\text{total}} - C_{\text{inst}}}{C_{\text{inst}}} \cdot 100 \]     

Scripts o guiones

Un script es un archivo que contiene un conjunto de comandos de Matlab/Octave que se ejecutan en orden. Para crear un script, simplemente escribe tus comandos en un archivo con extensión .m de la forma nombre.m siendo nombre una secuencia de caracteres que no admite caracteres blancos.

También se puede crear un guión desde el editor de Matlab/Octave eligiendo el menú New Script.

Menú New Script

Funciones anónimas

Algunas funciones sencillas, se pueden definir mediante una sola instrucción en la ventana de comandos o en un script. Basta establecer su nombre, los argumentos de los que dependen y los comandos que permiten definirla.

nombre_Funcion=@(argumentos) expresion_Funcion
Ejemplo: Definir la función que calcular el área de un rectángulo a partir de su base y altura.
>>area_rectangulo=@(b,h) b*h
>>valor=area_rectangulo(4,3)
valor=
12
Escribe una función que permita pasar de grados Celsius a grados Fahrenheit.    

Vectores

  • Vector fila: se define separando los elementos con espacios o comas.
  • Vector columna: se define separando los elementos con un punto y coma (;).
  • Vector equiespaciado en un intervalo
    punto_inicial:paso:punto_final
    Ejemplo: Genera un vector con punto inicial 2 hasta llegar a 7 con un salto 2
    >>v=4:2:9
    v es el vector [4 6 8]
  • Comando linspace. Genera un vector fila con números igualmente espaciados considerando un punto inicial, un punto final y el número de elementos.
    linspace(valor_inicial,valor_final,num_puntos)
    Ejemplo: Genera un vector fila de 7 elementos equiespaciados siendo el primer valor 2 y el último 3
    >>linspace(2,3,7)
    Resultado v=[2.0000 2.1667 2.3333 2.5000 2.6667 2.8333 3.0000]
Genera los siguientes vectores eligiendo un valor cualquiera para $n$
  1. El vector cuyas componentes son $n,\,2n,3n,...,10n$
  2. El vector cuyas componentes son $n - 1,\,n - 3,n - 5,...,n - 41$
  3. El vector cuyas componentes son ${n^2} + 1,\,{n^2} + 3,{n^2} + 5,...,{n^2} + 2n - 1$
  4. Un vector con $10+n$ componentes regularmente espaciadas entre 0 y $\pi$
  5.     

Matrices

Una matriz es una colección de valores en filas y columnas. Cada fila se separa con un punto y coma (;) y los elementos de una fila se separan con espacios o comas.

M = [1 2 3; 4 5 6; 7 8 9]; % Es una matriz 3x3
M = [1 2 3; 4 5 6]; % Es una matriz 2x3

Veamos cómo generar algunas matrices especiales.

  • Matriz de ceros
    zeros(m,n)
    Ejemplo: Matriz 4x3 de ceros
    >>zeros(4,3)
  • Matriz de unos
    ones(m,n)
    Ejemplo: Matriz 4x3 con todos sus elementos unos
    >>ones(4,3)
  • Matriz identidad
    eye(n)
    Ejemplo: Matriz identidad 3x3
    >>eye(3)
  • Matriz diagonal
    diag(vector)
    Ejemplo: Crea una matriz diagonal con el vector [2 3 4] en la diagonal
    >>diag([2 3 4])
  • Matriz aleatoria
    rand(m,n)
    Ejemplo: Crea una matriz de valores aleatorios de dimension 2x3
    >>rand(2,3)

Acceso a los elementos de una matriz

  • Elemento específico indicando su fila y columna
    A = [1 2 3; 4 5 6; 7 8 9]; elemento = A(2, 3);
    % Accede al elemento en la fila 2, columna 3
    % Resultado: elemento = 6
  • Fila
    A = [1 2 3; 4 5 6; 7 8 9]; fila2 = A(2, :);
    % Accede a todos los elementos de la fila 2
    % Resultado: fila2 = [4 5 6]
  • Columna
    A = [1 2 3; 4 5 6; 7 8 9]; columna3 = A(:,3);
    % Accede a todos los elementos de la columna3
    % Resultado: columna3 = [3;6;9]
  • Submatrices especificando rango de filas y columnas
    A = [1 2 3; 4 5 6; 7 8 9]; submatriz = A(1:2,2:3);
    % Submatriz con el rango de filas 1 y 2
    % y columnas 2 y 3 de A

    % Resultado: columna3 = [2 3;5 6]
  • Submatrices generadas a partir de condiciones
    A = [1 2 3; 4 5 6; 7 8 9]; elementos_mayores_a_5 = A(A>5);
    % Submatriz con el rango de filas 1 y 2
    % y columnas 2 y 3 de A

    % Resultado: elementos_mayores_a_5 = [6 7 8 9]

Operaciones con vectores y matrices

Matlab/Octave está diseñado para trabajar de manera eficiente con matrices, permitiendo realizar operaciones como transposiciones, productos matriciales y otras manipulaciones comunes.

  • Operaciones matriciales básicas
    A = [1 2; 3 4];B = [5 6; 7 8];
    C = A+B; % Suma de las matrices A y B
    D = A*B; % Producto de las matrices A y B
    X = A\B; % X es la matriz que cumple A*X=B
    X = A/B; % X es la matriz que cumple X*A=B
    X = A^2; % X es A*A
  • Multiplicación, división, exponenciación elemento a elemento
    A = [1 2 3; 3 4 5];B = [6 7 8; 9 10 11];
    C = A.*B; % Multiplicación elemento a elemento
    D = A./B; % División elemento a elemento
    D = A.^3; % Potencia elemento a elemento
  • Traspuesta de una matriz
    A = [1 2 3; 3 4 5]; % A es 2x3
    A' % Matriz traspuesta de A de orden 3x2
Dados los vectores fila \[x = \left( {4,6,2} \right),\,y = \left( {3, - 2,4} \right)\] y el número $k=3$, calcular
  • $y - k\,;\,\,ky\,\,;\,\,\frac{x}{k}\,\,\,;2x - y$
  • ${x^2} + {y^2}\,\,;\,\,\frac{3}{{\sqrt[3]{x}}}\,\,\,;\,\,\frac{{1 + x}}{{{y^4}}}$
    
Define la matriz A y obtén los dos primeros elementos de la fila tercera.     
Crea de un vector que va desde 1 a 22 con salto de 5 puntos. Crea otro vector t con el mismo número de elementos que el anterior de forma que la suma de los dos vectores tenga todos sus componentes iguales.    
Genera una matriz de números aleatorias de 8x6 elementos. Selecciona la submatriz con las filas pares y las columnas impares.
Ejercicios sobre matrices

Funciones nativas de Matlab/Octave

Matlab/Octave ofrecen una amplia variedad de funciones integradas en el programa para trabajar con números, vectores, matrices, gráficos y procesamiento de datos. A continuación se muestran algunas de las más comunes, organizadas en categorías:

  • Funciones matemáticas básicas
    v = [3 4 -1]; w=[3 4 5] % Vector fila
    abs(v); % Valor absoluto de cada elemento
    sqrt(w); % Raíz cuadrada de cada elemento
    exp(v); % Exponencial de cada elemento
    log(w); % Exponencial de cada elemento
    round(w); % Redondeo al entero más cercano
    floor(w); % Redondeo hacia abajo
    round(w); % Redondeo hacía arriba
    mod(11,4) % Residuo de la división de 11 entre 4
  • Funciones trigonométricas
    v = [3 4 -1]; % Vector fila
    % Seno, coseno, tangente de cada elemento
    sin(v), cos(v), tan(v)
    % Arcoseno, arcoseno, y arcotangente
    asin(v), acos(v), atan(v)
  • Funciones hiperbólicas
    v = [3 4 -1]; % Vector fila
    % Seno, coseno, tangente hiperbólicas
    asinh(v), acosh(v), atanh(v)
    % Arcoseno, arcoseno, y arcotangente
    asin(v), acos(v), atan(v)
  • Funciones para matrices y vectores
    A = [1 7 3;4 8 6]; % Matriz 2x3
    size(A) % Tamaño de A
    length(A) % Longitud de A, mayor dimensión
    sum(A) % Suma de los elementos de A
    prod(A) % Producto de los elementos de A
    mean(A) % Promedio de los elementos de A
    max(A) % Máximo de los elementos de A
    min(A) % Mínimo de los elementos de A
    sort(A) % Ordena elementos de A
  • Funciones para álgebra lineal
    A = [1 2; 3 4]; % Matriz 2x2
    det(A) % Determinante de A
    inv(A) % Inversa de A
    eig(A) % Autovalores de A
    rank(A) % Rango de A
Ejercicios sobre funciones en Matlab/Octave

Gráficas 2D

Una de las características más útiles de Matlab es su capacidad para crear gráficos de forma rápida y sencilla. Uno de los comandos a utilizar es plot

plot(vectorx,vectory,opciones_gráfica)
Ejemplo: Para representar la función $x^2$ en el intervalo $[-10,10]$
>> x = -10:0.1:10; % Vector de valores x
>> y = x.^2; % Cuadrado de cada valor de x
>> plot(x, y); % Crear la gráfica

En Matlab/Octave, puedes personalizar las gráficas usando opciones como color de línea (por ejemplo, 'r' para rojo), estilo de línea ('--' para discontinua), y símbolo para representar los puntos ('o' para círculos). También puedes combinar estas opciones ('b--o' para una línea azul discontinua con círculos) y ajustar el ancho de línea ('LineWidth', 2).

Otros comandos gráficos:

  • Abrir una ventana gráfica: figure.
  • Añadir etiquetas en los ejes: xlabel, ylabel.
  • Superponer gráficos dentro de una misma figura: hold on, hold off.
  • Poner o quitar una rejilla al gráfico: grid on, grid off.
  • Título de un gráfico: title.
  • Matríz de gráficos en una misma gráfica: subplot(m,n,p) divide la ventana de gráficos en una cuadrícula de mxn gráficas y selecciona la subgráfica p.
% Datos de ejemplo de temperaturas a lo largo del día
horas = 0:1:23; % Horas de 0 a 23
temp_ciudad1 = [15, 14, 13, 13, 12, 12, 13, 15, 18, 22, 25, 27, 29, 30, 28, 26, 24, 22, 20, 18, 17, 16, 15, 14];
temp_ciudad2 = [10, 9, 9, 8, 8, 7, 8, 10, 13, 18, 20, 23, 25, 26, 24, 23, 21, 19, 17, 15, 13, 12, 11, 10];

% Gráfico de temperatura para la Ciudad 1
% Gráfico en azul
plot(horas, temp_ciudad1, 'b', 'LineWidth', 1.5);
hold on; % Mantiene la gráfica para añadir la segunda

% Gráfico de temperatura para la Ciudad 2
% Gráfico en rojo con línea discontinua
plot(horas, temp_ciudad2, 'r--', 'LineWidth', 1.5);

% Etiquetas y leyenda
xlabel('Hora del día');
ylabel('Temperatura (°C)');
title('Temperatura promedio durante el día en dos ciudades');
legend('Ciudad 1', 'Ciudad 2');
% Mostrar la cuadrícula para facilitar la lectura
grid on;
% Desactivar hold para futuras gráficas
hold off;
Una compañía eléctrica tiene la siguiente tarifa. Los primeros 100Kwh se pagarán a 2€ el Kwh, para los siguientes 200 Kwh costará 3 € y 6 de allí en adelante. Expresa el valor de la factura como una función de la cantidad de Kwh consumida al mes y representa la función.

Fundamentos sobre programación en Matlab/Octave

Matlab/Octave no solo son programas para realizar cálculos, también es un lenguaje de programación que permite crear scripts y funciones para automatizar tareas, realizar iteraciones, condicionales, y mucho más. A continuación, se presentan algunos conceptos básicos de programación con estos programas.

Funciones

Las funciones en Matlab/Octave permiten encapsular un conjunto de operaciones dentro de un bloque de código que puede ser reutilizado. Se definen en un archivo separado, también con la extensión .m. y con el mismo nombre que la función. En el siguiente ejemplo se muestra la función cuadrado que calcula, a partir de un valor de entrada, su cuadrado.

function resultado = cuadrado(x)
resultado = x^2;.
end

El fichero que tiene esta función deberá llamarse cuadrado.m. La función se invoca de la misma forma que las funciones predefinidas propias de Matlab/Octave.

>> a=cuadrado(4)+1
% Resultado: a=5;.

Condicionales

Matlab/Octave admite la estructura de control condicional if-else, que se usa para ejecutar bloques de código en función de si se cumple o no una condición.

En el ejemplo siguiente, si el valor de x es positivo se escribe el texto "x es positivo", en caso contrario se escribe por pantalla "x es negativo" si es menor que cero y "x es cero" en otro caso.

if x > 0
disp('x es positivo');
elseif x <0
disp('x es negativo');
else
disp('x es cero');
end

Bucles

Matlab/Octave admite dos tipos de bucles principales: for y while. Permiten repetir un conjunto de instrucciones varias veces.

Para salir de un bucle, se puede utilizar la instrucción break. Para omitir el resto de las instrucciones del bucle y comenzar la siguiente iteración, se puede utilizar la instrucción continue .

  • Ciclo for. Repite un conjunto de instrucciones cuando varía el índice en un conjunto de valores.

En el siguiente ejemplo se imprime por pantalla el valor de i cuando i va tomando los valores 1, 2, 3,...,10.

for i = 1:10
disp(i);
end

En el siguiente ejemplo, vamos a sumar los cuadrados de los primeros 50 números naturales

suma = 0; % Inicialización de la suma
for i=1:20
% Agrega el siguiente número a la suma
suma = suma + i^2;
end
% Este cálculo podría hacerse con la orden:
vec=1:20;
sum(vec.^2)
  • Bucle while. Repite un conjunto de instrucciones mientras una condición es verdadera.

En el siguiente ejemplo, vamos a sumar los primeros números naturales hasta que la suma sea inferior a 300

suma = 0; % Inicialización de la suma
n = 1; % Número
while suma < 300
% Agrega el siguiente número a la suma
suma = suma + n; % Incrementa el contador
n = n + 1;
end

En el siguiente ejemplo se calcula la suma de los números pares desde 2 a 10.

n = 2; % Número inicial
suma = 0; % Variable para almacenar la suma
% Bucle while
while n <= 10
% Sumar el valor de n a la variable suma
suma = suma +n;
n = n + 2; % Incrementar n en 2
end
suma % Mostrar el resultado
% Este cálculo se puede hacer: sum(2:10)

Manejo de archivos y datos

  • Abrir y leer dados de un archivo de texto: fopen, fscanf
    % Lee todos los números de archivo.txt
    fileID = fopen('datos.txt', 'r');
    data = fscanf(fileID, '%f');
    fclose(fileID);
    disp(data);
  • Escritura de archivos: fprintf
    % Guarda el vector en un archivo de texto
    data = [1.1, 2.2, 3.3];
    fileID = fopen('output.txt', 'w');
    fprintf(fileID, '%f\n', data);
    fclose(fileID);
  • Carga y guardado de variables: save, load
    % Guarda las variables a y b en archivo.mat
    a = 5;
    b = [1, 2, 3];
    save('variables.mat', 'a', 'b');
    load('variables.mat');
En el siguiente interactivo puedes practicar con ciclos y bucles.

Ejercicios sobre ciclos y bucles

Autoevaluación

Se presenta a continuación un cuestionario básico sobre Matlab/Octave.

Test básico de Matlab/Octave

Con el siguiente interactivo puedes realizar una autoevaluación por niveles.

Test con distintos niveles

Ejercicios

Define las tres variables variables a=1.5, b=4, c=3.5 y calcula el valor de \(d = \frac{a}{{\frac{b}{c} + \frac{{{c^2}}}{a}}}\).
Consideremos un gas que escapa de un tanque presurizado bajo un proceso adiabático. Su flujo másico se puede aproximar con la función: \[ f(P_{\text{ext}}, P_{\text{int}}, K) = P_{\text{int}} \sqrt{\frac{2K}{K-1} \left( 1 - \left( \frac{P_{\text{ext}}}{P_{\text{int}}} \right)^{\frac{K-1}{K}} \right)} \] donde \( P_{\text{int}} \) es la presión interna en el tanque, \( P_{\text{ext}} \) es la presión externa fuera del tanque t \( K \) es el coeficiente adiabático del gas. Escribe esta expresión en Octave y calcula su valor para los valores de \(K=1.4\), \( P_{\text{ext}} =1\) y \( P_{\text{int}} =2\).
Genera los siguientes vectores utilizando los operadores adecuados de Matlab/Octave:
  • \( v_1 = [1, 3, 5, ..., 25] \)
  • \( v_2 = [0, 0.1, 0.2, ..., 1] \)
  • \( v_3 = [\pi, 2\pi, 3\pi, ..., 10\pi] \)
  • \( v_4 = [10, 9, ..., 1, 0] \)
Genera un vector \( x \) de 30 componentes regularmente espaciadas entre 0 y \( \pi \). Evalúa \( x \) en cada una de las funciones siguientes: <\[ f(x) = \frac{\log(x+2)}{x}      f(x) = x^2 + x - e^x      f(x) = e^{x^2} \sin(x) \]
Define funciones anónimas para evaluar las funciones anteriores teniendo en cuenta que \( x \) puede ser un vector.
Representa gráficamente la función definida a trozos: $$ f(x) = \begin{cases} x^2 + 3x - 2, & \text{si } 1 \leq x < 3 \\ 7x - 3, & \text{si } 3 \leq x \leq 8 \end{cases} $$
Diseña un script en Matlab/Octave que genere una matriz cuadrada \( A \) de tamaño \( n \times n \), con \( n \) proporcionado por el usuario. Llena la matriz con valores aleatorios entre 1 y \( n \), duplica los valores de la diagonal principal y reduce a la mitad los valores de la diagonal secundaria. Imprime la matriz original y la modificada.
Escribe un programa en Matlab/Octave que cree dos vectores \( X \) e \( Y \) de longitud 10 con números aleatorios entre 1 y 20. Compara elemento a elemento:
  • Si \( X[i] > Y[i] \), almacena la suma en un nuevo vector \( Z \).
  • Si \( X[i] \leq Y[i] \), almacena el valor absoluto de su diferencia en \( Z \).
Muestra el resultado final en \( Z \).
Escribe un script que clasifique un conjunto de 24 mediciones de temperaturas en tres categorías: 'Frío' (< 10°C), 'Templado' (10-20°C), y 'Caluroso' (> 20°C). Muestra los conteos de cada categoría.
Para \( n = 10, 20, 40, 80, \ldots, 10240 \), calcula la suma de los \( n \) primeros números naturales aplicando y sin aplicar la fórmula \( S(n) = \frac{n(n+1)}{2} \). Muestra los resultados.
Escribe una M-función llamada Multiplo que, dados dos números \( k \) y \( h \), devuelva:
  • 1 si \( k + h \) es múltiplo de 2.
  • 2 si también es múltiplo de 3.
  • 0 en caso contrario.
Construye un vector con los diez primeros términos de la sucesión: \[ x_{n+1} = \frac{1}{2 - x_n} \quad \text{con } x_1 = 1 \quad \text{para } n \geq 1 \]
Escribe una M-función llamada ContarPares que reciba un vector como argumento y devuelva el número de componentes pares.
Escribe una M-función que calcule la suma de las cifras de un número natural dado. Por ejemplo, SumaCifras(325) debería devolver 10.
Utilizando el algoritmo de Euclides, escribe una M-función que calcule el máximo común divisor de dos números. Ejemplo: MCD(24, 15) debería devolver 3.
Escribe una M-función que, a partir de tres números dados, calcule la suma de los cuadrados de los dos números mayores. Por ejemplo, SumaCuadrados(5, 3, 4) debería devolver 41.
Escribe una M-función llamada SuperaMedia que reciba un vector y devuelva otro vector con los elementos que sean mayores o iguales a la media del vector de entrada.
RESUMEN

En este capítulo, se ha visto la necesidad de utilizar los métodos numéricos para resolver problemas matemáticos complejos que carecen de soluciones analíticas exactas. Los campos de aplicación son múltiples, por ejemplo, resolución de ecuaciones no lineales, ecuaciones diferenciales, cálculo de integrales y aproximación por polinomos.

Los aspectos clave en el estudio de los métodos numéricos son:

  1. Desarrollo de métodos. Diseño y análisis de algoritmos que proporcionen soluciones aproximadas con precisión y rapidez adecuadas para problemas reales.
  2. Estimación y control del error. Cuantificación de errores asociados a soluciones numéricas, incluyendo errores de redondeo y truncamiento debido a las limitaciones computacionales.
  3. Convergencia de los métodos. Evaluación de si un algoritmo se aproxima a la solución exacta al aumentar el número de iteraciones o cálculos.
  4. Estabilidad y eficiencia. Asegurar que pequeñas perturbaciones en los datos de entrada no causen grandes variaciones en los resultados, y que los métodos sean eficientes en términos de tiempo de cálculo y recursos computacionales.
Para facilitar la resolución de problemas numéricos y la visualización de resultados, se ha introducio la herramienta computacional Matlab/Octave. Los contenidos que se han repasado son los siguientes:

  1. Entorno de trabajo, directorio de trabajo y ayuda de matlab. El programa incluye una interfaz intuitiva para gestionar variables, explorar el directorio de trabajo y acceder a ayuda interactiva para funciones y comandos
  2. Creación de variables y operadores numéricos. Las variables se crean automáticamente al asignarles un valor, y se pueden manipular mediante operadores aritméticos, de comparación y lógicos.
  1. Scripts y guiones. Son conjuntos de comandos almacenados en archivos .m que permiten automatizar cálculos y organizar programas estructuradamente.
  2. Vectores y matrices.El programa está diseñado para trabajar con vectores y matrices como estructuras de datos principales, permitiendo cálculos algebraicos y vectoriales de forma eficiente.
  3. Funciones nativas. Incluye un conjunto extenso de funciones nativas para realizar cálculos, optimizando las tareas numéricas comunes.
  4. Gráficas 2D. Permite crear gráficas 2D para representar datos, incluyendo opciones para personalizar títulos, etiquetas y leyenda
  5. Introducción a la programacón. Su programación se basa en el uso de scripts, funciones definidas por el usuario y control de flujo (condicionales y bucles).


Capítulo

Cuestiones básicas sobre aritmética computacional

Introduccion

El objetivo de este apartado es introducir la importancia de la aritmética computacional en el contexto de los métodos numéricos. Se aborda cómo los computadores representan números y realizan cálculos, destacando que, debido a limitaciones inherentes (como la precisión finita y el almacenamiento en binario), los resultados pueden contener errores.

Se verá que:

  • Los computadores no pueden representar de forma exacta todos los números reales, especialmente números irracionales o números muy pequeños o muy grandes.
  • Las operaciones aritméticas pueden introducir errores acumulativos debido a limitaciones en la precisión.

Veamos a continuación algunos ejemplos numéricos que comete el ordenador.

Analiza el siguiente código Matlab .
suma=0;n=1000;
for k=1:n
  suma=suma+0.1;
end
format longEng;suma

El resultado debería ser $100$ pero se obtiene un número próximo: $99.9999999999986e+000$

Analiza el siguiente código Matlab.
f=@(x) (1-x).^6
%syms x ;expand((1-x).^6)
g=@(x) x.^6-6 * x.^5+15 * x.^4-20 * x.^3+15 * x.^2-6 * x+1
x1=0.996:0.0001:1.005;format longEng;
[x1' f(x1)' g(x1)']
plot(x1,f(x1),x1,g(x1))

En la figura se muestra la gráfica de la función $f(x)$ y su desarrollo como polinomio $g(x)$.

¿Por qué ocurre esto? La razón es que los ordenadores usan un formato (punto flotante binario) que no permite representar de forma precisa números como por ejemplo 0.1, 0.2 o 0.3. Dado que los números están, en general, representados de manera inexacta entonces las operaciones aritméticas también se hacen de manera inexacta.

Gráficas de las funciones del ejemplo 2.1.

Sistemas de numeración

Un sistema de numeración consiste en reglas y símbolos que permiten representar cantidades numéricas de forma clara y organizada. Sirve como fundamento para contar, calcular y realizar operaciones. En este apartado, nos centraremos en el sistema decimal y el binario (base 2).

Sistema decimal

En este sistema los números se representan utilizando 10 dígitos, es un sistema de numeración posicional en el que las cantidades se representan utilizando como base aritmética las potencias del número diez. Así,

$$x \in \mathbb{R}^{+} \,\,\,\,\, x = \sum\limits_{ - \infty }^n {{a_k} \cdot {{10}^k}} \,\,\,\,\, 0 \le {a_k} \le 9$$
Escribe el número $709.3045$ utilizando sumas de potencias de 10.

Se puede escribir $$709.3045 = 7 \cdot {10^2} + 9 \cdot {10^0} + 3 \cdot {10^{ - 1}} + 4 \cdot {10^{ - 3}} + 5 \cdot {10^{ - 4}}$$

Si consideramos una base $b$, un número real $x$ se puede escribir de la forma

$$x = \sum\limits_{ - \infty }^n {{a_k} \cdot {b^k}} \,\,\,\,\, 0 \le {a_k} \le b - 1$$ o también $$x = {a_n}{a_{n - 1}}...{a_0}.{a_{ - 1}}{a_{ - 2}}{a_{ - 3}}...$$

Sistema binario

El Standard de IEEE propone el uso de la base 2 en el almacenamiento y la aritmética sobre el computador. En este sistema de numeración los números se representan utilizando solamente las cifras cero y uno (0 y 1)

$$x = \sum\limits_{ - \infty }^n {{a_k} \cdot {2^k}} \,\,\,\,\, 0 \le {a_k} \le 1$$

Conversión de decimal a binario

El procedimiento es sencillo, basta dividir el número en base decimal y sus cocientes entre 2, acumulando los restos que conformarán el número en la nueva base. La lista de ceros y unos leídos de abajo a arriba darán la expresión en binario.

En el caso de que el número $x$ sea entero, basta dividir $x$ entre $2$ obteniendo de cociente $x_1$ y resto $r_1$ (0 o 1) pudiendo escribir $x=2\cdot {\color {red} x_1} + {\color {blue} r_1} $. Se repite el proceso con $x_1$ y el resto de cocientes hasta que el cociente sea menor que 2 $$x=2\cdot {\color {red} (2\cdot x_2+r_2)}+{\color {blue} r_1} =2^2 {\color {red} x_2}+2{\color {blue} r_2}+ {\color {blue} r_1} ... $$ Los números $r_1$, $r_2$... nos darán las cifras de la expresión binaria de $x$.
Conversor decimal a binario
Para la parte fraccionaria $0.\,{f_1}{f_2}{f_3}...$, se deben buscar $a_1,a_2,...$ de forma que $$0.\,{f_1}{f_2}{f_3}... = {{{a_1}} \over 2} + {{{a_3}} \over {{2^2}}} + {{{a_3}} \over {{2^3}}} + ...$$ Estos valores se pueden obtener multiplicando por 2 y teniendo en cuenta que $\sum\limits_{k = 1}^\infty {{1 \over {{2^k}}}} = 1$.
Convierte $0.1_{10}$ a binario.

$$ \begin{aligned}{1 \over {10}} &= {1 \over {{2^4}}} + {1 \over {{2^5}}} + {0 \over {{2^6}}} + {0 \over {{2^7}}} + {1 \over {{2^8}}} + {1 \over {{2^9}}} + {0 \over {{2^6}}} + {0 \over {{2^7}}} + ... \\ &= 0001{\widehat {1001}_2} \end{aligned}$$

Conversión a binario. Escena creada por Héctor A. Tabares Ospina y Juan Guillermo Rivera Berrío
El número 0.1 tiene infinitas cifras distintas de cero cuando se escribe en base 2.

En la escena que se presenta a continuación, se muestra cómo hacer la conversión paso a paso a base 2 de ciertos números decimales. En la escena se puede elegir números enteros y números con parte fraccionaria, observa el procedimiento para este último caso.

Escena creada por Héctor A. Tabares Ospina y Juan Guillermo Rivera Berrío

Conversión de binario a decimal

Puedes practicar con la siguiente herramienta interactiva introduciendo un número binario sin parte fraccionaria para convertirlo a decimal.

Conversión a binario. Escena creada por Héctor A. Tabares Ospina y Juan Guillermo Rivera Berrío

En el siguiente ejemplo se muestra un número binario con parte fraccionaria y su conversión a decimal.

Convierte el número $x=10.111001_2$ a decimal

Se tiene que: $$\begin{aligned} x = 1·2^1 + 0·2^0 + 1·2^{-1}+ 1·2^{-2} + \\ +1·2^{-3}+ 0·2^{-4} + 0·2^{-5} + 1·2^{-6} \\ = 1+1/2+1/4+1/8+1/64=1.890625\end{aligned}$$

Representación de los números reales en el ordenador

Un número real en base 10 puede escribirse de la forma siguiente en el que la primera cifra no nula aparece inmediatamente a la izquierda del punto decimal.

$$x = {\left( { - 1} \right)^s}× \,{10^e} × \,a.m$$

donde

  • s es el signo (0 si $x \ge 0$, 1 si $x < 0$)
  • $1 \le a \le 9$
  • $m = {m_1}{m_2}{m_3}...$ con $0 \le {m_i} \le 9$ para todo $i$

Se denomina:

  • s signo
  • e exponente
  • m mantisa
Considera el número $x=9028.304$ en base decimal.
Se puede escribir de la forma $$x = {\left( { - 1} \right)^0}\,× {10^3}× \,9.028304$$

Como los ordenadores utilizan aritmética binaria, en base 2 el número se puede escribir

$$x = {\left( { - 1} \right)^s} × \,{2^e} × \,1.m$$

Observa que para almacenar $x$ basta almacenar el signo $s$, el exponente $e$ y la mantisa $m$. No es necesario almacenar el 1 (bit oculto).

En el ordenador los números reales se representan según la norma IEEE 754, establecida en 1985 por el Instituto de Ingenieros Eléctricos y Electrónicos. Esta norma establece dos formatos, simple y doble precision. Para los dos casos se utiliza una expresión normalizada del número que se denomina coma flotante.

En un computador, la mantisa y el exponente se almacenan en palabras de memoria con un número limitado de bits. La cantidad de bits asignados a cada uno define el rango y la precisión de los números representados.

Simple precisión

En este caso se utiliza:

  • 1 bit para el signo
  • 8 bits para el exponente
  • 23 bits para la mantisa

Teniendo en cuenta que se utilizan 8 bits para el exponente, sus valores posibles variarían desde 0 hasta 255:

$$\underbrace {00000000}_{8\, bits}\,\,\,\,\,\,\,\,\text{hasta}\,\,\,\,\,\,\underbrace {11111111}_{8 \,bits} \equiv 1 + 2 + ... + {2^{7}} = {2^{8}} - 1 = 255$$

Con objeto de considerar las potencias de 2 negativas se hace un desplazamiento del exponente para que represente valores desde -128 a 127.

Utilizando un exponente con sesgo de 128 se pueden representar los siguientes números reales:

$$x = \left( { - 1} \right)^s × 2^{e - 128}× \,\,1.m \,\,\,\,\,\, \,\,\,\, 0 < e < 255 $$
Almacenamiento del número $3.125_{10}$ en precisión simple
Se tiene $$3.125_{10}=11.001_{2}=1.1001 × 2^{1}$$ donde $e=127+1=128=2^{7}$, $m=101$.

Convirtiendo el exponente en binario, se tendrá $10000000$.
La mantisa ajustada a 23 bits es $101\underbrace{0...0}_{20 \,\,bits}$.

Conversior a IEEE 32

Doble precisión

En Matlab la precisión que usaremos para los cálculos será doble precisión. En este caso se utiliza:

  • 1 bit para el signo
  • 11 bits para el exponente
  • 52 bits para la mantisa

Teniendo en cuenta que el exponente se almacena en 11 bits, los valores que se pueden considerar para el exponente son desde 0 hasta 2047:

$$\underbrace {0....0}_{11 \,bits}\,\,\,\,\,\,\,\,\text{hasta}\,\,\,\,\,\,\underbrace {1....1}_{11 \,bits} \equiv 1 + 2 + ... + {2^{10}} = {2^{11}} - 1 = 2047$$

Para poder considerar las potencias de 2 negativas se toma un desplazamiento o sesgo del exponente de 1023. Así, es posible representar los siguientes números:

$$x = \left( { - 1} \right)^s × 2^{e - 1023}× \,\,1.m \,\,\,\,\,\, \,\,\,\, 0 < e < 2047 $$
Almacenamiento del número $3.125_{10}$
Se tiene $$3.125_{10}=11.001_{2}=1.1001 × 2^{1}$$ donde $e=1023+1=1024=2^{10}$, $m=1001$.

Convirtiendo el exponente en binario, se tendrá $10000000000$.
La mantisa ajustada a 52 bits es $1001\underbrace{0...0}_{48 \,\,bits}$.

El número se almacenará de la forma: $$ \underbrace{0}_{signo} \underbrace{10000000000}_{exponente}\,\,\underbrace{10010...0}_{mantisa, \,48\,\,últimos \,\,bits\,\,0}$$


Se consideran las siguientes representaciones especiales:

  • Cero:  $e=0$, $m=0$.
  • Infinito:   $e=2047$, $m=0$.
  • NAN:   $e=2047$, $m \ne 0$.
Conversión a IEEE 64

Rango y precisión

Dado que la representación de números reales bajo estos formatos es aproximada, hay dos conceptos importantes en la aritmética en punto flotante:

  • Rango: Nos da el conjunto de intervalos donde existen números representables, este valor depende del exponente.

    Mayor número normalizado: realmax en Matlab

    $${2^{1023}} × 1.\underbrace {1....1}_{52 \,\,bits} \equiv {2^{1023}}\left( {1 + \sum\limits_{j = 1}^{52} {{1 \over {{2^j}}}} } \right) \approx 1.79 \,× {10^{308}}$$

    Menor número estrictamente positivo normalizado: realmin en Matlab

    $$2^{ - 1022} × 1.00...\underbrace 0_{bit\,\,52} \equiv {2^{ - 1022}} \approx 2.22 \,× {10^{-308}} $$
  • Precisión: Nos da la diferencia entre dos números representables consecutivos, depende del número de bits de la mantisa.

El número más pequeño que se puede representar después del 1 utilizando representación binaria en punto flotante con doble precisión es: $$1 = \left( { + 1} \right)× {{\rm{2}}^0}× 1.\underbrace {00...0}_{52}$$ $$1 + \varepsilon = \left( { + 1} \right)× {{\rm{2}}^0}× 1.\underbrace {00...01}_{52}$$

El valor de $\epsilon$ se llama épsilon de la máquina y en Matlab se identifica con eps: $\varepsilon_m = {2^{ - 52}}$.

El número más pequeño $\varepsilon$ de forma que $1-\varepsilon \ne 1$ es ${2^{ - 53}}$. Por tanto, las distancias entre el número que antecede a 1 y el que le precede son respectivamente $\varepsilon_m/2$ y $\varepsilon_m$.

Para cualquier otro número real, la distancia entre x y el número máquina más próximo en Matlab se utiliza eps(x)

Si consideramos que el bit escondido es cero, podemos obtener números menores que el mínimo número normalizado mediante la siguiente representación: $$x = \left( { - 1} \right)^s × 2^{- 1022} × \,\,0.f$$

Estos números se dicen que están desnormalizados.

Los números representados en la máquina no están igualmente distribuidos en la recta real, hay muchos más cerca del cero.
Obtén el menor número positivo desnormalizado.

Será $${2^{ - 1022}} \cdot 0.\underbrace {00...01}_{52\,bits} = {2^{ - 1022}} \cdot {2^{ - 52}} = {2^{ - 1074}}$$

Todos los números menores que este valor se consideran 0.

>>2^(-1074}
ans=   4.9407e-324
>>2^(-1075}
ans=
  0

Errores de redondeo y aritmética computacional

Error absoluto y relativo

Para medir los errores, se introducen los conceptos de error absoluto y error relativo. Si $\widetilde p$ es una aproximación de $p$, se define:

  • Error absoluto: $\left| {\widetilde p - p} \right|$
  • Error relativo:${{\left| {\widetilde p - p} \right|} \over {\left| p \right|}}$

En general, en los métodos numéricos no se conoce el valor verdadero, por lo tanto tampoco el error real. Lo frecuente es tener una estimación del error dada por una cota positiva al tamaño máximo del error.

Calcular el error absoluto y relativo siendo $p=3$ y $\widetilde p=3.1$. Repetir el cálculo para $p=3000$ y $\widetilde p=3001$.
$$ p = 3 \,\,\, \tilde p = 3.1 \,\,\, {E_a} = \left| {3 - 3.1} \right| = 0.1 \,\,\, {E_r} = \frac{{{E_a}}}{p} = 3\% $$ $$p = 3000 \,\,\, \tilde p = 3001 \,\,\, {E_a} = \left| {3000 - 3100} \right| = 100 \,\,\, {E_r} = \frac{{{E_a}}}{p} = 3\%$$
En 1862 el físico Foucault, utilizando un espejo giratorio, calculó en $298 000$ km/s la velocidad de la luz. Aceptando como exacta la velocidad de $299 776$ km/s, estimar el error absoluto y el error relativo cometido por Foucault. Por otra parte, la determinación de la constante universal h realizada por Planck en 1913 dio el valor de $6.41×10−27$ erg seg. Adoptando el valor de $6.623×10−27$ erg seg, estimar el error absoluto y relativo cometido por Planck. ¿Cuál de las dos medidas es más precisa?

Errores de redondeo

En el sistema decimal, existen dos formas de redondear un número a t de decimales. En el proceso denominado truncamiento (o redondeo hacia el cero) donde simplemente se eliminan todos los números ubicados a la derecha del t-ésimo decimal.La magnitud del error puede ser tan grande como $10^{-t}$.El redondeo al más cercano (tambien llamado redondeo óptimo) debe elegirse el número con $s$ decimales que sea más cercano a x.

En una máquina hipotética que utilizara un sistema decimal con dos dígitos decimales, escribe el número 3.246 usando truncamiento o redondeo.

El número 3.246 se representaría como 3.24 si se usa truncamiento o bien 3.25 si se usa redondeo. El truncamiento elimina todas las cifras que no pueden ser representadas por la máquina, en este caso a partir del tercer decimal. El redondeo, toma la primera cifra no respresentable, en este ejemplo, sería el 6 y le suma una unidad al último dígito si es mayor o igual a 5 o lo trunca si es menor que 5.

Si consideramos el número

$$x = {\left( { - 1} \right)^s}× {2^{{e_x}}} × 1.f\,\,\,\,\,\,\,\,\,\,\,\,\,\,0 < {e_x} < 1024$$

y denotamos por $fl(x)$ a su representación en punto flotante, es decir, al número que mejor representa a $x$ dentro de las limitaciones del sistema de representación numérica, se tendrá

$$\left| {x - fl\left( x \right)} \right| \le {2^{{e_x}}} \cdot {2^{ - 53}} \Rightarrow {{\left| {x - fl\left( x \right)} \right|} \over {\left| x \right|}} \le {2^{ - 53}}$$

entonces el épsilon de la máquina es una cota superior del error de redondeo en el sistema a punto flotante.

Recuerda que $fl(x)$
  • Es un número representable en el sistema.
  • Es el número más cercano a $x$ dentro del rango representable.
  • Si $x$ está exactamente entre dos números representables, el valor de $fl(x)$ dependerá de la política de redondeo (por ejemplo, redondeo al más cercano, truncamiento, etc.).

Propagación de errores

Si $\otimes$ es una operáción aritmética como una suma, resta, multiplicación o división, el cálculo sigue el siguiente proceso:

  1. Almacena los números $x$ e $y$ en coma flotante.
  2. Después realiza la operación con los números obtenidos.
  3. Finalmente da el resultado en punto flotante.

La representación de la operación es entonces

$$fl\left( {x \otimes y} \right) = fl\left( {fl\left( x \right) \otimes fl\left( y \right)} \right)$$ En consecuencia, el orden en el que se realizan las operaciones puede modificar el resultado final. Con el siguiente ejemplo se muestra que puede no cumplirse la propiedad asociativa.
Consideremos $x=10^{20}$, $y=-10^{20}$, $z=1$ y calcula con Matlab/Octave $x+(y+z)$ y $(x+y)+z$.

Observa que se obtiene respectivamente los valores 0 y 1.
Calcula con Matlab la siguiente operación $e=1 - 3*(4/3 - 1)$.
e =
  2.2204e-16
Imaginemos una máquina hipotética con base decimal y 2 dígitos de mantisa. Calcular la diferencia de 1025 y de 912.3.

El valor exacto es 112.7. El calculo sería de la siguiente manera

$$fl(1025)=1.02 \cdot 10^3 \,\,\,fl(-912.3)=-9.12\cdot 10^2$$ $$fl(1025)+fl(912.3)=1025-912.3=112.7 $$ $$ fl(fl(x)+fl(y))=1.12 \cdot 10^0$$

Además, cuando se realiza una cadena de operaciones, los errores de redondeo pueden acumularse de modo que resten validez al resultado. Para controlar la propagación de errores de redondeo, es necesario buscar algoritmos con un número mínimo de operaciones convenientemente dispuestas, manteniendo a la vez que el tiempo de ejecucion sea aceptable.

Para un análisis detallado sobre los errores en cálculos numéricos, como errores de redondeo, truncamiento y su propagación, se recomienda consultar los libros y .

Error por cancelación

Este error se produce cuando se calcula la diferencia de dos números bastante próximos, y el redondeo del ordenador iguala esa diferencia a 0.

Dados $x=1+2^{-54}$ e $y=1$, calcula con Matlab $x-y$

Nuestro ordenador establecerá que $x-y=0$ cuando en realidad $x - y \approx 5,5 \cdot {10^{ - 17}}$.

Dados $x=2^{60}+2^6$ e $y=2^{60}$, calcula con Matlab $x-y$.

Matlab establecerá que $x-y=0$ cuando en realidad $x - y =64$.

Considera la función \[f\left( x \right) = \left( {{e^x} - 1} \right) + {\left( {\frac{1}{{\sqrt {1 + {x^2}} }} - 1} \right)^2}\]Se quiere calcular $f'\left( 1 \right) \approx \frac{{f\left( {1 + h} \right) - f\left( 1 \right)}}{h}$ para valores de h pequeños. Genera un vector de valores de $h$ desde $10^{-1}$ hasta $10^{-17}$ observa que valor se obtendría para $f'(1)$. Realiza el cálculo derivando la función y sustituyendo en el punto 1.   
f=@(x) (exp(x)-1).^2+(1./sqrt(1+x.^2)-1).^2;
k=-1:-1:-17;h=10.^(k);
v=(f(1+h)-f(1))./h;
format long
disp([h' v'])

A partir del valor $k=-16$ se obtiene 0. Realizando la derivada y sustituyendo se obtiene el valor $ 9.54865532212975587$.

Se sabe que ${e^x} = \sum\limits_{n = 0}^\infty {{{{x^n}} \over {n!}}} $. Calcula una aproximación de $e^{-40}$ con los 100 primeros términos de la serie.

Calcula el mismo valor teniendo en cuenta que ${e^{ - x}} = {1 \over {{e^x}}}$. ¿Qué observas?   

Observa que como $x< 0$ los términos de la serie cambian de signo y si $|x|$ es grande, el valor de los sumandos puede devolver un valor pequeño. En algún momento estaremos con un error de cancelación cuando sumemos "el siguiente" término.

Si se considera el cálculo de la segunda forma, tomando el inverso de $e^{40}$, se evita el problema de cancelación.

x=40; %Inverso del número a calcular e^-40=1/e^40
suma=1;
p=1;
for k=1:99
  p=p*(x/k);
  suma=suma+p;
end
1/suma
x=-40; %Sin considerar el inverso
suma=1;
p=1;
for k=1:99
  p=p*(x/k);
  suma=suma+p;
end
suma

En los siguientes ejemplos, se muestra como una reformulación del cálculo puede evitar el problema de cancelacion en ciertas situaciones.

Considera la función \[f\left( x \right) = \frac{1}{{1 + 2x}} - \frac{{1 - x}}{{1 + x}}\] Observa que para valores próximos a 0 se puede producir cancelacion. Evalúa esta función en puntos próximos a 0 directamente y considerando la siguiente expresión equivalente \[f\left( x \right) = \frac{{2x^2}}{{\left( {1 + 2x} \right)\left( {1 + x} \right)}}\]
f=@(x) 1./(1+2*x)-(1-x)./(1+x);
%Se realiza la suma para evitar la cancelación
g=@(x) 2*x.^2./((1+2*x).*(1+x));
k=-1:-1:-17;
h=10.^k;
f1=f(h);
g1=g(h);
format long
disp([h' f1' g1'])
Repite el ejemplo anterior considerando la función $f\left( x \right) = \frac{{1 - \cos x}}{x}$ en los puntos próximos a cero y la expresión equivalente resultado de multiplicar y dividir por $1+\cos x$.   
f=@(x) (1-cos(x))./x;
%Se multiplica y divide por (1+cos(x))
g=@(x) sin(x).^2./(x.*(1+cos(x)));
k=-1:-1:-17;
h=10.^k;
f1=f(h);
g1=g(h);
format long
disp([h' f1' g1'])
Repite el ejemplo anterior considerando la función \[f\left( x \right) = \sqrt {x + \frac{1}{x}} - \sqrt {x - \frac{1}{x}} \] en los puntos próximos a uno. Considera como expresión equivalente el resultado de multiplicar y dividir por el conjugado.   
f=@(x) sqrt(x+1./x)-sqrt(x-1./x);
%Se multiplica y divide por el conjugado
g=@(x) 2*x./((sqrt(x+1./x)+sqrt(x-1./x)));
k=-1:-1:-25;
h=10.^k;
f1=f(1+h);
g1=g(1+h);
format long
disp([h' f1' g1'])

Error por desbordamiento

Con frecuencia una operación aritmética con dos números válidos da como resultado un número tan grande o tan pequeño que la computadora no puede manejarlo; como consecuencia se produce un overflow o un underflow, respectivamente.

Multiplica el valor máximo representable en punto flotante por dos para ilustrar el concepto de desbordamiento. Divide el valor mínimo positivo normalizado por 2 para observar que se representa por cero.   
% Obtenemos el valor máximo representable
maxVal = realmax;
% Intentamos exceder el valor máximo
overflow = maxVal * 2;
disp(['Desbordamiento resulta en: ', num2str(overflow)]);
% Obtenemos el valor mínimo positivo normalizado representable
minVal = realmin;
% Intentamos obtener un valor menor al mínimo
underflow = minVal * 1e-100;
disp(['Subdesbordamiento resulta en: ', num2str(underflow)]);

Inestabilidad numérica

Vamos a ver en el siguiente ejemplo, como los errores de redondeo pueden llevar a resultados incorrectos si se elige mál el algoritmo. Este problema se llama inestabilidad numérica que puede evitarse eligiendo algoritmos más adecuados.

Para cada $n \ge 0$ se considera la integral $${I_n} = \int\limits_0^1 {{x^n}sen\pi x\,dx} $$ Sabiendo que
$$\begin{aligned} & {I_o} = {2 \over \pi }\,\,\,,\,\,\,\,{I_1} = {1 \over \pi }\\ &{I_{n + 2}} = {1 \over \pi }\left[ {1 - {{\left( {n + 2} \right)\left( {n + 1} \right)} \over \pi }{I_n}} \right]\,\,\,\,\,\,\,\,n \ge 0 \end{aligned}$$ usar esta recurrencia para hallar $I_{30}$ e $I_{31}$. ¿Son los resultados aproximaciones satisfactorias de la integral? Explica los resultados y propón una alternativa eficiente para calcular $I_{30}$ e $I_{31}$. Obtén $I_{30}$ e $I_{31}$ por este nuevo procedimiento.   

Se calcula directamente el valor de $I_{30}$ e $I_{31}$ de forma iterativa y se obtienen valores negativos. Esto es imposible porque el integrando es positivo y por tanto las integrales deben ser positivas. El valor de $I_{30}$ que se otiene es -0.357484694711417 y para el valor de $I_{31}$ se obtiene -2.312387998625434

Despejando $I_n$ en función de $I_{n+2}$ se tiene:

\[\frac{{\left( {n + 2} \right)\left( {n + 1} \right)}}{\pi }{I_n} = 1 - \pi {I_{n + 2}}\] \[{I_n} = \frac{\pi }{{\left( {n + 2} \right)\left( {n + 1} \right)}}\left( {1 - \pi {I_{n + 2}}} \right)\] \[{I_n} = \frac{{{\pi ^2}}}{{\left( {n + 2} \right)\left( {n + 1} \right)}}\left( {\frac{1}{\pi } - {I_{n + 2}}} \right)\] Si se toma límites cuando $n$ tiene a infinito, se puede ver que la sucesión $I_n$ tiende a cero. Por ello, para utilizar esta expresión hacia atrás se debe partir de dos valores $I_{n+2}$ e $I_{n+1}$ próximos a cero para un valor de n alto. En el código se ha considerado $I_{56}$ e $I_{55}$ como 0.

El código para el cálculo directo es el siguiente:

a=2/pi; v(1)=1/pi;v(2)=1/pi-2*a/pi^2;
format long
for k=3:31;
   v(k)=1/pi-k*(k-1)*v(k-2)/pi^2;
end
disp([[1:31]' v'])

Para el cálculo inverso, las instrucciones son las siguientes.

a=56;
w(56)=0;w(55)=0;
for k=a-2:-1:1;
   w(k)=pi^2/((k+2)*(k+1))*(1/pi-w(k+2));
end
disp([[1:56]' w'])

El valor de $I_{30}$ es 0.003139287076703. El valor de $I_{31}$ es 0.002950500704051

Consideremos \[y_n\int\limits_0^1 {\frac{{{x^n}}}{{x + 5}}dx} \] Teniendo en cuenta que \[{y_n} = \int\limits_0^1 {\frac{{{x^{n - 1}}x}}{{x + 5}}dx} = \int\limits_0^1 {\frac{{{x^{n - 1}}\left( {x + 5 - 5} \right)}}{{x + 5}}dx} = \] \[ = \int\limits_0^1 {{x^{n - 1}}dx} - 5\int\limits_0^1 {\frac{{{x^{n - 1}}}}{{x + 5}}dx} = \frac{1}{n} - 5{y_{n - 1}}\]
Observa que el cálculo recurrente llega a obtener un valor de $y_{20}$ negativo, que es absurdo porque el integrando es positivo. Para evitar este problema, considera después la fórmula de recurrencia en sentido descendente \[{y_{n - 1}} = \frac{1}{{5n}} - \frac{{{y_n}}}{5}\] Calcula de esta manera $y_5$.   

En el cálculo recurrente de ${y_n} = \frac{1}{n} - 5{y_{n - 1}}$ el error se produce porque se restan dos números del mismo signo de magnitud similar.

Considerando la recurrencia ${y_n} = \frac{1}{n} - 5{y_{n - 1}}$

clear all
y(1)=1-5*(log(6)-log(5));
format longEng
for k=2:21;
y(k)=1/k-5*y(k-1);
end
disp([[1:40]' y'])

Tomando límites en ${y_n} = \frac{1}{n} - 5{y_{n - 1}}$ se observa que la sucesión $y_n$ converge a 0. Por lo tanto, tomando $y_{60}=0$ y considerando la ley de recurrencia ${y_{n - 1}} = \frac{1}{{5n}} - \frac{{{y_n}}}{5}$ se puede calcular por ejemplo $y_{20}$.

y(60)=0;
format longEng
for k=60:-1:2;
  y(k-1)=1/(5*k)-y(k)/5;
end
disp([[1:60]' y'])

Autoevaluación

**** Incluir preguntas del tema ****

Actividad de autoevaluación

Ejercicios

  • Calcular los números cuya representación en punto flotante de precisión doble es
    1. $0 \, 10000000100$
      $0110110000000000000000000000000000000000000000000000$
    2. $0\, 10000000011$
      $1011100100010000000000000000000000000000000000000000$
  • Escribe la representación normalizada en el estandar IEEE de doble precisión del número decimal -17.25.
¿Qué estimación es más precisa \[\frac{9}{{11}} = 0.818 \,\,\, \sqrt {18} = 2.243\]
Calcular el error absoluto, el error relativo y el número de cifras significativas de la aproximación de $\pi$ mediante
  • $p*=22/7$ (en Antiguo Egipto, siglo XXVI a.C)
  • $p*=223/71$ (Arquímedes, Antigua Grecia, siglo III a.C.)
  • $p*=3.14159$ (Liu Hui, China, año 265.)
  • $p*=355/113$ (Zu Chongzhi, China, año 480.)
Determina el mayor intervalo en el cual debe estar $p*$ para que aproxime a $\sqrt{2}$ con un error menor que $10^{-2}$
Resuelve el siguiente sistema con Matlab \[\left\{ \begin{array}{l} 17{x_1} + 5{x_2} = 22\\ 1.7{x_1} + 0.5{x_2} = 2.2 \end{array} \right.\] Una solución obvia es $x_1=x_2=1$ y el sistema tiene infinitas soluciones (la segunda ecuacion es la primera dividida por 10). ¿Qué sucede?
Se quiere calcular $p_n$ como $(1/3)^n$ para $n>0$ considerando $p_0=1$ definiendo $p_n=(1/3)p_{n-1}$ para $n>1$. Otra forma de generar la sucesión es definiendo $p_0=1$ y $p_1=1/3$ y calculando para $n>2$ \[{p_n} = \frac{{10}}{3}{p_{n - 1}} - {p_{n - 2}}\] ¿Alguno de los dos métodos es inestable?
Evaluar $\sum\limits_{n = 1}^{10000000} {\frac{1}{n}} $ primero en orden usual y luego en orden opuesto. Explicar las diferencias obtenidas e indique cuál es el resultado más preciso.
Justifica qué ocurre cuando se evalúa la expresión \[\sqrt {{x^2} + 1} - 1\] para valores próximos a cero. ¿Cómo se podría hacer más estable? Evalúa ambas expresiones para 20 puntos equidistantes entre 0 y 0.2.
Indica cómo evaluar con Matlab la expresión \[\frac{1}{{x + h}} - \frac{1}{x}\] para los valores de $h$ siguientes ${10^{ - 2}},\,{10^{ - 4}}{,...,10^{ - 22}}$ y el valor de $x$ que se considere. Escribe una reformulación de esta expresión de forma que no se produzca cancelación. Utiliza el formato longEng.
Calcular una fórmula alternativa para la expresión \[ - \log \left( {x - \sqrt {{x^2} - 1} } \right)\] que no sea susceptible de pérdida de cifras significativas cuando x es grande y positiva.
Considera la sucesion recurrente \[{x_1} = 2\,\,\,\,\,\,\,{x_{n + 1}} = {2^{n - \frac{1}{2}}}\sqrt {1 - \sqrt {1 - {4^{1 - n}}x_n^2} } \] que converge a $\pi$. Explica el comportamiento para $x_{550}$
Considera \[{y_n} = \int\limits_0^1 {{x^n}{e^x}dx} \,\,\,\,\,\,\left( {n \ge 0} \right)\] Utiliza integración por partes para obtener la siguiente relación de recurrencia \[{y_{n + 1}} = e - \left( {n + 1} \right){y_n}\] Calcula $y_{20}$ utilizando esta recurrencia. ¿Qué observas? ¿Qué ocurre si utilizas la ley de recurrencia ${y_n} = \frac{{e - {y_{n + 1}}}}{{n + 1}}$?
RESUMEN

En este capítulo se han visto los fundamentos sobre los errores en cálculo numérico, destacando cómo los sistemas computacionales representan y manipulan números, y cómo esto puede originar errores que afectan los resultados. A través de ejemplos históricos, como el fallo de los misiles Patriot en 1991 y la explosión del cohete Ariane 5 en 1996, se ilustra la relevancia de comprender la aritmética computacional.

Se clasifican y analizan errores como los de redondeo y truncamiento, destacando la importancia de desarrollar algoritmos numéricos confiables para minimizar estos problemas en aplicaciones prácticas.

Los aspectos clave en el estudio de los métodos numéricos son:

  1. Introducción a los errores en cálculo numérico. Los errores en los sistemas computacionales son inevitables debido a la naturaleza finita con la que las computadoras representan números reales y realizan operaciones matemáticas. Esta limitación se debe al uso de representaciones en punto flotante, que introducen imprecisiones al redondear o truncar los valores.

    Entender estas limitaciones es esencial para abordar problemas numéricos con precisión.

  1. Errores históricos relevantes. Casos como el fallo de los misiles Patriot en 1991, donde un error en la representación del tiempo provocó un cálculo incorrecto, y la explosión del cohete Ariane 5 en 1996, causada por un fallo en la conversión de datos numéricos, son ejemplos clave que muestran cómo errores aparentemente pequeños pueden llevar a consecuencias catastróficas en sistemas críticos.
  1. Clasificación de los errores Los errores numéricos se clasifican principalmente en dos tipos: errores de redondeo y errores de truncamiento. Los errores de redondeo ocurren al ajustar un número real a la precisión limitada de la computadora, mientras que los errores de truncamiento surgen al aproximar funciones o procesos matemáticos, como al usar series finitas para representar funciones infinitas. Además, los errores algorítmicos aparecen cuando los métodos numéricos no convergen correctamente hacia la solución deseada.
  2. Minimización de errores Reducir el impacto de los errores numéricos requiere el desarrollo de algoritmos robustos y estrategias específicas, como el control de precisión, el análisis de estabilidad de los métodos y la elección de representaciones numéricas adecuadas. Estas herramientas permiten minimizar la propagación de errores a lo largo de los cálculos y garantizar la confiabilidad de los resultados, especialmente en aplicaciones críticas como la ingeniería, la física y las finanzas.


Capítulo

Resolución aproximada de ecuaciones no lineales

Introduccion

El propósito de los métodos numéricos es encontrar soluciones aproximadas, ya que la mayoría de las ecuaciones no tienen soluciones exactas o estas no son computacionalmente viables. Este enfoque iterativo nos acerca a la solución deseada dentro de un margen de error aceptable .

Entre las aplicaciones más importantes de los métodos numéricos está la resolución de ecuaciones no lineales, una tarea esencial en disciplinas como física, ingeniería, economía y muchas otras áreas de la ciencia. Estas ecuaciones, donde la variable aparece de forma no lineal son clave para modelar fenómenos reales, desde el diseño de estructuras hasta la dinámica de sistemas físicos. Sin embargo, muchas veces estas ecuaciones no tienen soluciones exactas en términos algebraicos, lo que motiva el uso de métodos numéricos para encontrar soluciones aproximadas.

Imaginemos por ejemplo la siguiente ecuación obtenida a partir de la segunda ley de Newton para calcular la velocidad de un paracaidista,

$$v = {{g \cdot m} \over c}\left( {1 - {e^{ - {c \over m}t}}} \right)$$

donde la velocidad $v$ depende de la variable independiente tiempo, $t$, $g$ es la constante de gravitación, $c$ el coeficiente de resistencia y $m$ la masa del paracaidista.



Simulador de la velocidad de un paracaidista


Imaginemos que queremos obtener el coeficiente de resistencia del paracaidista con una masa dada, para alcanzar una velocidad determinada en un periodo establecido. ¿cómo se obtendría este valor? La solucion del problema sería obtener el valor de $c$ que hace cero a la siguiente función

$$f\left( c \right) = {{g \cdot m} \over c}\left( {1 - {e^{ - {c \over m}t}}} \right) - v$$

esto es, calcular el valor de $c$ de forma que $f(c)=0$.

Cuando como en este caso, no es posible encontrar el cero de la función o pudiendo encontrarlo su cálculo es complicado, se utilizan algoritmos que determinan, en un número finito de pasos, un valor aproximado de la raíz buscada. Estos métodos de aproximación generalmente son iterativos y nos conducen a una solución a través de una sucesión $x_0, x_1, ..., x_k,...$ que converge al valor $\alpha$ que cumple $f(\alpha)=0$.

A lo largo de la historia, la resolución de ecuaciones no lineales ha evolucionado desde métodos manuales hasta complejos algoritmos implementados en computadoras modernas. En la antigüedad, los babilonios y griegos ya aplicaban principios numéricos para resolver problemas matemáticos. Durante el Renacimiento y la Ilustración, métodos como la Regla Falsa o la técnica de Newton-Raphson marcaron grandes avances.

Así, el método de bisección, que tiene sus raíces en la antigüedad, utiliza un enfoque simple pero efectivo: dividir un intervalo y localizar la raíz mediante evaluaciones intermedias. Otros métodos, como el de Newton-Raphson, desarrollado en el siglo XVII por Isaac Newton Isaac Newton (1642-1727) fue un físico, matemático y astrónomo inglés, considerado uno de los científicos más influyentes de la historia. Desarrolló las leyes del movimiento y la gravitación universal, así como importantes contribuciones al cálculo, óptica y mecánica. Su obra más destacada, Philosophiæ Naturalis Principia Mathematica, sentó las bases de la física clásica. y Joseph Raphson Joseph Raphson (1648-1715) fue un matemático inglés conocido por su trabajo en análisis numérico. Publicó el método de Newton-Raphson en su obra Analysis Aequationum Universalis (1690), una técnica iterativa para encontrar raíces de ecuaciones no lineales. Su versión mejorada del método de Newton fue más algebraica y general, contribuyendo al desarrollo de la matemática aplicada., aprovechan herramientas del cálculo diferencial para encontrar soluciones con gran rapidez, utilizando la pendiente de las tangentes de la función.

En el siglo XX, con el desarrollo de la computación, matemáticos como Alan Turing y John von Neumann John von Neumann (1903-1957) fue un matemático, físico y pionero de la computación húngaro-estadounidense. Contribuyó al desarrollo de la teoría de juegos, la mecánica cuántica y los métodos numéricos en computación científica. Fue clave en la creación de las primeras computadoras y en la formulación de la arquitectura de Von Neumann, base de los sistemas computacionales modernos. sentaron las bases para implementar estos métodos en máquinas, haciendo posible resolver problemas que antes eran inabordables.

El estudio de estos métodos no solo es relevante por su aplicabilidad, sino también por su historia, que refleja el ingenio humano para buscar soluciones a problemas complejos.

En el siguiente video se da una visión rápida de los métodos más importantes que se abordan en este capítulo.

Métodos de resolución de ecuaciones no lineales

Raíz o cero de una función

A cualquier solución de la ecuación $f(x)=0$ se le llama cero o raíz de la funcion. Sea $f$ una función continua en un intervalo abierto $I$, $\alpha$ un punto de $I$ y $m \ge 1$ un número entero, se dice que $\alpha$ es un cero de $f$ de multiplicidad $m$ si $$f\left( x \right) = {\left( {x - \alpha } \right)^m}q\left( x \right)\,\,\,\,\,\,\,\,x \ne \alpha $$

Se puede demostrar que si f es $C^m(I)$ y $\alpha$ es un punto de $I$, la función tiene un cero de multiplicidad $m$ en $\alpha$ si

$$f(\alpha)=f'(\alpha)=...=f^{m-1}(\alpha)=0,       f^{m}(\alpha) \ne 0$$

Localización y separación de raíces

En un primer paso para obtener las raíces de una función, se busca un intervalo donde se encuentra una o varias soluciones de la ecuación. Posteriormente, se buscan intervalos que contengan una sola raíz. El siguiente teorema ayuda en esta localización y separación de raíces.

TEOREMA DE BOLZANO: Si $f$ es una función continua en $[a,b]$ de manera que $f(a)f(b) < 0$, entonces existe al menos un cero de la función en el intervalo [a,b].

El hecho de que la función $f$ tenga un cero, no significa que sea único. Si se añaden condiciones adicionales, como por ejemplo la monotonía estrica de $f$ en un intervalo $I$, sí se podría garantizar que la solución de $f(x)=0$ es única en dicho intervalo.

Se recuerda que en el caso de que la función sea derivable, si $f'(x)> 0$ en todo punto de $I$ la función es estrictamente creciente en I. Análogamente, si $f'(x)< 0$ en $I$ entonces es estrictamente decreciente.

Algoritmos iterativos.

Para la aproximación al cero de la función $f$ se utilizan métodos iterativos que en el caso de un paso consiste en:
  1. Partir de un valor inicial $x_0$ que se supone suficientemente próximo a la solución buscada.
  2. Iterar, es decir, obtener mediante la fórmula $x_{k+1}=G(x_k)$ con $k \ge 0$.

Este proceso depende tanto de la función $G$ como del punto inicial $x_0$. Un algoritmo se debe dar respuesta a las siguientes cuestiones:

  1. ¿es la sucesión convergente? (convergencia del método)
  2. en caso de ser convergente, ¿es el límite de la sucesión la solución de $f(x)=0$?
  3. ¿cuál es el número de iteraciones que hay que realizar para conseguir que el error de aproximación sea menor que una cantidad prefijada? (velocidad de convergencia).
  4. ¿cómo evoluciona el error al realizar las iteraciones?

Convergencia de un algoritmo

Se dice que un algoritmo converge globalmente, si la sucesión generada es convergente hacia una solución de la ecuación cualquiera que sea el punto inicial $x_0$ que tomemos.

Cuando la solución converge hacia la solución únicamente si el punto $x_0$ pertenece a un cierto entorno, la convergencia se dice que es local.

No siempre es mejor considerar un algoritmo que converja globalmente, a veces, un algoritmo localmente convergente, puede tener una "velocidad de convergencia" mayor si bien este tipo de algoritmos plantean la dificultad de cómo elegir el intervalo adecuado donde considerar $x_0$.

El método de aproximaciones sucesivas o punto fijo, que consiste en partir de un punto $x_0$ y calcular los demás términos de la sucesión $x_n$ de la forma $x_{n+1}=g(x_n)$, para calcular la raíz de $x=g(x)$, tiene una convergencia más lenta que el método de Newton que converge localmente.

Velocidad de convergencia

Se distinguen distintos tipos de convergencia que pasamos a definir.

Dada una sucesión de números reales, $\left\{ {x _k} \right\}_{k = 1}^\infty $, convergente hacia un punto $\overline x$, se dice que el orden o velocidad de convergencia es $p$, con $p \ge 1$ si existe una constante $C_p \ge 0$ tal que: $$\left| {{x_{k + 1}} - \overline x } \right| \le {C_p}{\left| {{x_k} - \overline x \,} \right|^p}$$ para todo $ k \ge k_0$ siendo $k_0$ entero.

En particular,

  • si $p$=1 y $C_p< 1$, la convergencia es lineal. Si $C_p \ge 1$, la convergencia es sublineal.
  • si $p$=2, la convergencia es cuadrática.
  • si $p$=3, la convergencia es cúbica.
Consideremos la sucesión ${x_n} = {1 \over 6} - {1 \over 3}{\left( { - {1 \over 2}} \right)^n}$ que converge a $1/6$. Veamos que la convergencia es lineal.
Se puede comprobar que $$\left| {{x_{n + 1}} - {1 \over 6}} \right| \le {1 \over 2}\left| {{x_n} - {1 \over 6}} \right|$$ ya que $$\left| {{x_{n + 1}} - {1 \over 6}} \right| = {1 \over {3 \cdot {2^{n + 1}}}}\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\left| {{x_n} - {1 \over 6}} \right| = {1 \over {3 \cdot {2^n}}}$$
Las sucesiones $a_n=1/n$, $b_n=1/n^3$, $c_n=1/2^n$ convergen linealmente al 0. La sucesion $d_n=3^{-2^n}$ converge cuadráticamente a 0.
En efecto, $$ {a_k} = \frac{1}{k} \,\,\,\,\,\, \left| {\frac{1}{{k + 1}} - 0\,} \right| \le \left| {\frac{1}{k} - 0\,} \right| \,\,\,\,\,\, p = 1$$ $${b_k} = \frac{1}{{{k^3}}} \,\,\,\,\,\, \left| {\frac{1}{{{{\left( {k + 1} \right)}^3}}} - 0\,} \right| \le \left| {\frac{1}{{{k^3}}} - 0\,} \right| \,\,\,\,\,\, p = 1$$ $${c_k} = \frac{1}{{{2^k}}} \,\,\,\,\,\, \left| {\frac{1}{{{2^{k + 1}}}} - 0\,} \right| \le \left| {\frac{1}{{{2^3}}} - 0\,} \right| \,\,\,\,\,\, p = 1$$ Para $d_n=3^{-2^n}$ \[{\left( {{3^{{2^k}}}} \right)^2} = {3^{{2^{k + 1}}}} \Rightarrow \left| {\frac{1}{{{3^{{2^{k + 1}}}}}} - 0{\mkern 1mu} } \right| \le {\left| {\frac{1}{{{3^{{2^k}}}}} - 0{\mkern 1mu} } \right|^2}\,\,\,\,\,\,p = 2\]
Supongamos que $C_p=0.5$ y que $\left| {{x_k} - \overline x} \right| < 0.01$. Considerando $p=1$ y $p=2$, analizar cómo se aproxima al valor límite considerando el término $k+1$ y $k+2$.

Se tiene que

  • Si $p=1$, $$\left| {{x_{k + 1}} - \overline x} \right| < C_p\left| {{x_{k}} - \overline x} \right| <5 \cdot 10^{-1} \cdot 10^{-2}$$ $$ \left| {{x_{k + 2}} - \overline x} \right| < C_p \left| {{x_{k + 1}} - \overline x} \right| <5 \cdot 10^{-1} \cdot (5 \cdot 10^{-3}) =25 \cdot 10^{-4}$$
  • Si $p=2$, $$\left| {{x_{k + 1}} - \overline x} \right| < C_p\left| {{x_{k}} - \overline x} \right|^2 < 5 \cdot 10^{-1} \cdot (10^{-2})^2 =5 \cdot 10^{-5}$$
$$\left| {{x_{k + 2}} - \overline x} \right| < C_p \left| {{x_{k + 1}} - \overline x} \right|^25 \cdot 10^{-1} \cdot (5\cdot 10^{-5})^2=125 \cdot 10^{-11} $$

Se dice que la sucesión converge superlinealmente, si existe una sucesión $\left\{ {{\varepsilon _k}} \right\}_{k = 1}^\infty $ convergente a 0 tal que $$\left| {{x_{k + 1}} - \bar x} \right| \le {\varepsilon _k}\left| {{x_k} - \bar x{\mkern 1mu} } \right|\,\,{\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \forall k \ge 0$$

Observa que si la sucesión tiene una velocidad de convergencia $p$ mayor que 1 entonces converge superlinealmente. Bastaría tomar $${\varepsilon _k} = {C_p}{\left| {{x_k} - \bar x{\mkern 1mu} } \right|^{p - 1}}\,\,{\mkern 1mu} {\mkern 1mu} {\mkern 1mu} \forall k \ge 0$$

El siguiente resultado permite determinar un test de parada de las iteraciones cuando la convergencia es superlineal.

Si $x_k$ converge superlinealmente a ${\bar x}$ entonces $$\mathop {\lim }\limits_{k \to \infty } {{\left| {{x_{k + 1}} - {x_k}{\mkern 1mu} } \right|} \over {\left| {{x_k} - \bar x{\mkern 1mu} } \right|}} = 1$$

Una vez establecida la precisión que se quiere alcanzar, $\varepsilon > 0$, puede considerarse como test de parada: $$\left| {{x_{k + 1}} - {x_k}} \right| < \varepsilon$$ se compara así dos iteraciones consecutivas y se mira la coincidencia de dígitos que se considere (fijado por el valor de $\epsilon$).

Cuando la convergencia es lineal puede ocurrir que la diferencia entre los valores obtenidos en dos iteraciones, $|x_{k+1}-x_k|$, sea pequeño y, sin embargo, $x_{k+1}$ esté alejado de la solución. Considerar la sucesión $x_{k+1}=\frac{x_k} {1.1}+3$ con $x_0=100$ que converge a 33 y analizar la diferencia entre dos términos consecutivos para $k$ desde 1 hasta 18.

El límite de la sucesión se obtiene resolviendo la ecuación

\[x = \frac{x}{{1.1}} + 3 \Rightarrow x\left( {1 - \frac{1}{{1.1}}} \right) = 3 \Rightarrow x = 33\] Analizamos en la siguiente tabla cómo los valores de la sucesión están próximos y sin embargo, están lejos del valor límite.
k xn |xk+1 - xk|
0 100.0000 -
1 93.0909 6.9091
.. .. ..
7 69.5798 2.1570
8 68.9844 0.5954
9 68.0767 0.9077
10 67.7970 0.2797
11 67.6337 0.1633
12 67.5398 0.0939
13 67.4907 0.0491
14 67.4633 0.0274
15 67.4476 0.0157
16 67.4387 0.0089
17 67.4330 0.0057
18 67.4295 0.0035

Método de la bisección

Aplicando el teorema de Bolzano, una forma sencilla de aproximar el cero de una función continua es dividir el intervalo en dos y elegir el subintervalo en el que se sigue produciendo el cambio de signo. Repitiendo este proceso se puede llegar a conseguir una aproximación de la solución de $f(x) = 0$ tan precisa como se desee.

Método de la bisección
Los pasos del algoritmo son:

  1. Elige $[a, b]$ donde la función $f$ cambia de signo.
  2. Calcula el punto medio de $[a, b]$: $c = (a + b) / 2$.
  3. Si $f(a)$ y $f(c)$ tienen signos opuestos, la raíz está en el intervalo $[a, c]$; de lo contrario, está en $[c, b]$.
  1. Redefine el intervalo $[a, b]$ como $[a, c]$ si $f(a)$ y $f(c)$ tienen signos opuestos, o como $[c, b]$ si $f(c)$ y $f(b)$ tienen signos opuestos.
  2. Repite los pasos 2-4 hasta que $[a, b]$ sea lo suficientemente pequeño o se alcance una precisión deseada.
Método de la bisección
Observa que $$\left| {{x_k} - \overline x } \right| < {1 \over 2}\left( {{b_k} - {a_k}} \right) = {1 \over {{2^2}}}\left( {{b_{k - 1}} - {a_{k - 1}}} \right) = ...$$ $$= {1 \over {{2^{k + 1}}}}\left( {b - a} \right)\mathop { \to 0}\limits_{k \to \infty }$$
Este resultado asegura la convergencia del método de la Bisección.
Considerando las funciones y los intervalos de la tabla , calcular las tres primeras iteraciones del método de la bisección. Comprueba previamente que la función en cada intervalo tiene únicamente un cero.

$f(x)$ $a$ $b$
$cos(x)-x$ $0$ $2$
$sen(x)$ $-0.5$ $\pi/2$
$x^2-sen(x)$ 0.5 2

En primer lugar, veremos que cada función tiene un único cero en el intervalo indicado.

  • La función $f(x)=\cos(x)-x$ es continua y cumple además que $f(0)\cdot f(2) <0$. Esto significa que al menos tiene un cero en $[0,2]$. Como $f'(x)=-sen(x)-1 <0$ la función es decreciente en ese intervalo.
  • La función $f(x)=sen(x)$ es continua y cumple que $f(-0.5)\cdot f(\pi/2) <0$. Esto significa que al menos tiene un cero en $[-0.5,\pi/2]$. Como $f'(x)=\cos(x) >0$ la función es creciente en ese intervalo.
  • La función $f(x)=x^2-sen(x)$ es continua y cumple además que $f(0.5)\cdot f(2) <0$. Esto significa que al menos tiene un cero en $[0.5,2]$. Como $f'(x)=2x+\cos(x) >0$ la función es creciente en ese intervalo.

Se puede comprobar los valores de las tres primeras iteraciones, utilizando la herramienta interactiva que se muestra a continuación introduciendo la función y los valores de $a$ y $b$ en cada caso.

Ejemplos del método de la bisección
Dada la función $f(x)=x^3-6x^2+11x-6$, calcular el cero de la función en el intervalo $[3,5]$ tomando como tolerancia el valor $0.001$ y $30$ como número máximo de iteraciones.

Define una función Matlab/Octave que tenga como parámetros los extremos del intervalo $a$ y $b$, la tolerancia y el máximo de iteraciones. Utilizar esta función para calcular los ceros de la función $f(x)$ en los intervalos $[-1,0]$ y $[0,1]$.

La herramienta interactiva siguiente construye paso a paso el código de la función que se solicita, bisectionMethod(a,b,tol,maxiter). Para ello, se debe pulsar en el botón solucion guiada.

Programación método de la bisección

Para calcular los ceros en cada intervalo bastaría escribir

bisectionMethod(3,5,10^-3,30)
%Solución:
bisectionMethod(-1,0,10^-3,30)
%Solución:
bisectionMethod(0,1,10^-3,30)
%Solución:
Modifica el código para que la función cuyo cero se quiere calcular sea también un parámetro, esto es, programar una función Matlab/Octave: bisectionMethod2(fun,a,b,tol,maxiter).
Definida bisectionMethod2(fun,a,b,tol,maxiter), para cacular el cero de $f(x)=x^3-6x^2+11x-6$ en el intervalo $[3,5]$, con una tolerancia $10^{-6}$ y un máximo de 25 iteraciones, se deberá escribir el código siguiente.
f=@(x) x^.^3-6*x-^2+11*x-6
bisectionMethod2(f,3,5,10^-6,25)
%Solución:

Método del punto fijo

Dada la ecuación $f(x)=0$, los pasos a seguir son:
  1. Se despeja $x$ como $x=g(x)$ buscando un punto fijo $\overline x$ de $g$, esto es un $\overline x$ cumpliendo $\overline x=g(\overline x)$.
  2. Partiendo de $x_0$ se busca la raíz haciendo iteraciones $$x_{k+1}=g(x_k),        k=0,1,...$$ de manera que ${x_k}$ converja a $\overline x$
Método del punto fijo

Veamos algunas condiciones suficientes para que haya un punto fijo en un intervalo y condiciones suficientes de convergencia a un único punto fijo.

Sea $g$ continua en $[a,b]$ con $g(x)\in [a,b]$ para todo $x \in [a,b]$, entonces $g$ tiene un punto fijo en $[a,b]$.

Sea $g$ continua en $[a,b]$ con $g'$ en $(a,b)$ cumpliendo
$$\left| {g'\left( x \right)} \right| \le L < 1\,\,\,\,\,\,\,\,para\,\,\,todo\,\,x \in \left( {a,b} \right)$$ Si $x_0$ es cualquier punto en $(a,b)$ entonces la solución
$${x_{k + 1}} = g\left( {{x_k}} \right)\,\,\,\,\,\,k \ge 0$$ converge al único punto fijo en $[a,b]$.

Además, $$\left| {{x_{k + 1}} - \overline x} \right| \le {{{L^k}\left| {{x_1} - {x_o}} \right|} \over {1 - L}}\,\,\,\,\,\,k = 1,2,...$$

Si al utilizar el método del punto fijo $x_{k+1}$ y $x_k$ coinciden dentro de la exactitud especificada $\epsilon$, no significa que $\overline x \approx {x_{k+1}}$ con la misma exactitud. En general, esta afirmación no es correcta. Si $g'(x)$ está próxima a la unidad, entonces la cantidad $\left| {{x_k} - \overline x} \right|$ puede ser grande, aún cuando $\left| {{x_{k+1}} - x_k} \right|$ sea extremadamente pequeña.

Considera la función $g(x)=x-x^2/10$ que tiene como punto fijo el 0. Comprueba que la derivada en las proximidades del 0 es próxima a 1 y analizar los valores que se obtienen con el método del punto fijo.
Resolver $cos(x)-x=0$ considerando el siguiente algoritmo: $$ {x_o} = 0.5 \,\,\, , \,\,\,\,\, {x_{k + 1}} = \cos \left( {{x_k}} \right)\,\,\,\,\,k,0,1,2,... $$
A partir de la iteración 89 se estabiliza la sucesión obteniendo 0.739085133215161
Gráficas del ejemplo

Ejemplos del método del punto fijo
Calcular los ceros de $f(x)=x-e^{-x^2}$ en $[0,1]$ utilizando el método del punto fijo considerando las funciones $g(x)=e^{-x^2}$ y $g(x)={-log(x)}^{-1/2}$. Empieza en el punto $0.5$ realizando 100 iteraciones y analiza los resultados.
Con ayuda de Matlab/Octave se han representando las dos funciones comprobando que, mientras que con la primera función se cumple la condición para asegurar la convergencia al punto fijo, mientras que en la segunda no. Para la primera función el valor obtenido como punto fijo de $g$ y cero de $f$ es $ 0.652918623454627$.
Acotar las raíces de $p(x)=x^3+3x^2-1=0$. Encontrar las raíces programando el método del punto fijo con una función Matlab/Octave que tenga como argumentos la función, el punto inicial, la tolerancia y el número máximo de iteraciones fixedPointMethod(g,x0, tol, maxiter).

Analizamos en primer lugar, los ceros de la función y qué función considerar para aplicar el punto fijo.

Se tiene que $p'(x)=3x^2+6x=3x(x+2)$ tiene dos ceros en el punto 0 y en -2. En el punto $(0,-1)$ hay un mínimo y en el punto $(-2,3)$ un máximo. Luego $p$ tiene tres raíces reales. Aislando estas tres raíces se tiene que están situadas en los intervalos [-3,-2], [-1,0], [0,1].

  • En el intervalo [-3,-2], dividiendo por $x^2$ al ser $x$ distinto de 0, habría que calcular las raíces de $x+3-1/x^2=0$. Se puede considerar $g(x)=1/x^3-3$. En este caso la sucesión es convergente ya que $$\left| {g'\left( x \right)} \right| = \left| { - 2{x^{ - 3}}} \right| \le {1 \over 4} < 1$$
  • En el intervalo [-1,0], la raíz a calcular será de la ecuación $x^2(x+3)=1$. Se puede considerar $g(x)=-\sqrt{(x+3)^{-1}}$ que aplica el intervalo $[-1,0]$ dentro del intervalo $[-1,0]$. En este caso $$\left| {g'\left( x \right)} \right| = \left| {{1 \over 2}{{\left( {x + 3} \right)}^{ - 3/2}}} \right| \le {1 \over {2 \cdot 2^{3/2}}} < 1$$
  • En el intervalo [0,1], la raíz a calcular será de la ecuación $x^2(x+3)=1$. Se puede considerar $g(x)=\sqrt{(x+3)^{-1}}$ que aplica el intervalo $[0,1]$ dentro del intervalo $[0,1]$. En este caso $$\left| {g'\left( x \right)} \right| = \left| {{1 \over 2}{{\left( {x + 3} \right)}^{ - 3/2}}} \right| \le {1 \over {2 \cdot 3^{3/2}}} < 1$$

En la escena interactiva siguiente, se muestra paso a paso cómo generar el código de esta función: fixedPointMethod(g,x0, tol, maxiter).

g=@(x) x.^3-3;tol=10^-6;
fixedPointMethod(g,-2.5, tol, 100)
g=@(x) -sqrt((x+3)^-1); fixedPointMethod(g,-1.5, tol, 100)
g=@(x) -sqrt((x+3)^-1); fixedPointMethod(g,0.5, tol, 100)
Programación guiada del método del punto fijo

Método de Newton

Este método aproxima la solución de la ecuación $f(x)=0$ mediante una sucesión $x_k$ contruida, a partir de un valor inicial $x_0$, utilizando la expresión iterativa: $$x_{k+1} = x_k − \frac{f(x_k )}{ f'(x_k )} \,\,\,\,\,k ≥ 0$$
La idea es, una vez obtenido $x_k$, calcular $x_{k+1}$ utilizando la aproximación lineal de $f(x)$ que proporciona su recta tangente en el punto $(x_k,f(x_k))$: $$f(x) ≈ f(x_k )+f'(x_k)(x−x_k)$$ Se toma $x_{k+1}$ como la intersección de esta recta con el eje de abscisas, es decir la solución de $$f(x_k ) + f'(x _k )(x − x_k ) = 0$$
Método de Newton
Representación del método de Newton
Obtener cinco iteraciones del Método de Newton para encontrar la solución de la ecuación no lineal $$x-cos(x)=0$$
Consideramos $f(x)=x-cos(x)$. Se cumple que $f'(x)=1+sen(x)$.

Tomamos el intervalo $[0,1]$ como el intervalo $[a,b]$ donde $f(a)f(b)< 0$. Además, en ese intervalo la derivada es estrictamente positiva por lo que la función es creciente y solo hay un cero. Como punto $x_0$, consideramos el punto medio del intervalo $[0,1]$.

$x_0=0.5$

$x_1=x_0-\frac{x_0-cos(x_0)}{1+sen(x_0)}$   0.755222417105636

$x_2=x_1-\frac{x_1-cos(x_1)}{1+sen(x_1)}$   0.739141666149879

$x_3=x_2-\frac{x_2-cos(x_2)}{1+sen(x_2)}$   0.739085133920807

$x_4=x_3-\frac{x_3-cos(x_3)}{1+sen(x_3)}$   0.739085133215161

$x_5=x_4-\frac{x_4-cos(x_4)}{1+sen(x_4)}$   0.739085133215161

El código Matlab a utilizar para calcular las cinco iteraciones es el siguiente:

x=0.5
for k=1:5
  x=x-(x-cos(x))/(1+sin(x))
end
%A partir de la cuarta iteración se
%estabiliza el resultado
Con ayuda de la siguiente herramienta puedes encontrar las primeras iteraciones del Método de Newton para distintas funciones introduciendo el punto inicial.

Ejemplos del método de Newton

Convergencia

Tomando el punto inicial $x_0$ cercano a la solución, bajo ciertas condiciones sobre la función $f$, el método de Newton es convergente localmente con orden de convergencia cuadrático (de orden 2).

Convergencia local. Sea $f$ un función de $\mathbb R$ en $\mathbb R$ derivable y tal que que $f'$ es una función continua. Supongamos que $f\left( {\overline x } \right) = 0$ y $f'\left( {\overline x } \right) \ne 0$. Entonces existe $\varepsilon > 0$ tal que si $${x_o} \in \left( {\overline x - \varepsilon ,\,\overline x + \varepsilon } \right)$$ la sucesión generada por el método de Newton, $\left\{ {{x_k}} \right\}_{k = 0}^\infty $ está bien definida (esto es, está en el intervalo anterior) y $$\mathop {\lim }\limits_{k \to \infty } {x_k} = {\overline x } $$ Convergencia cuadrática. Además, si $f$ es dos veces derivable con $f''$ continua, existe una constante $C > 0$ tal que: $$\left| {{x_{k + 1}} - {\overline x } } \right| \le C{\left| {{x_k} - {\overline x }} \right|^2}\,\,\,\,\,\,\forall k \ge 0$$
Calcular las raíces de $e^x+2^{-x}+2cos(x)=6$ en $[0,1]$
f=@(x) exp(x)+2.^-x+2*cos(x)-6
df=@(x) exp(x)-log(2)*2.^-x-2*sin(x)
%se busca un intervalo [a, b] con $f(a)f(b) < 0$
%Tomamos [1,2]
%Aplicamos el Método de Newton
x=1.5
x=x-f(x)/df(x)
%repetimos la instrucción para iterar hasta conseguir
%16 decimales

En la siguiente tabla se muestran las primeras seis iteraciones.

$x_0$ 1.500000000000000
$x_1$ 1.956489721124210 $x_5$ 1.829383601933849
$x_2$ 1.841533061042061 $x_6$ 1.829383601933849
$x_3$ 1.829506013203651
$x_4$ 1.829383614494166

Observad que en este caso, se duplica, aproximadamentemente, la cantidad de decimales de cada iteracion (convergencia cuadrática).

Para calcular la diferencia entre dos iteraciones se podría utilizar el siguiente código Matlab:

f=@(x) exp(x)+2^-x+2*cos(x)-6
df=@(x) exp(x)-2^-x*log(2)-2*sin(x)
x=1.5
x1=x-f(x)/df(x),error=abs(x-x1),x=x1;
o si se quisiera ir guardando los distintos valores de cada iteración en un vector
f=@(x) exp(x)+2^-x+2*cos(x)-6
df=@(x) exp(x)+2^-x*log(2)-2*sin(x)
k=1; x(k)=1.5
x(k+1)=x(k)-f(x(k))/df(x(k)),error=abs(x(k)-x(k+1)),k=k+1;
Obtener la raíz del polinomio $p\left( x \right) = {x^3} + 3{x^2} + 2$ que se encuentra en el intervalo $[-4 -2]$.
Podemos considerar como punto de inicio el punto medio del intervalo $x_0=-3.25$.
p=[1 3 0 2]
%polyder deriva el polinomio
dp=polyder(p)
%polyval(p,a) evalúa el polinomio en a
%método de Newton
%intervalo [-4,-2]
polyval(p,-4);polyval(p,-2)
x=-3.25
x=x-polyval(p,x)/polyval(dp,x)
%repetimos este último paso para iterar, sol=-3.195823345445647

Si se repite el proceso con $x_0=1$, no converge, las iteraciones oscilan entre negativo y positivo. Esto es porque el método de Newton converge localmente.

Test de parada

Se pueden considerar los siguientes tests:

  1. que la diferencia entre dos iteraciones consecutivas sea menor que un cierto valor $\epsilon$ $$\left| {{x_{k + 1}} - {x_k}} \right| < \varepsilon \,\,\,\,\text{error absoluto}$$ $$\left| {{x_{k + 1}} - {x_k}} \right| < \varepsilon |{x_{k+1}}| \,\,\,\,\text{error relativo}$$ Combinando estos dos errores, sería $$\left| {{x_{k + 1}} - {x_k}} \right| < \varepsilon \max \left\{ {1,\left| {{x_{k + 1}}} \right|} \right\}$$
  1. dado que se busca $f(x)=0$ se parará cuando $f(x_{k+1})$ sea pequeño, lo que comprobaremos con el test $$|f(x_{k+1})| < \epsilon_f$$ Para funciones sencillas un valor habitual es $\varepsilon_f = \varepsilon _M^{3/4}$.
Construye una función Matlab/Octave que permita aplicar el método de Newton para una función dada considerando como parámetros el punto inicial, el máximo de iteraciones y la tolerancia.
Con la herramienta siguiente se muestra cómo generar paso a paso el código Matlab/Octave de la función newtonMethod(x0, tol, maxiter) que utiliza como método de parada que la diferencia entre dos iteraciones consecutivas sea menor que la tolerancia fijada.
Programación guiada del método de Newton

Método de Newton combinado con bisección

Se parte de un intervalo $[a,b]$ en el que $f(a)f(b) < 0$ y se toma como punto inicial $x_0=\frac{a+b}{2}$.

En cada iteración se busca una nueva aproximación $x_{k+1}$ y se actualizan $a$ y $b$ como se indica a continuación:

  • Si $x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k}$ está en $[a,b]$ se acepta, en caso contrario se utiliza bisección, es decir, $x_{k+1}=\frac{a_k+b_k}{2}$
  • Se considera $[a_{k+1}, b_{k+1}]$ como el intervalo $[a_{k}, x_{k+1}]$ o $[x_{k+1}, b_{k}]$ según haya cambio de signo de $f$ en los extremos.

No se aplicará el método de Newton cuando el denominador $f'(x_k)$ sea muy pequeño (overflow), o mejor, cuando el cociente $\frac{f(x_k)}{f'(x_k)}$ sea muy grande. Es decir, no utilizaremos el método de Newton cuando $$|\frac{f(x_k)}{f'(x_k)}| > \frac{1}{\epsilon_M}$$ Esta última condición se implementa de la forma siguiente: $$|{f'(x_k)}| < {\epsilon_M} |{f(x_k)}|$$

Mostramos a continuación el algoritmo aplicado a un ejemplo:

Encontrar la raiz de $e^x+2^{-x}+2cos(x)-6=0$ en $[1,2]$ utilizando el método de Newton combinado con Bisección.
f=@(x) exp(x)+2.^-x+2*cos(x)-6
df=@(x) exp(x)-log(2)*2.^-x-2*sin(x)
f(1)*f(2)
em=eps/2
a=1;b=2;fa=f(a);fb=f(b);x=(a+b)/2;fx=f(x);
[a x b],[fa fx fb]
$a$ $x$ $b$
$1$ $1.5$ $2$
$f(a)$ $f(x)$ $f(b)$
$-1.701113559804675$ $-1.023283135733256$ $0.806762425836365$

Si $f(a) \cdot f(x) < 0$ se considera $[a,x]$, en caso contrario se toma $[x,b]$. En este caso, el nuevo intervalo $[a,b]$ es $[1.5,2]$

Iteración 1

a=x;fa=fx;m=df(x);
if abs(m)>em*abs(fx),x=x-fx/m;[a x b],end
fx=f(x); [fa fx fb]

Iteración 1
$a$ $x$ $b$
$ 1.500000000000000$ $1.956489721124211$ $2.000000000000000$
$f(a)$ $f(x)$ $f(b)$
$-1.023283135733256$ $0.579701373274924$ $0.806762425836365$

Iteración 2
b=x;fb=fx;m=df(x);
if abs(m)>em*abs(fx),x=x-fx/m,end
fx=f(x);[fa fx fb]
Iteración 2
$a$ $x$ $b$
$ 1.500000000000000$ $1.841533061042061$ $1.956489721124211$
$f(a)$ $f(x)$ $f(b)$
$-1.023283135733256$ $0.050340951614865$ $0.579701373274924$

Iteración 3
b=x;fb=fx;m=df(x);
if abs(m)>em*abs(fx),x=x-fx/m,end
fx=f(x);[a x b],[fa fx fb]
Iteración 3
$a$ $x$ $b$
$ 1.500000000000000$ $1.829506013203651$ $1.841533061042061$
$f(a)$ $f(x)$ $f(b)$
$-1.023283135733256$ $0.0005021213225915$ $0.050340951614865$

Iteración 4
b=x;fb=fx;m=df(x);
if abs(m)>em*abs(fx),x=x-fx/m,end
fx=f(x);[a x b],[fa fx fb]
Iteración 4
$a$ $x$ $b$
$ 1.500000000000000$ $1.829383614494166$ $1.829506013203651$
$f(a)$ $f(x)$ $f(b)$
$-1.023283135733256$ $0.000000051516139$ $0.000502121322591$

Iteración 5
b=x;fb=fx;m=df(x);
if abs(m)>em*abs(fx),x=x-fx/m,end
fx=f(x);[a x b],[fa fx fb]
Iteración 5
$a$ $x$ $b$
$ 1.500000000000000$ $\mathbf{ \color{blue}1.829383601933849}$ $1.829383614494166$
$f(a)$ $f(x)$ $f(b)$
$-1.023283135733256$ $0.000000000000001$ $0.0000000515161391$

La solución es $x=1.829383601933849$. En este ejemplo, siempre el valor de $x$ obtenido ha estado en el intervalo por lo que en cada iteración se ha aplicado siempre Newton.

Encontrar la raiz de $e^x+2^{-x}+2cos(x)-6=0$ que se encuentra entre $[-3,-2]$ utilizando el método de Newton combinado con bisección.
f=@(x) exp(x)+2^(-x)+2*cos(x)-6
df=@(x) exp(x)-log(2)*2^(-x)-2*sin(x)
f(-3)*f(-2)
a=-3;fa=f(a);b=-2;fb=f(b);x=(a+b)/2;fx=f(x);em=eps/2;
[a x b],[f(a) f(x) f(b)]
$a$ $x$ $b$
$-3.000000000000000$ $-2.500000000000000$ $-2.000000000000000$
$f(a)$ $f(x)$ $f(b)$
$0.069802075166974$ $-1.863347982977588$ $-2.696958389857672$

Iteración 1
b=x;fb=fx;dfx=df(x);
if abs(dfx)>em*abs(fx)
  x=x-fx/dfx;
  if a$<$=x & b$>$=x
    disp('Se aplica Newton')
    fx=f(x);
  else
    disp('Se aplica Biseccion')
    x=(a+b)/2;fx=f(x);
  end
else
  x=(a+b)/2;fx=f(x);
end
[a x b],[fa fx fb]
Iteración 1
$a$ $x$ $b$
$-3.000000000000000$ $-2.750000000000000$ $-2.500000000000000$
$f(a)$ $f(x)$ $f(b)$
$0.069802075166974$ $-1.057505574028503$ $-1.863347982977588$

Repitiendo el código modificado el intervalo $[a,b]$ se obtiene la solución en 6 iteraciones.

Iteración 2: Bisección
$a$ $x$ $b$
$-3.000000000000000$ $-2.875000000000000$ $-2.750000000000000$
$f(a)$ $f(x)$ $f(b)$
$0.069802075166974$ $-0.536899807501486$ $-1.057505574028503$

Iteración 3: Newton
$a$ $x$ $b$
$-3.000000000000000$ $-2.994267548648236$ $-2.875000000000000$
$f(a)$ $f(x)$ $f(b)$
$0.069802075166974$ $0.040014356224199$ $-0.536899807501486$

Iteración 4: Newton
$a$ $x$ $b$
$-2.994267548648236$ $-2.986542066999646$ $-2.875000000000000$
$f(a)$ $f(x)$ $f(b)$
$0.040014356224199$ $0.000174552940576$ $-0.536899807501486$

Iteración 5: Newton
$a$ $x$ $b$
$-2.994267548648236$ $2.986508070038639$ $-2.875000000000000$
$f(a)$ $f(x)$ $f(b)$
$0.000174552940576$ $0.000000003371666$ $-0.536899807501486$

Iteración 6: Newton
$a$ $x$ $b$
$-2.986508070038639$ $\mathbf{ \color{blue} -2.986508069381928}$ $-2.875000000000000$
$f(a)$ $f(x)$ $f(b)$
$0.000000003371666$ $0$ $-0.536899807501486$

El cero en el intervalo $[-3,-2]$ es $-2.986508069381928$

El método de Newton tiene el problema de que podría darse “overflow” si se divide por un número muy pequeño, o converger a otra raíz (no a la raíz que se busca) o incluso no converger. Además, al requerir la derivada de la función podría ser difícil de obtener en el caso de ciertas funciones como las definidas por integrales o por series infinitas por ejemplo.

Escribir el código Matlab/Octave para programar el método de la secante combinado con bisección a partir de dos puntos imiciales donde la función cambie de signo, la tolerancia y el máximo de iteraciones permitidas: NewtonBisecciónMethod(x0, tol, maxiter)

Con la herramienta siguiente se muestra cómo generar paso a paso el código Matlab/Octave de la función NewtonBisecciónMethod(x0,tol, maxiter) que utiliza como método de parada que la diferencia entre dos iteraciones consecutivas sea menor que la tolerancia fijada.


Programación guiada del método de Newton combinado con bisección

Método de la secante

Este método se basa en considerar que la recta secante aproxima a la recta tangente en intervalos pequeños.

Este método parte de dos aproximaciones iniciales $x_o$ y $x_1$. eEn el paso $k+1$, se calcula $x_{k+1}$ usando $x_k$ y $x_{k-1}$ como la intersección con el eje X de la recta secante, que pasa por los puntos $(x_{k-1}, f(x_{k-1})$ y $(x_{k}, f(x_{k})$. Es decir, $${x_{k + 1}} = {x_k} - {{f\left( {{x_k}} \right)} \over {{m_k}}}\,\,\,\,\,\,\,\,\,\,\,\,{m_k} = {{f\left( {{x_k}} \right) - f\left( {{x_{k - 1}}} \right)} \over {{x_k} - {x_{k - 1}}}}$$

Para llegar a esta expresión, hay que tener en cuenta que la ecuación de la recta secante es $$y = f\left( {{x_k}} \right) + {m_k}\left( {x - {x_k}} \right)\,\,\,\,\,\,\,\,\,\,\,\,{m_k} = {{f\left( {{x_k}} \right) - f\left( {{x_{k - 1}}} \right)} \over {{x_k} - {x_{k - 1}}}}$$

El método proporciona $x_{k+1}$ como solución de $$0 = f\left( {{x_k}} \right) + {m_k}\left( {x - {x_k}} \right)$$

Método de la secante
Representación del método de la secante

Calcular, utilizando el método de la secante, las 5 primeras iteraciones para calcular el cero de la función $f(x)=cos(x)$ considerando como $x_0=0$ y $x_1=1$.
Con la ayuda del siguiente interactivo puede calcular las tres primeras iteraciones del método de la secante comenzando en los puntos $0$ y $2$.
Ejemplos del método de la secante
Escribir una función Matlab/Octave para aplicar el método de la secante que tenga como argumentos los puntos $x_0$, $x_1$, la tolerancia y el número máximo de iteraciones permitidas.

Pulsando en el botón solución guiada del interactivo siguiente, se muestra la programación de la función secantMethod(x0, x1, tol, maxiter).

Programación guiada del método de la secante

Convergencia

El orden de convergencia de este método, en un punto cercano a la solución, es el número áureo, $\phi = \frac{{1 + \sqrt 5 }}{2} \approx 1.618$, por lo que se trata de una convergencia superlineal inferior a la del método de Newton-Raphson. En caso de que la aproximación inicial sea demasiado lejana o la raíz no sea simple, este método no asegura la convergencia y tiene un comportamiento similar al de Newton-Raphson.

Método de la secante combinado con bisección

De la misma forma que el método de Newton, resulta conveniente programar este método combinado con el método de la bisección.

Se parte de un intervalo $[a,b]$ donde $f(a)f(b)< 0$. Se toma $x_0=a$ y $x_1=b$.

En cada iteración, se busca una nueva aproximación $x_{k+1}$ y se actualiza $a$ y $b$ como se indica a continuación:

  • Si $x_{k+1}=x_{k}-\frac{f(x_{k})}{m_k}$ está en $[a_k,b_k]$ se acepta, en caso contrario se utiliza bisección, es decir, $x_{k+1}=\frac{a_k+b_k}{2}$
  • Se modifica el intervalo $[a_{k+1},b_{k+1}]$ tomando o bien $[a_k,x_{k+1}]$ o bien $[x_{k+1},b_k]$ según que haya cambio de signo de $f$ en los extremos del intervalo.

Tampoco se aplicará el método de la secante cuando el denominador $m_k$ sea muy pequeño. Esta última condición se implementa de la forma siguiente: $$|{m_k}| > {\epsilon_M} |{f(x_k)}|$$

Los test de parada a utilizar son los mismos que en el caso del método Newton-Bisección.

La función \(erf(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} dt\) está definida para \(x \geq 0\). Determina el valor de \(x\) tal que \(erf(x) = 0.5\). Nota: Utilizar la función de Matlab \(erf\) para evaluar las integrales.
Consideramos en primer lugar un intervalo donde la función cambie de signo, por ejemplo $[a,b]=[0,1]$. Definimos $x_0=0$ y $x_1=0$ para empezar a iterar el método de la secante. Se calcula la siguiente iteración $x$ utilizando el método de la secante y se comprueba si está en $[0,1]$.

em=eps/2;format long
f=@(x) erf(x)-0.5
f(0)*f(1)
a=0;b=1;fa=f(a);fb=f(b);x0=a;fx0=fa;x1=b;fx1=fb;
%Calculamos siguiente punto por el mét. de la secante
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;fx=f(x);
end
%Se comprueba que éstá en [a,b], no necesario bisección
[a x b],[f(a) fx f(b)]
Iteración 1
$a$ $x$ $b$
$0$ $0.593330401707401$ $1.000000000000000$
$f(a)$ $f(x)$ $f(b)$
$-0.500000000000000$ $0.098584503929305$ $0.342700792949715$

El cambio de signo se produce en $[a,x]$. Tomamos este intervalo como el nuevo $[a,b]$. Actualizamos $x_0$ y $x_1$ que serán respectiamente $x_1$ y $x$.


b=x;x0=x1;x1=x;fx0=f(x0);fx1=f(x1);
% Calculo del siguiente punto
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;fx=f(x);
end
[a x b],[f(a) fx f(b)] % Se comprueba que está en [a,b]
Iteración 2
$a$ $x$ $b$
$0$ $0.429099981968989$ $0.593330401707401$
$f(a)$ $f(x)$ $f(b)$
$-0.500000000000000$ $-0.043957753989566$ $0.342700792949715$

El cambio de signo se produce en $[x,b]$. Tomamos este intervalo como el nuevo $[a,b]$. Actualizamos $x_0$ y $x_1$ que serán respectiamente $x_1$ y $x$.


a=x;x0=x1;x1=x;fx0=f(x0);fx1=f(x1);
% Calculo del siguiente punto
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;fx=f(x);
end
[a x b],[f(a) fx f(b)]
%Se comprueba que está en [a,b]
Iteración 3
$a$ $x$ $b$
$0.429099981968989$ $0.479746018406641$ $0.593330401707401$
$f(a)$ $f(x)$ $f(b)$
$-0.043957753989566$ $0.002522030582461$ $0.098584503929305$

El cambio de signo se produce ahora en $[a,x]$. Tomamos este intervalo como el nuevo $[a,b]$. Actualizamos $x_0$ y $x_1$ que serán respectiamente $x_1$ y $x$-


b=x;x0=x1;x1=x;fx0=f(x0);fx1=f(x1);
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;fx=f(x);
end
[a x b],[f(a) fx f(b)]
%Se comprueba que está en [a,b]
Iteración 4
$a$ $x$ $b$
$0.429099981968989$ $0.476997923639157$ $0.479746018406641$
$f(a)$ $f(x)$ $f(b)$
$-0.043957753989566$ $0.000055407570768$ $0.002522030582461$

De nuevo, el cambio de signo se produce en $[a,x]$. Tomamos este intervalo como el nuevo $[a,b]$. Actualizamos $x_0$ y $x_1$ que serán respectiamente $x_1$ y $x$.


b=x;x0=x1;x1=x;fx0=f(x0);fx1=f(x1);
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;fx=f(x);
end
[a x b],[f(a) fx f(b)]
%Se comprueba que está en [a,b]
Iteración 5
$a$ $x$ $b$
$0.429099981968989$ $0.476936276206905$ $0.476997923639157$
$f(a)$ $f(x)$ $f(b)$
$-0.043957753989566$ $-0.000000074435110$ $0.000055407570768$

El cambio de signo de $f$ se produce en $[x,b]$. Tomamos este intervalo como el nuevo $[a,b]$. Actualizamos $x_0$ y $x_1$ que serán respectiamente $x_1$ y $x$.


a=x;x0=x1;x1=x;fx0=f(x0);fx1=f(x1);
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;fx=f(x);
end
[a x b],[f(a) fx f(b)] % Se comprueba que está en [a,b]
Iteración 6
$a$ $x$ $b$
$0.476936193389100$ $0.476936276206905$ $0.476997923639157$
$f(a)$ $f(x)$ $f(b)$
$1.0e-04 *$
-0.000744351095761$
$1.0e-04 *$
$0.000000021886937$
$1.0e-04 *$
$0.554075707681623$

El cambio se produce en $[a,x]$, que será el nuevo $[a,b]$.


b=x;x0=x1;x1=x;fx0=f(x0);fx1=f(x1);
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;fx=f(x);
end
[a x b],[f(a) fx f(b)]
%Se comprueba que está en [a,b]
Iteración 7
$a$ $x$ $b$
$0.476936193389100$ $\mathbf{ \color{blue} 0.476936276204470}$ $0.476936276206905$
$f(a)$ $f(x)$ $f(b)$
$1.0e-07 *$
-0.744351095760543$
$1.0e-07 *$
$0$
$1.0e-07 *$
$0.000021886936707$

Se obtiene la solucion en el punto $0.476936276204470$.

Dada la matriz $$A (x)= \begin {pmatrix} x & 2 & { - 3} & 5 & 0 & {{x^2}} \\ 1 & 1 & 1 & 1 & 1 & 1 \\ 0 & x & x & 0 & 5 & { - 2} \\ 1 & { - 1} & 1 & { - 1} & {2x} & 0 \\ 1 & 0 & 1 & 0 & {{x^2}} & { - 2} \\ 0 & 0 & 1 & 0 & {\cos (x)} & { - x} \\ \end{pmatrix}$$ determinar un valor de \(x\) tal que \(-2\) sea un valor propio.
Utilizando el método de la secante, dada la dificultad de calcular la derivada, se debe calcular el valor de x de manera que $f(x)=det(A(x)+2I)=0$ siendo I la matriz identidad 6x6.

Definimos la función y comprobamos que en en el intervalo $[1,2]$ hay cambio de signo.


%det(A-landa*I) landa=-2 valor propio
%f(x)=det(A(x)+2I)
f=@(x) det([x+2 2 -3 5 0 x^2;1 3 1 1 1 1;
0 x x+2 0 5 -2; 1 -1 1 1 2*x 0;
1 0 1 0 (x^2)+2 -2;0 0 1 0 cos(x) -x+2])
%Buscamos cambios de signo
% f(0)<0
% f(1)<0
% f(2)>0
% Hay otros intervalos donde la función cambia de signo
% pero solo piden calcular un valor de x

Definimos el intervalo inicial $[a,b]=[1,2]$ y tomamos $x_0=1$, $x_1=2$. Calculamos el punto $x_2$ bien aplicando secante si se encuentra en $[a,b]$ o utilizando bisección.


em=eps/2;format long
a=1;b=2;x0=a;x1=b;fx0=f(x0);fx1=f(x1);
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
	x=x1-fx1/m
	[a x b]
end
%En este caso x está dentro del intervalo [a,b]
Iteración 1
$a$ $x$ $b$
$1.000000000000000$ $1.264336373802500$ $2.000000000000000$
$f(a)$ $f(x)$ $f(b)$
$1.0e-02 *$
-0.389735559513635$
$1.0e-02 *$
$0.168432357189391$
$1.0e-02 *$
$1.084656912121114$

Hay cambio de signo en $[a,x]$ por lo que este intervalo será el nuevo intervalo $[a,b]$.

b=x;fb=f(b);x1=x;fx1=fx;
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
x=x1-fx1/m
[a x b]
end
%En este caso x está dentro del intervalo [a,b]
[a x b],fx=f(x);[fa fx fb]
Iteración 2
$a$ $x$ $b$
$1.000000000000000$ $1.184570415928323$ $1.264336373802500$
$f(a)$ $f(x)$ $f(b)$
$-38.973555951363515$ $0.507113188549775$ $16.843235718939074$

Vuelve a haber cambio de signo en $[a,x]$ por lo que ejecutando el mismo código anterior se tiene los siguientes valores.

Iteración 3
$a$ $x$ $b$
$1.000000000000000$ $1.182094285551603$ $1.184570415928323$
$f(a)$ $f(x)$ $f(b)$
$-38.973555951363515$ $-0.008881043100172$ $0.507113188549775$

En este caso hay cambio de signo en $[x,b]$ por lo que el nuevo intervalo $[a,b]$ es $[x,b]$.

a=x;fa=f(a);x0=x1;fx0=fx1;x1=x;fx1=fx;
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
x=x1-fx1/m
[a x b]
end
%En este caso x está dentro del intervalo [a,b]
[a x b],fx=f(x);[fa fx fb]
Iteración 4
$a$ $x$ $b$
$1.182094285551603$ $1.182136903509806$ $1.184570415928323$
$f(a)$ $f(x)$ $f(b)$
$-0.008881043100172$ $0.000004066033751$ $0.507113188549775$

En este caso hay cambio de signo en $[a,x]$ por lo que el nuevo intervalo $[a,b]=[a,x]$.

b=x;fb=f(b);x1=x;fx1=fx;
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
x=x1-fx1/m
[a x b]
end
%En este caso x está dentro del intervalo [a,b]
[a x b],fx=f(x);[fa fx fb]
Iteración 5
$a$ $x$ $b$
$1.182094285551603$ $1.182136884006832$ $1.182136903509806$
$f(a)$ $f(x)$ $f(b)$
$-0.008881043100172$ $0.000000000032507$ $0.000004066033751$

Como vuelve a haber cambio de signo en el intervalo $[a,x]$ se ejecuta el mismo código anterior.

Iteración 7
$a$ $x$ $b$
$1.182094285551603$ $1.182136884006832$ $1.182136903509806$
$f(a)$ $f(x)$ $f(b)$
$-0.008881043100172$ $0.000000000000003$ $0.000000000032507$

Nuevamente vuelve a haber cambio de signo en $[a,x]$ por lo que se ejecuta el mismo código otra vez.

Iteración 7
$a$ $x$ $b$
$1.182136884006676$ $\mathbf{ \color{blue} 1.182136884006676}$ $1.182136884006832$
$f(a)$ $f(x)$ $f(b)$
$1.0e-10 *$
$0.000025575661434$
$1.0e-10 *$
$0.000025575661434$
$1.0e-10 *$
$0.325066656820725$

En cada iteración el valor de $x$ calculado por el método de la secante ha cumplido que está en el intervalo $[a,b]$ por lo que no se ha aplicado bisección en ninguna iteración.

Aplicando el método de la secante bisección calcular el cero de la función $f(x)=e^x+2^{-x}+2cos(x)-5$ en el intervalo $[-5,0]$ con una tolerancia $10^{-7}$.
Se comienza viendo si hay cambio de signo de $f$ en $[-5,0]$. Como $f(-5)f(0)<0$, se considera $[a,b]=[-5,0]$, y se toma $x_0=-5$, $x_1=0$ los puntos iniciales para aplicar el método de la secante.

f=@(x) exp(x)+2.^-x+2*cos(x)-5; em=eps/2;format long
a=-5;b=0;fa=f(a);fb=f(b);x0=a;x1=b;fx0=fa;fx1=fb;

Se calcula el siguiente término de la sucesión, $x$, aplicando secante si el valor obtenido se encuentra en $[a,b]$ o, en caso contrario, utilizando bisección.


%Código cálculo siguiente término
m=(fx1-fx0)/(x1-x0);
if abs(m)>em*abs(fx1)
    x=x1-fx1/m;
    if a<=x & b>=x
        disp('Aplicamos secante')
    else
        disp('Aplicamos biseccion')
        x=(a+b)/2;
    end
    fx=f(x);
    [a x b],[f(a) fx f(b)]
else
    disp('División por cero')
end
Iteración 1
$a$ $x$ $b$
$-5.000000000000000$ $-0.174983869789607$ $0$
$f(a)$ $f(x)$ $f(b)$
$27.574062317925538$ $-1.062118961781644$ $-1.000000000000000$

Como hay cambio de signo en $[a,x]$ este será el nuevo intervalo $[a,b]$. Se modifica el intervalo, se cambia el valor de $x_0$ por $x_1$ y $x_1$ por $x_0$ y se ejecuta después el código que está en negrita en el paso previo.

b=x;x0=x1;fx0=fx1;x1=x;fx1=fx;
%Ejecutar después código cálculo siguiente término
Iteración 2. Se aplica bisección
$a$ $x$ $b$
$-5.000000000000000$ $-2.587491934894803$ $-0.174983869789607$
$f(a)$ $f(x)$ $f(b)$
$27.574062317925538$ $-0.615010653972961$ $-1.062118961781644$

De nuevo el cambio de signo de $f$ es en $[a,x]$, por lo que este será el nuevo intervalo $[a,b]$. Se modifica el intervalo, se cambia el valor de $x_0$ por $x_1$ y $x_1$ por $x$ y se ejecuta después el código para calcular el siguiente término.

b=x;x0=x1;fx0=fx1;x1=x;fx1=fx;
%Ejecutar código cálculo siguiente término
Iteración 3. Se aplica bisección
$a$ $x$ $b$
$-5.000000000000000$ $-3.793745967447402$ $-2.587491934894803$
$f(a)$ $f(x)$ $f(b)$
$27.574062317925538$ $7.301512320864664$ $-0.615010653972961$

Ahora el cambio de signo de $f$ es en $[x,b]$, se cambia el intervalo $[a,b]$ y los valores de $x_0$ y $x_1$.

a=x;x0=x1;x1=x;fx0=fx1;fx1=fx;
%Repetir código cálculo siguiente término
Iteración 4. Se aplica secante
$a$ $x$ $b$
$-3.793745967447402$ $-2.681202151333973$ $-2.587491934894803$
$f(a)$ $f(x)$ $f(b)$
$7.301512320864664$ $-0.309376060449428$ $-0.615010653972961$

El intervalo donde cambia de signo $f$ es $[a,x]$, cambiamos el intervalo $[a,b]$ y actualizamos $x_0$ y $x_1$ para la próxima iteración.

b=x;x0=x1;x1=x;fx0=fx1;fx1=fx;
%Repetir código cálculo siguiente término
Iteración 5. Se aplica secante
$a$ $x$ $b$
$-3.793745967447402$ $-2.726426099664577$ $-2.681202151333973$
$f(a)$ $f(x)$ $f(b)$
$7.301512320864664$ $-0.146504190440662$ $-0.309376060449428$

De nuevo el intervalo donde cambia de signo $f$ es $[a,x]$, cambiamos el intervalo $[a,b]$ y actualizamos $x_0$ y $x_1$ para la próxima iteración.

b=x;x0=x1;x1=x;fx0=fx1;fx1=fx;
%Repetir código cálculo siguiente término
Iteración 6. Se aplica secante
$a$ $x$ $b$
$-3.793745967447402$ $-2.767105303128926$ $-2.726426099664577$
$f(a)$ $f(x)$ $f(b)$
$7.301512320864664$ $0.008859811280272$ $-0.146504190440662$

El cambio de signo $f$ es en $[x,b]$, cambiamos el intervalo $[a,b]$ y actualizamos $x_0$ y $x_1$ para la próxima iteración.

a=x;x0=x1;x1=x;fx0=fx1;fx1=fx;
%Repetir código cálculo siguiente término
Iteración 7. Se aplica secante
$a$ $x$ $b$
$-2.767105303128926$ $-2.764785524662011$ $-2.726426099664577$
$f(a)$ $f(x)$ $f(b)$
$0.008859811280272$ $-0.000229260174994$ $-0.146504190440662$

El cambio de signo de $f$ es $[a,x]$, cambiamos el intervalo $[a,b]$ y actualizamos $x_0$ y $x_1$ para la próxima iteración.

b=x;x0=x1;x1=x;fx0=fx1;fx1=fx;
%Repetir código cálculo siguiente término
Iteración 8. Se aplica secante
$a$ $x$ $b$
$-2.767105303128926$ $ -2.764844038099813$ $-2.764785524662011$
$f(a)$ $f(x)$ $f(b)$
$0.008859811280272$ $-0.000000343381642$ $-0.000229260174994$

De nuevo, el cambio de signo de $f$ es en $[a,x]$, cambiamos el intervalo $[a,b]$ y actualizamos $x_0$ y $x_1$ para la próxima iteración.

b=x;x0=x1;x1=x;fx0=fx1;fx1=fx;
%Repetir código cálculo siguiente término
Iteración 9. Se aplica secante
$a$ $x$ $b$
$-2.767105303128926$ $\mathbf{ \color{blue} -2.764844125871619}$ $-2.764844038099813$
$f(a)$ $f(x)$ $f(b)$
$0.008859811280272$ $0.000000000013341$ $-0.000000343381642$

La solución con la tolerancia indicada es $-2.764844125871619$.

Escribir el códgo Matlab/Octave para programar el método de la secante combinado con bisección a partir de dos puntos imiciales donde la función cambie de signo, la tolerancia y el máximo de iteraciones permitidas: SecanteBisecciónMethod(a, b, tol, maxiter)

Con la herramienta siguiente se muestra cómo generar paso a paso el código Matlab/Octave de la función SecanteBisecciónMethod(a, b, tol, maxiter) que utiliza como método de parada que la diferencia entre dos iteraciones consecutivas sea menor que la tolerancia fijada.


Programación guiada del método de la secante combinado con bisección

Raíces de un polinomio

En este apartado, nos ocuparemos de encontrar todas las raíces (reales y complejas) de un polinomio, es decir, calcularemos todas las soluciones de $${a_o} + {a_1}x + {a_2}{x^2} + ... +{a_n}{x^n} = 0$$

Recordemos los siguientes resultados que aplican a los polinomios:

  • Teorema Fundamental del Álgebra: Un polinomio de grado $n$ tiene exactamente $n$ raíces en el conjunto de los números complejos, donde cada una de ellas debe contarse con su multiplicidad.
  • Si un polinomio tiene coeficientes reales, siempre que tenga una raiz compleja no real, también tendrá como raíz su conjugada.
  • Si $p\left( x \right) = {a_o} + {a_1}x + {a_2}{x^2} + ... + {a_n}{x^n}$, todas las raíces satisfacen $${{\left| {{a_0}} \right|} \over {b + \left| {{a_0}} \right|}} \le \overline x \le 1 + {c \over {\left| {{a_n}} \right|}}\,\,\,\,$$ siendo $$b = \max \left\{ {\left| {{a_1}} \right|,\,\,\left| {{a_2}} \right|,...,\left| {{a_n}} \right|} \right\}$$ $$c = \max \left\{ {\left| {{a_0}} \right|,\,\,\left| {{a_1}} \right|,...,\left| {{a_{n - 1}}} \right|} \right\}$$

Aunque inicialmente se ha descrito el método de Newton para calcular las raíces de una ecuación $f(x)=0$ siendo $f$ una función real de variable real, el método también es válido para encontrar raíces de funciones complejas. Además, como la derivada de un polinomio es fácilmente calculable, el método de Newton resulta adecuado para calcular las raíces de un polinomio.

Una vez calculada una raíz de un polinomio por el Método de Newton, nos planteamos cómo encontrar otra evitando que el método de Newton vuelva a converger a la raíz ya calculada.

Una primera idea sería elegir otro punto de inicio, sin embargo, esto no garantizaría que el método converja necesarimente a otra raíz.

Otra posibilidad, podría ser considerar el polinomio resultado de dividir $p(x)$ entre $x-\alpha$ siendo $\alpha$ la raíz calculada previamente y aplicar el método de Newton a este nuevo polinomio. Sin embargo, este método, conocido como deflacción, presenta también problemas:

  1. La operación de división conlleva errores de redondeo.
  2. El método de Newton nos devuelve una aproximación de la raíz exacta, $\alpha *$ por lo que el cociente $\frac{p(x)}{x-\alpha}$ no coincide con $\frac{p(x)}{x-\alpha *}$ y, en consecuencia, no tienen por qué tener las mismas raíces.

Dado que el hecho de que dos polinomiostengan coeficientes muy próximos no implica que tengan las mismas raíces (por ejemplo, basta considerar $p(x)=x^2+1.99x+1.01$ y $q(x)=x^2+2x+1$). El método alternativo a utilizar es el Método de Maehly.

La idea de este método es, una vez calculadas las raíces, $$\left\{ {{\alpha _1},{\alpha _2},...,{\alpha _m}} \right\}$$ del polinomio $p(x)$, aplicar el método de Newton al polinomio $${f_m}\left( x \right) = {{p\left( x \right)} \over {\left( {x - {\alpha _1}} \right)\left( {x - {\alpha _2}} \right)...\left( {x - {\alpha _m}} \right)}}$$ Nota: Sin hacer la división

Se puede comprobar que

$${{{f_m}\left( x \right)} \over {f{'_m}\left( x \right)}} = {{p\left( x \right)} \over {p'\left( x \right) - p\left( x \right)\sum\limits_{j = 1}^m {{1 \over {x - {\alpha _j}}}} }}$$
El método consiste en aplicar el método de Newton aplicado a la función $f_m$ considerando: $$\begin{aligned} & {x_o} \in \mathbb C \\ & x_{k + 1} = {x_k} - {\rm{ }}{{p\left( x_k \right)} \over {p'\left( x_k \right) - p\left( x_k \right)\sum\limits_{j = 1}^m {{1 \over {x_k - {\alpha _j}}}} }}\,\,\,\,\,\, k \ge 0 \end{aligned}$$
En los ejercicios prácticos usaremos un programa del profesor Eduardo Casas (ficheros Matlab) para realizar una iteraciòn del método de Maehly (ficheros Matlab) Puedes descargar el fichero Matlab itraiz.m

.

Para aplicar este método, se debe tener en cuenta:

  1. A la hora de calcular la primera raiz, el algoritmo se reduce a aplicar el método de Newton al polinomio: $$\begin{aligned} & {x_o} \in \mathbb C \\ & x_{k + 1} = {x_k} - \frac{p(x_k)} {p'(x_k)} \,\,\,\,\,\, k \ge 0 \end{aligned}$$
  2. Si los coeficientes del polinomio son todos reales y $x_0$ es real, la sucesion ${x_k}$ será de números reales y no podrá converger a una raíz compleja. Por lo tanto, deberá tomarse $x_0$ complejo si se quiere encontrar una raíz compleja.
  1. El método de Newton converge cuadráticamente hacia una raíz $\overline x$ si $p'(\overline x)\ne0$. Si se observa que los valores de $x_k$ convergen pero lentamente, puede deberse a que se está aproximando a una raíz múltiple o hay raíces muy próximas. En este caso se aplica el método de Newton a la derivada del polinomio comenzando en el último punto $x_k$ calculado en las iteraciones sobre $p$.

    Si la convergencia siguiera siendo lenta, entonces se aplicaría el método de Newton a la segunda derivada para ver si la raíz es doble o a derivadas sucesivas si la multiplicidad es mayor.

    Si calculamos una raíz $\alpha$ de $p'(x)$ (o de derivadas sucesivas de p) y observamos que $$\left| {p\left( \alpha \right)} \right| \gg \left| {p'\left( \alpha \right)} \right|$$ entonces debemos concluir que $\alpha$ no es raíz de $p$, lo que ocurre es que $p$ posee dos o más raíces muy próximas.En el caso de que haya raíces próximas entonces la convergencia será lenta y, en general, no podremos obtener una precisión alta en la solución.

  2. Si el polinomio tiene coeficientes reales y $\alpha=a+bi$ es una raiz compleja entonces su conjugada $\overline \alpha = a - bi$ también es raíz del polinomio . Además, si $\alpha$ tuviera multiplicidad $m$, entonces $\overline \alpha$ tendría la misma multiplicidad.

En los siguientes ejemplos veremos cómo aplicar el método de Maehly para encontrar todas las raíces de un polinomio utilizando el fichero itraiz.m que realiza una iteración de este método. Los parámetros de los que depende son los coeficientes del polinomio cuya raíz se quiere calcular, los coeficiente del polinomio derivada, el vector con las raíces ya calculadas y el punto a partir del cual se va a iterar.

Calcular las ráices del polinomio \(p(x)= 8x^7 + 26x^6 - 54x^5 - 27x^4 + 128x^3 - 576x^2 + 864x - 432 = 0\).


p=[8 26 54 27 -128 -576 -864 -432]
dp=polyder(p)
v=[],x=i
format long
x=itraiz(p,dp,v,x)
%Se hacen iteraciones hasta encontrar las raíces
x=
-1.056847723228969 + 0.262522264027478i
polyval(p,x)


v=[x;conj(x)]
x=i;x=itraiz (p,dp,v,x)
x=
-0.059269229873907 + 2.202319797999819i
polyval(p,x)
v=[x;conj(x)]
x=i;x=itraiz(p,dp,v,x)
x=
2.063556841734012
polyval(p,x)

Se obtienen así las 7 raíces

v
-1.056847723228969 + 0.262522264027478i
-1.056847723228969 - 0.262522264027478i
-1.540661467764130 + 1.474052474547216i
-1.540661467764130 - 1.474052474547216i
-0.059269229873907 + 2.202319797999819i
-0.059269229873907 - 2.202319797999819i
2.063556841734012 + 0.000000000000000i
Calcular todas las raíces del polinomio $p\left( x \right) = 25{x^8} + 85{x^7} + 181{x^6} + 238{x^5} + 226{x^4} + 142{x^3} + 61{x^2} + 13x + 1$.

Calcular todas las raíces del polinomio $p\left( x \right) = 3{x^7} + 5{x^6} + 21{x^5} + 35{x^4} + 48{x^3} + 80{x^2} + 36x + 60$.

Autoevaluación

**** Incluir preguntas del tema ****

Actividad de autoevaluación

Ejercicios

Resolver \(f(x) = x^2 - e^{-x} = 0\), en el intervalo \([0,1]\) usando el método del punto fijo considerando el problema \(x = g(x)\) mediante la elección de \(g(x)\) siguientes:

  • \(g(x) = e^{-x^2}\)
  • \(g(x) = \sqrt{\ln(x)}\)

Empezando la iteración con \(x_0 = 0.5\). Realizar 100 iteraciones y analizar los resultados. Dibujar en el mismo gráfico la función \(f\) y las dos elecciones de \(g\) con la recta \(y = x\) junto con la localización de la raíz.

Resuelve las siguientes ecuaciones por el Método de Newton-Bisección con un error absoluto \( arepsilon_a = 10^{-15}\):

  • \(\cos(x) - x = 0\)
  • \(8x^2 - \cos(x) - 2 = 0\)
  • \(3e^x - x^2 = 0\)
  • \(e^{-x^2} + 2\cos(x) - 6 = 0\) en \([1, 2]\).

Supongamos que la oscilación de una estructura, dotada de un sistema de amortiguación, ante un movimiento oscilatorio, viene dada por \(y(t) = e^{-2t}(10\cos(2t))\). ¿En qué instante \(t\) la posición de la estructura es \(y(t) = 4\)?

Dada la ecuación \(3x^3 + 2x = 0\), aplicar el método de Newton comenzando las iteraciones en el punto \(x_0 = 1\). Explicar los resultados. Elegir un punto más conveniente para iniciar las iteraciones y encontrar una raíz real.

Consideremos la función \(f(x) = \sin(0.2x) - 16 + 1.75x\). Esta función tiene un cero en \([1, 2]\). Inicia el método de Newton y observa que diverge. Comprueba que el método de bisección aproxima la solución.

Utiliza el método de la secante para resolver \(f(x) = 100x^5 - 3995x^4 + 79700x^3 - 794004x^2 + 3160075x - 0\) en el intervalo \([17, 22.2]\) con un error absoluto y relativo de \(10^{-7}\). Realiza los cálculos considerando como puntos iniciales \(x_0 = 17\) y \(x_1 = 22.2\).

La función \(erf(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} dt\) está definida para \(x \geq 0\). Determinar el valor de \(x\) tal que \(erf(x) = 0.5\). Nota: Utilizar la función de Matlab \(erf\) para evaluar las integrales.

Dada la matriz \(A\), determinar un valor de \(x\) tal que \(-2\) sea un valor propio de \(A\). Resolver utilizando el método de la secante.

La velocidad \(v\) de un paracaidista que cae está dada por \(v = \frac{mg}{c}(1 - e^{-ct/m})\). Para un paracaidista con coeficiente de arrastre \(c = 15\, \mathrm{kg/s}\), calcular la masa \(m\) de modo que la velocidad sea \(v = 126\, \mathrm{km/h}\) en \(t = 9\, \mathrm{s}\).

Se puede calcular la raíz n-ésima de un número \(a\) resolviendo la ecuación \(x^n - a = 0\). Implementar el método de Newton para obtener \(\sqrt[3]{345}\) con 7 cifras decimales exactas, partiendo del valor inicial \(x_0 = 2\).

Calcula los mínimos y máximos de la función \(f(x) = e^{-x^2}(2x^2 - 3x) - 2\) en el intervalo \([-2, 2]\), así como los puntos de inflexión.

Implementa el método de la bisección para resolver la ecuación no lineal \(f(x) = \frac{1}{\pi} \int_0^x \frac{\sin(t)}{1+t^2} dt - \frac{3}{4} = 0\) con un error absoluto \( arepsilon_a = 10^{-10}\).

Dada la ecuación \(5x = e^x - 5\):

  • Justifica de forma matemática cuántos ceros tiene la ecuación.
  • Escribe cómo se obtendrían las dos primeras iteraciones del método de la secante y del método de Newton para encontrar un cero.
  • ¿Se podría justificar la convergencia del método del punto fijo en algún intervalo? Justifica la respuesta.

Dada la ecuación \(2e^x - x^2 - 1 = 0\):

  • Demuestra que tiene una única solución en el intervalo \([-2, 0]\).
  • Encuentra una aproximación de la solución con un error absoluto \( arepsilon_a = 10^{-12}\) utilizando el método de Newton-Bisección.

Se considera la ecuación \(\det(A(x)) = 0\), donde \(x\) es un número real y \(A(x)\) es la matriz:

\[ A(x) = \begin{bmatrix} \cos(x) & 1 & 2 & 3 \\ 0 & 1 & 0 & 1 \\ x & 2 & 3 & 4 \\ \sin(x) & x & 1 & \cos(x) \end{bmatrix} \]

Encuentra una raíz de \(f(x) = \det(A(x)) = 0\) en el intervalo \([0, 1]\).

Utiliza el método de Maehly para hallar todas las soluciones de las siguientes ecuaciones:

  • \(x^6 + 3x^5 - 28x^4 + 8x^3 - 8x^2 + 4 = 0\)
  • \(x^7 + 26x^6 - 54x^5 - 27x^4 + 128x^3 - 576x^2 + 864x - 432 = 0\)
  • \(x^4 - 12x^3 + 47x^2 - 60x + 24 = 0\)

¿Cuántas raíces tiene cada ecuación? Comprueba los resultados con el comando roots de Matlab.

RESUMEN

El cápítulo se centra en la resolución aproximada de ecuaciones escalares no lineales. Se analizan métodos iterativos para encontrar soluciones de ecuaciones de la forma $f(x)=0$, destacando técnicas como el método de bisección, el método de Newton-Raphson y el método de la secante.

El capítulo aborda la convergencia de estos métodos, la velocidad con la que se aproximan a la solución y las condiciones necesarias para su aplicación efectiva. Además, se discuten estrategias para la localización y separación de raíces, enfatizando la importancia de una elección adecuada del intervalo inicial y de las aproximaciones iniciales para garantizar la eficiencia y precisión en la obtención de soluciones numéricas.

Los aspectos clave en el estudio de los métodos numéricos son:

  1. Introducción Se plantea la necesidad de resolver ecuaciones no lineales de la forma $f(x)=0$ que, en muchos casos, no admiten soluciones analíticas exactas, lo que motiva el uso de métodos numéricos para obtener soluciones aproximadas..
  2. Generalidades Se definen conceptos fundamentales como raíces o ceros de una función, multiplicidad de una raíz y las fases del proceso de resolución: localización, separación y aproximación de raíces.
  1. Método de la bisecciónSe presenta este método como una técnica que, partiendo de un intervalo donde la función cambia de signo, divide repetidamente el intervalo en mitades para aproximar la raíz con una precisión deseada.
  2. Método de Newton-Raphson Se introduce este método iterativo que utiliza la derivada de la función para aproximar la raíz, ofreciendo una convergencia rápida bajo condiciones adecuadas, pero que requiere una buena estimación inicial y que la derivada no sea nula en las proximidades de la raíz.
  1. Método de la secante Se describe este método que, similar al de Newton-Raphson, no requiere el cálculo explícito de la derivada, sino que aproxima la pendiente mediante diferencias finitas, siendo útil cuando la derivada es difícil de calcular.
  2. Convergencia de los métodos Se analizan las condiciones bajo las cuales los métodos iterativos convergen a una solución, la velocidad de convergencia y cómo la elección de las aproximaciones iniciales influye en la eficiencia del proceso.


Capítulo

Aproximación de funciones por polinomios

Introduccion

A menudo se dispone de una tabla de datos obtenida por muestreo o experimentación y se supone que los datos corresponden a los valores de una función $f$ desconocida o, aunque sea conocida, se precisa cambiarla por una más sencilla de calcular. Un caso particular de ajuste de curvas consiste en construir un polinomio $P(x)$ que pase por los puntos de esta tabla de valores.

Imaginemos por ejemplo que se tiene una tabla que relaciona la viscosidad dinámica del agua con la temperatura

T ºC 0 5 10 20
$\mu_o$ 1.787 1.519 1.307 1.002

¿Cómo estimar la viscosidad a una temperatura de 7.5º? Una opción es encontrar un polinomio que pase por los puntos de la tabla y estirmar después el valor de 7.5 con él.

En este capítulo mostraremos dos técnicas para aproximar la función por un polinomio: la interpolación y la aproximación por mínimos cuadrados. Dentro de la interpolación veremos la interpolación de Lagrange y la de Hermite.

Comparación interpolación vs. regresión

Interpolación de Lagrange

El método de interpolación de Lagrange es una técnica que permite encontrar un polinomio que pasa exactamente por un conjunto de puntos dados.

DEFINICIÓN. Dados $n+1$ puntos distintos ${x_0,x_1,...,x_n}$ en el intervalo $[a,b]$, el polinomio de Lagrange Joseph Louis Lagrange (1736-1813) fue uno de los más grandes matemáticos de su tiempo. Nació en Italia pero se nacionalizó Francés. Hizo grandes contribuciones en todos los campos de la matemática y también en mecánica. Su obra principal es la “Mécanique analytique”(1788). En esta obra de cuatro volúmenes, se ofrece el tratamiento más completo de la mecánica clásica desde Newton y sirvió de base para el desarrollo de la física matemática en el siglo XIX. de una función $f$ definida en $[a,b]$ es el polinomio de grado menor o igual a $n$ que cumple $p(x_i)=f(x_i)$ para cada i entre 0 y n. A los puntos ${x_0,x_1,...,x_n}$ se les llama nodos de interpolación.
TEOREMA. El polinomio de interpolación de Lagrange posee una única solución y viene dado mediante la fórmula: $$p\left( x \right) = \sum\limits_{i = 0}^n {f\left( {{x_i}} \right){l_i}\left( x \right)} $$ donde $\left\{ {{l_i}} \right\}_{i = 0}^n$ son los polinomios de base de Lagrange asociados a los nodos $\left\{ {{x_i}} \right\}_{i = 0}^n$ que vienen dados por las expresiones: $${l_i}\left( x \right) = \prod_{ j = 0 \,\,\,\, j \ne i \,\,\,\,}^n {{{x - {x_j}} \over {{x_i} - {x_j}}}} $$

El video siguiente muestra un ejemplo práctico con tres nodos calculando los polinomios base de Lagrange.

Método de Lagrange
Calcular los polinomios de base de Lagrange asociados a los nodos $x_0=-1$, $x_1=1$ y $x_2=2$. Calcula el polinomio que interpola en dichos nodos a la función $f$ real en $[-1,2]$ que satisface $f(x_0)=2$, $f(x_1)=1$ y $f(x_2)=1$.
Los datos son: $${x_o} = - 1\,\,\,\,\,\,\,\,\,\,{x_1} = 1\,\,\,\,\,\,\,\,\,\,\,{x_2} = 2$$ $$f\left( {{x_o}} \right) = 2\,\,\,\,\,\,\,\,\,\,f\left( {{x_1}} \right) = 1\,\,\,\,\,\,\,\,\,\,f\left( {{x_2}} \right) = 1$$ Los polinomios base de Lagrange $${l_o}\left( x \right) = {1 \over 6}{x^2} - {1 \over 2}x + {1 \over 3}$$ $${l_1}\left( x \right) = -{1 \over 2}{x^2} + {1 \over 2}x + 1 \,\,\,\,\,{l_2}\left( x \right) = {1 \over 3}{x^2} - {1 \over 3}$$ El polinomio interpolador es: $$p\left( x \right) = f(x_o){l_0}\left( x \right) + f(x_1){l_1}\left( x \right) + f(x_2){l_0}\left( x \right) =$$ $$={1 \over 6}{x^2} - {1 \over 2}x + {4 \over 3}$$

Se puede comprobar que:

$$p\left( { - 1} \right) = 2\,\,\,\,\,\,\,\,\,\,p\left( 1 \right) = 1\,\,\,\,\,\,\,\,\,\,p\left( 2 \right) = 1$$
Polinomio interpolador del ejemplo 4.1

Con ayuda de la siguiente herramienta interactiva calcula el polinomio de Lagrange con 5 nodos introduciendo los datos que consideres. Los puntos deben ser distintos.

Polinomios de Lagrange. Autor: William

Aunque la fórmula del teorema anterior posee un interés teórico, no es la forma eficiente de calcular el polinomio interpolador. Un método sencillo y más rápido es el que se muestra a continuación.

Como se quiere calcular $p(x) = {a_o} + {a_1}x + ... + {a_n}{x^n}$ de forma que $p({x_i}) = f\left( {{x_i}} \right)$, se tendrá que cumplir que: $$\begin{pmatrix} {x_{o}^n}&{x_{o}^{n-1}}&{...}&{x_0}&{1}\\ {{x_{1}^n}}&{{x_{1}^{n-1}}}&{...}&{x_{1}}&{1}\\ {...}&{...}&{...}&{...}&{...}\\ {{x_{n-1}^n}}&{{x_{n-1}^{n-1}}}&{...}&{x_{n-1}}&{1}\\ {{x_{n}^n}}&{{x_{n}^{n-1}}}&{...}&{x_{n}}&{1}\\ \end{pmatrix} \begin{pmatrix} {a_n} \\ {a_{n-1}} \\ {...}\\ {a_1}\\ {a_0} \end{pmatrix} = \begin{pmatrix} {f\left( {{x_o}} \right)}\\ {f\left( {{x_1}} \right)}\\ {...}\\ {f\left( {{x_{n-1}}} \right)}\\ {f\left( {{x_n}} \right)} \end{pmatrix}$$

El método consiste en construir la matriz $A$ de orden $(n+1)$, el vector b de $\mathbb{R}^n$ y resolver el sistema $Aa=b$, donde $a$ es el vector de los coeficientes. La matriz $A$ es invertible La matriz A es de Vandermonde ya que presenta una progresión geométrica en cada fila. Esta matriz es invertible si y solo si todos los $\alpha_i$ son distintos entre sí. y el problema de interpolación de Lagrange tiene una única solución.

Calcular con Matlab/Octave el polinomio interpolador de grado 2 de una función que verifica $f(-1)=2$, $f(1)=1$ y $f(2)=1$.
x=[-1 1 2]';b=[2 1 1]';n=2;
A=ones(n+1,1);t=A;
for k=1:n
 t=t.*x;
 A=[t,A];
end
a=A\b
%Comprobación
polyval(a,x)
Interpolar con Matlab $f(x)=e^x$ en el intervalo $[0,1]$ con polinomios de grado 5, 10, 15. Evaluar la función y el polinomio en 500 puntos del intervalo y ver cuál es el máximo de la diferencia entre la función y el polinomio en esos puntos.
Con los cálculos que se muestran en el siguiente fichero se observa que el máximo de la diferencia entre la función y el polinomio para $n=5$ es $2.654830101089800e-06$, para $n=10$ es $1.794120407794253e-13$ y para $n=15$ es $ 1.110223024625157e-14$. Evidentemente, este valor se puede obtener dado que se conoce la función.

Error en la interpolación

COTA DEL ERROR. Supongamos que la función $f$ es $n+1$ veces derivable en el intervalo $[a,b]$ y que $f^{(n+1}$ es una función continua. Una cota del error de interpolación de Lagrange viene dado por la expresión $$\left| {f\left( x \right) - p\left( x \right)} \right| \le {{\mathop {\max }\limits_{c \in \left[ {a,b} \right]} \left| {{f^{(n + 1}}\left( c \right)} \right|} \over {\left( {n + 1} \right)!}}\left| {\prod_{j = 0}^n {\left( {x - {x_j}} \right)} } \right|$$
Si consideramos una función $f$ en el intervalo $[-1,2]$ cumpliendo $f(-1)=2$, $f(1)=1$ y $f(2)=1$, calcular una cota del error en $[-1,2]$ del polinomio interpolador de Lagrange que aproxima a la función en esos puntos en términos del máximo de $|f^{(n+1}(x)|$ siendo $n$ esel grado del polinomio, en este caso 2.
Si llamamos M a la cota de la derivada tercera de $f$ en el intervalo, se tendrá que $$\left| {f\left( x \right) - p\left( x \right)} \right| \le {M \over {3!}}\left| {\left( {x - {x_o}} \right)\left( {x - {x_1}} \right)\left( {x - {x_2}} \right)} \right|$$ $$\left| {f\left( x \right) - p\left( x \right)} \right| \le {M \over {3!}}\left| {\left( {x + 1} \right)\left( {x - 1} \right)\left( {x - 2} \right)} \right|$$ Para obtener el máximo de $q(x)=(x+1)(x-1)(x-2)$ se calculan las raíces de $q'(x)$, que serán los puntos donde tiene un máximo o mínimo y se evalúa $q$ en esos valores obteniendo la cota como el valor más grande de todos ellos en valor absoluto.
format long
q=poly([-1 1 2]);dq=polyder(q);
r=roots(dq);v=polyval(q,r)
max(abs(v))
%2.112611790922380
La cota del error es entonces: M*2.112611790922380/6.

Nodos de Chebyshev

La elección de nodos que permite minimizar el valor de la siguiente expresión que aparece en la cota de error de interpolación de Lagrange

\[\mathop {\max }\limits_{x \in \left[ {a,b} \right]} \left| {\prod\limits_{j = 0}^n {\left( {x - {x_j}} \right)} } \right|\]

son los puntos de Chebyshev Pafnuti Lvóvich Tchebyschev (1821 - 1894). El más prominente miembro de la escuela de matemáticas de St. Petersburg. Hizo investigaciones en Mecanismos, Teoría de la Aproximación de Funciones, Teoría de los Números, Teoría de Probabilidades y Teoría de Integración. Sin embargo, escribió acerca de muchos otros temas: formas cuadráticas, construcción de mapas, cálculo geométrico de volúmenes, etc..

Estos nodos en [0,1] son las raíces del polinomio del $n+1$-ésimo polinomio de Chebyshev que se define de forma recurrente: $${T_o}\left( x \right) = 1\,\,\,\,\,\,\,\,\,\,\,{T_1}(x) = x$$ $${T_k}(x) = 2x{T_{k - 1}}\left( x \right) - {T_{k - 2}}\left( x \right)\,\,\,\,\,\,\,k \ge 2$$

Se puede demostrar que

$${T_{n + 1}}(x) = \cos \left( {\left( {n + 1} \right)arc\cos \left( x \right)} \right)\,$$

Nodos de Chebyshev. Los nodos de Chebyschev en $[a,b]$ se calculan como $${x_i} = {{a + b} \over 2} + {{b - a} \over 2}\cos \left( {{{\left( {2i + 1} \right)\pi } \over {2n + 2}}} \right)\,\,\,\,\,\,\,0 \le i \le n$$

Considerando el intervalo $[-3,3]$ y que $n=8$ es el grado del polinomio de interpolación, calcular con Matlab/Octave los nodos de Chebyshev (9 nodos) y dibujarlos.
n=8;a=-3;b=3;
%Para obtener los nodos en un vector
x=(a+b)/2+(b-a)/2*cos((2*(0:n)+1)*pi/(2*n+2));
Representacón de 9 nodos de Chebyshev
Considerando estos nodos se cumple: $$\max \left| {\prod\limits_{j = 0}^n {\left( {x - {x_j}} \right)} } \right| = {{{{\left( {b - a} \right)}^{n + 1}}} \over {{2^{2n + 1}}}}$$ por lo que la cota del error de Lagrange será: $$\left| {f\left( x \right) - p\left( x \right)} \right| \le {{\mathop {\max }\limits_{c \in \left[ {a,b} \right]} \left| {{f^{(n + 1}}\left( c \right)} \right|} \over {\left( {n + 1} \right)!}} {{{{\left( {b - a} \right)}^{n + 1}}} \over {{2^{2n + 1}}}} $$
Calcular ...

Interpola la función $f(x)=log(x)$ en los nodos ${0.99, 1, 1.1}$ utilizando polinomios de Lagrange y obtén aproximaciones de $log(x)$ en los puntos $0.95678$ y $1.03597$. Compara los valores obtenidos con los exactos.

Aproxima también $f$ en los mismos puntos mediante el polinomio de grado 2 de Lagrange considerando los nodos de Chebyshev en el intervalo $[0.9,1.1]$.


Interpolación de Hermite

DEFINICIÓN. Sea $f$ una función real definida en el intervalo $[a,b]$, ${x_0,x_1,...,x_k}$ son $k+1$ puntos distintos del intervalo $[a,b]$ y ${\alpha_0,\alpha_1,...,\alpha_k}$ $k+1$ enteros no negativos. El problema de interpolación de Hermite consiste en determinar un polinomio de grado menor o igual que $n=k+\alpha_0+\alpha_1+...+\alpha_k$ satisfaciendo $$p\left( {{x_o}} \right) = f\left( {{x_o}} \right){\mkern 1mu} \,\,\,\,\,p'\left( {{x_o}} \right) = f'\left( {{x_o}} \right)\,\,\,...\,\,\,{p^{({\alpha _o}}}\left( {{x_o}} \right) = \,{f^{({\alpha _o}}}\left( {{x_o}} \right)$$ $$p\left( {{x_1}} \right) = f\left( {{x_1}} \right){\mkern 1mu} \,\,\,\,\,p'\left( {{x_1}} \right) = f'\left( {{x_1}} \right)\,\,\,...\,\,\,{p^{({\alpha _1}}}\left( {{x_1}} \right) = \,{f^{({\alpha _1}}}\left( {{x_1}} \right)$$ $$...$$ $$p\left( {{x_k}} \right) = f\left( {{x_k}} \right){\mkern 1mu} \,\,\,\,\,p'\left( {{x_k}} \right) = f'\left( {{x_k}} \right)\,\,\,...\,\,\,{p^{({\alpha _k}}}\left( {{x_k}} \right) = \,{f^{({\alpha _k}}}\left( {{x_k}} \right)$$ Nota: En el caso particular en que $\alpha_i=1$ para cada $i$, entonces el problema se denomina interpolación de Hermite clásica.
Es importante que en cada nodo $x_i$ que se imponga una condición sobre la derivada de orden $\alpha_i$, se imponga tambien una condición sobre cada derivada inferior a $\alpha_i$ y el valor de la función. En otro caso, los problemas serían de interpolación de Birkhoff que no tienen solución en todos los casos.
TEOREMA. El problema de interpolación de Hermite posee una única solución.

En el siguiente video se muestra un ejemplo de interpolación de Hermite.

Ejemplo de interpolación de Hermite con dos nodos

Con la siguiente herramienta interactiva puedes ver cómo varía el polinomio según se modifiquen los cuatro nodos y los valores de las derivadas en cada uno de ellos.

Método de Hermite

Error de interpolación

COTA DEL ERROR. Supongamos que la función $f$ es $n+1$ veces derivable en el intervalo $[a,b]$ y que $f^{n+1}$ derivable en el intervalo $[a,b]$ y que $f^{(n+1}$ es una función continua, entonces una cota del error de interpolación de Hermite viene dada por la expresión: $$\left| {f\left( x \right) - p\left( x \right)} \right| \le {{\mathop {\max }\limits_{c \in \left[ {a,b} \right]} \left| {{f^{(n + 1}}\left( c \right)} \right|} \over {\left( {n + 1} \right)!}}\left| {\prod\limits_{j = 0}^{} {{{\left( {x - {x_j}} \right)}^{{\alpha _j} + 1}}} } \right|$$

Calcular ...
Calcular ...
Calcular ...

Mínimos cuadrados

En el caso de los métodos de interpolación, no siempre se consigue una mejor aproximación aumentado el número de puntos de interpolación.

Función de Runge

Además, cuando se considera un número grande de nodos la manipulación y evaluación el cálculo resulta muy costoso computacionalmente y puede llevar también problemas de redondeo importantes.

Con el siguiente método veremos que en el caso de que se tenga mucha información sobre la función en ciertos puntos, en lugar de aumentar de forma considerablemente el grado del polinomio en los métodos de interpolación, es más ventajoso utilizar el método de mínimos cuadrados.

La idea consiste en encontar un polinomio de grado $k$ a partir de un conjunto de $m$ puntos de forma que el polinomio tenga grado inferior al que se podría obtener pasando por todos ellos y se minimice el error que existe entre el valor del polinomio y las ordenadas de los puntos.

En el siguiente video y con la siguienta herramienta interactiva se puede ver cómo hacer el ajuste a una recta.

Ajuste a una recta por mínimos cuadrados

Ajuste a una recta por mínimos cuadrados

Se escribe a continuación la formulación del método de mínimos cuadrados.

DEFINICIÓN. Dados $n+1$ puntos distintos ${x_0,x_1,...,x_n}$ en el intervalo $[a,b]$, $n+1$ números reales positivos $\left\{ {{\omega _0},{\omega _1},...,{\omega _n}} \right\}$, $f$ una función definida en $[a,b]$ y un entero $1 \le k \le n$, el problema de mínimos cuadrados consiste en resolver $$\mathop {{(P) \,\,\, \, \rm{minimizar}}}\limits_{p \in {P_k}} \sum\limits_{j = 0}^n {{\omega _j}{{\left( {p\left( {{x_j}} \right) - f\left( {{x_j}} \right)} \right)}^2}} $$ donde $P_k$ denota el espacio de los polinomios de grado menor o igual $k$.
La razón de incluir los pesos $\omega_i$ se justifica, por ejemplo, para ajustar el polinomio a los valores más precisos de $f$ o para obtener más precisión en unas zonas que en otras de un intervalo.

Formulación algebraica del problema

El problema que tratamos de resolver es encontrar el polinomio $p$ de grado menor o igual a $k$ que minimiza la siguiente expresión $$\sum\limits_{j = 0}^n {{\omega _j}} {\left( {p\left( {{x_j}} \right) - f\left( {{x_j}} \right)} \right)^2}$$

Para ver cómo se puede formular algebraicamente este problema, consideremos un polinomio $p$ de grado $k$

$$p\left( x \right) = {a_o} + {a_1}x + {a_2}{x^2} + .. + {a_k}{x^k}$$

y las siguientes matrices

$$A = \begin{pmatrix} {\sqrt {{\omega _0}} \,x_0^k} & {\sqrt {{\omega _0}} \,x_0^{k - 1}} & {...} & {\sqrt {{\omega _0}} \,{x_0}}& {\sqrt {{\omega _0}} }\\ {\sqrt {{\omega _1}} \,x_1^k} & {\sqrt {{\omega _1}} \,x_1^{k - 1}} & {...} & {\sqrt {{\omega _1}} \,{x_1}}& {\sqrt {{\omega _1}} } \\ \vdots & \vdots & {...} & \vdots & \vdots \\ {\sqrt {{\omega _n}} \,x_n^k} & {\sqrt {{\omega _n}} \,x_n^{k - 1}} & {...} & {\sqrt {{\omega _n}} \,{x_n}}& {\sqrt {{\omega _n}} } \\ \end{pmatrix} $$ $$a = \begin{pmatrix} {{a_k}} \\ {{a_{k-1}}} \\ {{a_{k-2}}} \\ \vdots \\ {{a_0}} \\ \end{pmatrix} \,\,\,\,\,\,\,b = \begin{pmatrix} {\sqrt {{\omega _o}} \,f\left( {{x_o}} \right)} \\ {\sqrt {{\omega _1}} \,f\left( {{x_1}} \right)} \\ \vdots \cr {\sqrt {{\omega _n}} \,f\left( {{x_n}} \right)} \\ \end{pmatrix}$$ Se cumple que $$Aa - b = \begin{pmatrix} {\sqrt {{\omega _o}} \left( {p\left( {{x_o}} \right) - f\left( {{x_o}} \right)} \right)} \\ {\sqrt {{\omega _1}} \left( {p\left( {{x_1}} \right) - f\left( {{x_1}} \right)} \right)} \\ \vdots \cr {\sqrt {{\omega _n}} \left( {p\left( {{x_n}} \right) - f\left( {{x_n}} \right)} \right)} \\ \end{pmatrix}$$

Teniendo en cuenta la norma euclidea $${\left\| {Aa - b} \right\|^2} = \sum\limits_{j = 0}^n {{\omega _j}} {\left( {p\left( {{x_j}} \right) - f\left( {{x_j}} \right)} \right)^2}$$ los coeficientes del polinomio $p$ que se busca serían la solución del problema: $$\mathop { (P2) \,\,\,\,{\rm{minimizar}}}\limits_{x \in {{\mathbb R}^{k + 1}}} {\left\| {Ax - b} \right\|^2}$$

Formular algebraicamente el problema de ajustar un polinomio de grado 2 de la forma $y=a_o+a_1x+a_2x^2$ a un conjunto de observaciones: $(x_0,y_0)$, ($x_1,y_1)$,...,$(x_n,y_n)$ con $n \gt 2$ en el sentido de mínimos cuadrados.
El problema de mínimos cuadrados es encontrar $a_o$, $a_1$, $a_2$ de forma que sea mínima la siguiente expresión $$\sum\limits_{i = 0}^n {{{\left( {{y_i} - \left( {{a_o} + {a_1}{x_i}+{a_2}{x_i^2}} \right)} \right)}^2}} $$ Se considera $$A = \begin{pmatrix} {{x_0^2}} &{{x_0}} & 1 \\ {{x_1^2}} &{{x_1}} & 1 \\ {{...}} & {{...}}& {{...}}\\ {{x_n^2}}&{{x_n}} & 1 \\ \end{pmatrix} \,\,\, x = \begin{pmatrix} {{a_2}} \\ {{a_1}} \\ {{a_0}} \\ \end{pmatrix} \,\,\,\, b= \begin{pmatrix} {{y_0}} \\ {{y_1}} \\ {{...}} \\ {{y_n}} \\ \end{pmatrix}$$ El problema se reduce a buscae el vector $x$ de ${\mathbb R}^3$ solución del problema $$\min \left\| r \right\| = \min \left\| {Ax - b} \right\|$$ La siguiente figura muestra gráficamente un ejemplo con cinco puntos.
Ajuste mínimos cuadrados

Imaginemos un muelle colgado verticalmente dentro de un cilindro abierto por los extremos a altura 0, por encima de la apertura superior. La longitud del muelle es desconocida porque su extremo inferior está centro del cilindro y es inalcanzable.

$h$ 6 7 10
$F$ 3 8 12

Se desea determinar L, y de paso la constante del muelle usando la ley de Hooke: $F=k(h-L)=kh-kL$ donde $F$ denota la fuerza aplicada al muelle y $h$ es la distancia desde el extremo superior del muelle. Se disponen de los siguientes datos

Llamamos $a_1=k$ y $a_2=-kL$. El sistema resultante de escribir la ley de Hooke es $$ 6{a_1} + {a_2} = 3 $$ $$ 7{a_1} + {a_2} = 8 $$ $$ 10{a_1} + {a_2} = 12 $$ En forma matricial, $Ax=b$ siendo $$ A= \begin{pmatrix} 6& 1 \\ 7& 1 \\ 10& 1 \\ \end{pmatrix} \,\,\,\,\, x= \begin{pmatrix} a_1 \\ a_2\\ \end{pmatrix}\,\,\,\,\, b= \begin{pmatrix} 3 \\ 8\\ 12\\ \end{pmatrix}$$

El problema de mínimos cuadrados consiste en encontrar el vector $x$ de ${\mathbb R}^2$ de forma que sea mínima $\left\| {Ax - b} \right\|$.

Resolución del problema mediante la factorización QR

Veamos que para resolver el problema $$\mathop {{\rm{minimizar}}}\limits_{x \in {^{k + 1}}} {\rm{ }}{\left\| {Ax - b} \right\|^2}$$ en general es conveniente utilizar la descomposición QR de la matriz $A$. El método que se propone es el siguiente

  1. Realizamos la factorización $QR$ de $A$ donde $Q$ es ortogonal, es decir, ${Q^T}Q = Q{Q^T} = I$ y tiene dimensiones $(n+1)\text{x}(n+1)$ y $R$ es una matriz triangular superior $(n+1)\text{x}(k+1)$
  2. Consideramos en $Q$ y $R$ las submatrices $Y$ y ${\widehat R}$:
    • $Q=[Y Z]$ con $Y$ matriz $(n+1)\text{x}(k+1)$ y $Z$ matriz $(n+1)\text{x}(n-k)$
    • $R = \begin{pmatrix} {\widehat R} \\ 0 \\ \end{pmatrix}$ siendo ${\widehat R}$ es una matriz triangular superior$(k+1)\text{x}(k+1)$ y O es una matriz formada por ceros de orden $(n-k)\text{x} (k+1)$
  3. Los coeficientes del polinomio solución
    $$a = {\left( {{a_0},{a_1},...,{a_k}} \right)^T}$$ se obtienen resolviendo el sistema de ecuaciones lineales $$\widehat Rx = {Y^T}b$$ y el residuo es $${\mathop{\rm Re}\nolimits} s = \left\| {{Z^T}b} \right\|$$

Veamos la justificación del punto 3. Como Q es ortogonal se cumple

$${\left\| {Qv} \right\|^2} = {\left( {Qv} \right)^T}\left( {Qv} \right) = {v^T}\left( {{Q^T}Q} \right)v = {v^T}Iv = {v^T}v = {\left\| v \right\|^2}$$

Por lo tanto, $${\left\| {Ax - b} \right\|^2} = {\left\| {QRx - b} \right\|^2} = {\left\| {Q\left( {Rx - {Q^T}b} \right)} \right\|^2} = $$ $${\left\| {Rx - {Q^T}b} \right\|^2} = {\left\| {\,\left( {_O^{\widehat R}} \right)x - \left( {_{{Z^T}}^{{Y^T}}} \right)b\,} \right\|^2} = {\left\| {\,\left( {_{ - {Z^T}b}^{\widehat Rx - {Y^T}b}} \right)\,} \right\|^2} = $$ $${\left\| {\,\widehat Rx - {Y^T}b\,} \right\|^2} + {\left\| {\,{Z^T}b\,} \right\|^2}$$

El mínimo valor del problema se obtiene para el valor de $x$ que hace cero el término $${\left\| {\,\widehat Rx - {Y^T}b\,} \right\|^2}$$

De la expresión anterior se deduce que, equivalentemente, la solución del problema $(P_2)$ se obtiene calculando el valor $x$ solución del sistema $${\widehat Rx = {Y^T}b}$$

Si $k$ es el grado del polinomio buscado y $QR$ es la factorización de $A$, la matriz $\widehat R$ es la submatriz de $R$ con las primeras $k+1$ filas y la matriz $Y$ es la submatriz de $Q$ considerando las primeras $k+1$ columnas.
Hay que hacer notar que la matriz ${\widehat R}$ es inversible debido a que los nodos $\left\{ {{x_j}} \right\}_{j = 0}^n$ son todos distintos. Por lo tanto, la solución del problema de mínimos cuadrados (Q) existe y es única.
Considerando el ejemplo anterior de la ley de Hooke, se seguirá el método visto para considerar la recta que resuelve el problema de mínimos cuadrados con los siguientes datos
$h$ 6 7 10
$F$ 3 8 12
En este caso, $$ A= \begin{pmatrix} 6& 1 \\ 7& 1 \\ 10& 1 \\ \end{pmatrix} \,\,\,\,\, x= \begin{pmatrix} a_1 \\ a_2\\ \end{pmatrix}\,\,\,\,\, b= \begin{pmatrix} 3 \\ 8\\ 12\\ \end{pmatrix}$$ La descomposición $QR$ de la matriz $A$ se obtiene con Matlab de la forma
[Q,R]=qr([6 1;7 1;10 1])
$$ Q= \begin{pmatrix} -0.4411 & -0.6777 & -0.5883\\ -0.5147 & -0.3460 & 0.7845\\ -0.7352 & 0.6488 & -0.1961\\ \end{pmatrix} $$ $$ R= \begin{pmatrix} -13.6015 & -1.6910\\ 0 & -0.3749\\ 0 & 0 \\ \end{pmatrix}$$

Como $k$ es 1 al ser una recta, las matrices $Y$, $\widehat R$ son

$$ Y= \begin{pmatrix} -0.4411 & -0.6777 \\ -0.5147 & -0.3460 \\ -0.7352 & 0.6488 \\ \end{pmatrix} \,\,\,\,\, \widehat R= \begin{pmatrix} -13.6015 & -1.6910\\ 0 & -0.3749\\ \end{pmatrix}$$

y el sistema a resolver es entonces, $\widehat Rx=Y^Tb$.

Es decir,

$$ \begin{pmatrix} -13.6015 & -1.6910\\ 0 & -0.3749\\ \end{pmatrix} \begin{pmatrix} a_1\\ a_0\\ \end{pmatrix} $$ $$ \,\,\,\,\, = \begin{pmatrix} -0.4411 & -0.5147 & -0.7352 \\ -0.6777 & -0.3460 & 0.6488 \\ \end{pmatrix} \begin{pmatrix} 3\\ 8\\ 12\\ \end{pmatrix}$$ Operando, $$ \begin{pmatrix} -13.6015 & -1.6910\\ 0 & -0.3749\\ \end{pmatrix} \begin{pmatrix} a_1\\ a_0\\ \end{pmatrix}=\begin{pmatrix} -14.2632\\ 2.9847\\ \end{pmatrix} $$ La solución de este sistema es $a_1=2.0385$ y $a_o=-7.9615$
Calcular ....

Autoevaluación

**** Incluir preguntas del tema ****

Actividad de autoevaluación

Ejercicios

Calcular los polinomios de base de Lagrange asociados a los nodos \(x_0, x_1, x_2\). Calcula el polinomio que interpola en dichos nodos a la función \(f\) definida en \([-1,2]\) y que satisface:
  • \(f(x_0) = 2\)
  • \(f(x_1) = 1\)
  • \(f(x_2) = 1\)
Calcular con MATLAB el polinomio interpolador de grado 2 de una función que verifica:
  • \(f(-1) = 2\)
  • \(f(1) = 1\)
  • \(f(2) = 1\)
Interpolar con MATLAB la función \(f(x) = e^x\) en el intervalo \([0,1]\) con polinomios de grado 5, 10, y 15. Evaluar la función y el polinomio en 500 puntos del intervalo y encontrar el máximo de la diferencia entre la función y el polinomio en esos puntos.
Calcular y representar 9 nodos de Chebyshev en el intervalo \([-3,3]\).
Interpola la función \(\log(x)\) en los nodos \({0.9, 1, 1.1}\) utilizando el polinomio interpolador de Lagrange para aproximar en los puntos \(0.956678\) y \(1.03597\). Luego, realiza la aproximación con los nodos de Chebyshev en el intervalo \([0.9, 1.1]\).
Obtén a mano el polinomio interpolador de Hermite para los siguientes valores:
  • \(f(1) = 2\)
  • \(f(0) = 1\)
  • \(f'(1) = 3\)
  • \(f'(0) = 1\)
Tomando como nodos \(x_0\) y \(x_1\), obtén el polinomio de interpolación de Hermite \(p(x)\) que interpola la función \(f(x) = \sin(x)\) en el intervalo \([0,1]\). Calcula también una cota del error de interpolación.
Tomando como nodos \(x_0, x_1, x_2\), obtén el polinomio de interpolación de Hermite que interpola la función \(f(x) = e^x\) en los puntos \(x = 0, 1, \pi/2\).
Consideremos un muelle colgado verticalmente dentro de un cilindro abierto por los extremos a altura 0. Se desea determinar la longitud del muelle \(L\) y la constante del muelle \(K\) usando la ley de Hooke \(F = k(h - L)\), a partir de los siguientes datos:
h 6 7 10
F 3 8 12
Dada la función de Runge \(f(x) = \frac{1}{1+x^2}\), halla los polinomios interpoladores de Lagrange de grado 10 y 20 respectivamente en puntos igualmente espaciados en \([-5, 5]\). Representa gráficamente la función y los polinomios interpoladores.
Dada la función de Runge \(f(x) = \frac{1}{1+x^2}\), halla el polinomio de grado menor o igual a 20 que mejor aproxima la función en el sentido de mínimos cuadrados en \([-5, 5]\), tomando como datos los valores de \(f(x)\) en nodos igualmente espaciados.

Repite el ejercicio con la función \(f(x) = e^{-x^2}\).

Ajustar una línea recta a los valores \(x\) e \(y\) en el sentido de mínimos cuadrados, usando la siguiente tabla:
x 1 2 3 4 5 6 7
y 0.5 2.5 2 4 3.5 6 5.5

Determina el polinomio interpolador que se ajusta a estos valores y grafica las soluciones junto con el conjunto \((x, y)\) en la misma figura.

Dada la función \(f(x) = \log(1+x)\), calcula el polinomio de interpolación de Hermite \(p(x)\) que satisface:
  • \(p(x_i) = f(x_i)\)
  • \(p'(x_i) = f'(x_i)\)
  • \(x_i \in \{0, 0.5, 1\}\)

Da una cota del error de interpolación.

La siguiente tabla proporciona el calor específico de la plata (en grados Kelvin) a diversas temperaturas:
T (K) 8 10 12 14 16 18
C(T) 0.0236 0.0475 0.083 0.1736 0.202 0.25

Halla el polinomio interpolador y da un valor aproximado del calor específico a 15 K. Representa gráficamente los datos y el polinomio interpolador.

Dada la función \(f(x) = \sin(x)\), calcula el polinomio de interpolación de Hermite \(p(x)\) de grado 10 que resuelve los siguientes problemas:

  1. \(p(x_i) = f(x_i)\), donde \(x_i\) son puntos igualmente espaciados en el intervalo \([0, \pi]\).
  2. \(p(x_i) = f(x_i)\), donde \(x_i\) son los nodos de Chebyshev en el intervalo \([0, \pi]\).

Representa gráficamente ambos polinomios junto con la función \(f(x)\). Halla todas las raíces de los polinomios.

RESUMEN

Este capítulo, se centra en la aproximación de funciones de una variable mediante polinomios, presentando dos técnicas principales: la interpolación y la aproximación por mínimos cuadrados. En la interpolación, se destacan los métodos de Lagrange y Hermite, que permiten construir polinomios que pasan exactamente por un conjunto de puntos dados. Por otro lado, la aproximación por mínimos cuadrados se utiliza cuando se dispone de una gran cantidad de datos y se busca un polinomio que minimice el error global, sin necesariamente pasar por todos los puntos.

El capítulo también aborda la elección óptima de nodos, como los nodos de Chebyshev, para mejorar la precisión de la interpolación y evitar problemas como el fenómeno de Runge. Además, se discuten las limitaciones de los métodos de interpolación en casos de funciones con comportamientos complejos,

Los aspectos clave en el estudio de los métodos numéricos son:

  1. Introducción Se presenta la necesidad de aproximar funciones desconocidas o complejas mediante polinomios, utilizando técnicas como la interpolación y la aproximación por mínimos cuadrados.
  2. Interpolación de Lagrange Se introduce el polinomio de Lagrange como una herramienta para construir un polinomio de grado n que pasa por n+1 puntos dados, garantizando una única solución y proporcionando una fórmula explícita para su cálculo.
  1. Método de mínimos cuadrados Se presenta la técnica de aproximación por mínimos cuadrados, que permite ajustar un polinomio de grado menor que el número de puntos disponibles, minimizando el error global y proporcionando una mejor aproximación en presencia de datos con ruido o inconsistencias.
  2. Errores en la interpolación. Se analizan los errores asociados a la interpolación polinómica, incluyendo el fenómeno de Runge, que ilustra cómo aumentar el número de nodos no siempre mejora la aproximación y puede, en algunos casos, empeorarla
  1. Nodos de Chebyshev.Se discute la elección óptima de nodos para la interpolación, destacando que los nodos de Chebyshev minimizan el error de interpolación y mejoran la estabilidad del polinomio interpolador..
  2. Aplicaciones prácticas. Se proporcionan ejemplos y ejercicios que ilustran la aplicación de las técnicas de interpolación y aproximación por mínimos cuadrados en problemas reales, como la estimación de la viscosidad del agua a una temperatura específica.


Capítulo

Integración numérica

Introduccion

Los métodos numéricos de integración sirven para aproximar el valor de una integral definida $\int\limits_a^b {f\left( x \right)dx} $ con una precisión dada cuando no es posible resolverla de forma exacta o analítica. Su interés viene motivado por distintas razones:

  1. La posibilidad de aplicar la Regla de Barrow se restringe a una pequeña parte de funciones elementales que tienen primitivas también elementales. Muchas funciones, como por ejemplo $e^{x^2}$ que es continua, no tienen primitiva elemental.
  2. Aunque existiera un procedimiento para encontrar la primitiva, obtenerla puede resultar en muchos casos muy complicado. Pensemos por ejemplo en las funciones racionales o en aquellas que requieren de cambios de variable más o menos ingeniosos.
  3. Por otro lado, en muchas aplicaciones sólo se tiene una tabla de valores de la función $f$ o la posibilidad de obtener su valor en un número finito de puntos.

Estas razones obligan a encontrar métodos alternativos para calcular el valor de una integral definida en un intervalo de forma aproximada. Por razones históricas, el cálculo aproximado de integrales se denomina cuadratura dejando la denominación de integración para la resolución de ecuaciones diferenciales.

Veamos un ejemplo de aplicación. La gestión sostenible del agua (Objetivo de Desarrollo sostenible, número 6) requiere monitorizar el caudal de los ríos para garantizar su uso sostenible. Sin embargo, el caudal no siempre se mide directamente en todo el curso del río, sino que se calcula a partir de datos como la velocidad del agua en diferentes puntos y las características de la sección transversal del río.

Para calcular el volumen de agua que pasa por una sección transversal del río en un día, se debe integrar la velocidad del agua a lo largo de la profundidad del río. La fórmula para ello es

$$Q = \int\limits_a^b {v\left( x \right)dx} $$ donde $Q$ es el caudal total, $v(x)$ es la velocidad del agua en el punto $x$ de la seccion transversal y $a$ y $b$ son los límites de la sección transversal. Se tiene los siguientes datos
Profundidad (m) Velocidad (m/s)
0 0.0
1 1.2
2 2.1
3 2.4
4 2.0
Profundidad (m) Velocidad (m/s)
5 1.5
6 0.0

El siguiente gráfico muestra la velocidad del agua en función de la profundidad, con el área bajo la curva que representa el volumen de agua que fluye por unidad de tiempo.

Velocidad del agua en función de la profundidad

Se verá que la fórmula de los trapecios para el cálculo del caudal permitirá obtener un valor aproximado:

\[ Q \approx \frac{h}{2} \left[v(x_0) + 2 \sum_{i=1}^{n-1} v(x_i) + v(x_n)\right] \]

donde:

  • \(Q\): Caudal, volumen de agua que fluye
  • \(h\): Ancho del intervalo entre los puntos de profundidad (\(h = x_{i+1} - x_i\)).
  • \(v(x_i)\): Velocidad del agua en el punto \(x_i\) de la profundidad.
  • \(x_0\) y \(x_n\): Extremos de la profundidad medida.
Como es conocido, las sumas de Riemann permiten aproximar el valor de la integral definida de una función integrable. Veremos en este tema otras fórmulas utilizando polinomios interpoladores.
Sumas de Riemann

Fórmulas de cuadratura interpolatorias

Para encontrar una aproximación de la integral definida de $f$ en un intervalo $[a,b]$, se considerará la integración de un polinomio interpolador de $f$ en $n$ nodos en el intervalo.

Así, si $p(x)$ es un polinomio interpolador de $f$ en $n+1$ nodos,

$$\left\{ {{x_i}} \right\}_{i = 0}^n \subset \left[ {a,b} \right]\,\,\,\,\,\,\,\,\,\,\,\,p\left( {{x_i}} \right) = f\left( {{x_i}} \right)\,\,i = 0,1,...,n$$

una aproximación del valor de la integral de $f$ en $[a,b]$ será

$$\int\limits_a^b {f\left( x \right)dx} \approx \int\limits_a^b {p\left( x \right)dx} $$

Considerando el polinomio de interpolación de Lagrange, definido de la forma siguiente: $$p\left( x \right) = \sum\limits_{i = 0}^n {f\left( {{x_i}} \right){l_i}\left( x \right)} \,\,\,\, , \,\,\,\,\,\,\, {l_i}\left( x \right) = \prod\limits_{j = 0\,\,\,j \ne i}^n {{{x - {x_j}} \over {{x_i} - {x_j}}}} \,\,\,\,\,\, 0 \le i \le n$$

se obtendría, $$\int\limits_a^b {p\left( x \right)dx} = \sum\limits_{i = 0}^n {f\left( {{x_i}} \right)\int\limits_a^b {{l_i}\left( x \right)dx} } = $$ $$ = \left( {b - a} \right)\sum\limits_{i = 0}^n {f\left( {{x_i}} \right)\underbrace {\left( {{1 \over {b - a}}\int\limits_a^b {{l_i}\left( x \right)dx} } \right)}_{{w_i}}} $$

La aproximación será $$\int\limits_a^b {f\left( x \right)dx} \approx \left( {b - a} \right)\sum\limits_{i = 0}^n {{w_i}f\left( {{x_i}} \right)} \,\,\,\,\,\,\,\,siendo$$ $${w_i} = {1 \over {b - a}}\int\limits_a^b {{l_i}\left( x \right)dx} $$ Este tipo de cuadratura se dice que es una fórmula interpolatoria. Los puntos ${w_i}$ se denominan pesos y los puntos ${x_i}$ son los nodos de la fórmula de cuadratura.

Consideremos la función $f(x)=e^{-x^2}$, el intervalo $[0,1]$ y los 4 nodos siguientes $x_0=0$, $x_1=1/3$, $x_2=2/3$ y $x_3=1$. Calculemos la fórmula de cuadratura.
Se tendrá $$\int\limits_0^1 {{e^{ - {x^2}}}dx} \approx {\omega _o}{e^0} + {\omega _1}{e^{ - 1/9}} + {\omega _2}{e^{ - 4/9}}+ {\omega _3}{e^{ - 1}}$$ donde $${w_0} = \int\limits_0^1 {{l_o}\left( x \right)dx} \,\,\,\,\,\,\,\,\,\,\,\,\,{l_o} = {{\left( {x - 1/3} \right)\left( {x - 2/3} \right)\left( {x - 1} \right)} \over {\left( { - 1/3} \right)\left( { - 2/3} \right)\left( { - 1} \right)}}$$ $${w_1} = \int\limits_0^1 {{l_1}\left( x \right)dx} \,\,\,\,\,\,\,\,\,\,\,\,\,{l_1} = {{\left( {x - 0} \right)\left( {x - 2/3} \right)\left( {x - 1} \right)} \over {1/3 \cdot \left( { - 1/3} \right)\left( { - 2/3} \right)}}$$
$${w_2} = \int\limits_0^1 {{l_2}\left( x \right)dx} \,\,\,\,\,\,\,\,\,\,\,{l_2} = {{\left( {x - 0} \right)\left( {x - 1/3} \right)\left( {x - 1} \right)} \over {2/3 \cdot \left( { 1/3} \right)\left( { - 1/3} \right)}}$$ $${w_3} = \int\limits_0^1 {{l_3}\left( x \right)dx} \,\,\,\,\,\,\,\,\,\,\,{l_3} = {{\left( {x - 0} \right)\left( {x - 1/3} \right)\left( {x - 2/3} \right)} \over {1 \cdot \left( { 2/3} \right)\left( { 1/3} \right)}}$$ Se obtendría $${w_o} = {1 \over 8}\,\,\,\,\,\,\,{w_1} = {3 \over 8}\,\,\,\,\,\,\,\,{w_2} = {3 \over 8}\,\,\,\,\,\,{w_3} = {3 \over 8}$$ y, por tanto, $$\int\limits_0^1 {{e^{ - {x^2}}}dx} \approx {1 \over 8}{e^0} + {3 \over 8}{e^{ - 1/9}} + {3 \over 8}{e^{ - 4/9}} + {1 \over 8}{e^{ - 1}}$$
Se verá posteriormente que el cálculo de los pesos $\omega_i$ se puede obtener de otra forma más sencilla.
La fórmula $\int\limits_0^2 {f\left( x \right)dx} \approx 3f\left( 0 \right) + f\left( 2 \right)$ no es de tipo interpolatorio.
En efecto, se tiene $x_0=0$ y $x_1=2$ con pesos $\omega_0=3/2$ y $\omega_1=1/2$ $$\int\limits_0^2 {f\left( x \right)dx} \approx 2 \left( {\frac{3}{2}} f\left( 0 \right) + {\frac{1}{2}} f\left( 2 \right)\right) $$ Si fuera de tipo interpolatorio, se tendría que $w_o=3/2$ $${\frac{1}{2}}\int\limits_0^2 {{l_o}\left( x \right)dx} = {\frac{1}{2}} \int\limits_0^2 {{{x - {x_1}} \over {{x_o} - {x_1}}}\,} dx = {\frac{1}{2}} \int\limits_0^2 {{{x - 2} \over {0 - 2}}\,} dx = {\frac{1}{2}} \ne {\frac{3}{2}} $$

Para calcular la calidad de una fórmula de cuadratura se define su grado de precisión o exactitud.

DEFINICIÓN: Una fórmula de cuadratura tiene grado de exactitud $n\gt0$ si calcula exactamente la integral para cada polinomio de grado menor o igual que $n$, pero no es exacta para el menos un polinomio de grado $n+1$. Esto significa que para cada polinomio $q(x)$ de grado menor o igual a $n$, se cumple $$\int\limits_a^b {q\left( x \right)dx} = \left( {b - a} \right)\sum\limits_{i = 0}^n {{\omega _i}\,q\left( {{x_i}} \right)} $$

TEOREMA. La fórmula de cuadratura $$\int\limits_a^b {f\left( x \right)dx} \approx \left( {b - a} \right)\sum\limits_{i = 0}^n {{w_i}f\left( {{x_i}} \right)} $$ es de tipo interpolatorio si y solo sí es exacta de grado $n$.

Comprobar que la fórmula $$\int\limits_0^4 {f\left( x \right)dx} \approx 2f\left( 1 \right) + 2f\left( 3 \right)$$ es de tipo interpolatorio.
Se puede comprobar que es exacta para $f(x)=1$, $$\int\limits_0^4 {1\,dx} = 2 + 2$$ Es exacta para $f(x)=x$ $$\int\limits_0^4 {x\,dx} = 2 + 2 \cdot 3$$ Se puede ver además que el grado de precisión es exactamente uno ya que la fórmula no es exacta para $f(x)=x^2$ ya que $$\int\limits_0^4 {{x^2}\,dx} = {{64} \over 3} \ne 2 \cdot {1^2} + 2 \cdot {3^2} = 20$$
Esta tipo de fórmulas de cuadratura son eficientes en intervalos de longitud pequeña. Cuando el intervalo es de longitud grande, se descompone en subintervalos pequeños y se aplica en cada uno de ellos fórmulas de cuadratura.

Para ello se divide el intervalo $[a,b]$ en $k$ subintervalos $$a = {\alpha _o} < {\alpha _1} < ... < {\alpha _k} = b$$ obteniendo $$\int\limits_a^b {f\left( x \right)dx} = \sum\limits_{i = 1}^k {\int\limits_{{\alpha _{i - 1}}}^{{\alpha _i}} {f\left( x \right)dx} } $$

y, posteriormente, se aplica la fórmula de cuadratura a cada subintervalo. Este tipo de fórmulas se denominan de cuadratura compuesta y se analizan en el apartado 5.4 de este tema.

Fórmulas de cuadratura de Newton-Cotes

Veremos en primer lugar cómo obtener fórmulas de cuadratura elementales y el error asociado limitándonos a las fórmulas de Newton-Cotes. Posteriormente veremos cómo construir fórmulas de cuadratura compuesta para aproximar la integral con un error inferior a la precisión dada.

Las fórmulas de cuadratura de Newton-Cotes son de tipo interpolatorio $$\int\limits_a^b {f\left( x \right)dx} \approx \left( {b - a} \right)\sum\limits_{i = 0}^n {{w_i}f\left( {{x_i}} \right)} \,\,\,\,\,\,\,\,\,\,\,\,\,{w_i} = {1 \over {b - a}}\int\limits_a^b {{l_i}\left( x \right)dx} $$ donde los nodos se toman equidistantes.

DEFINICIÓN. Se llama fórmula de Newton-Cotes (también fórmula cerrada de Newton-Cotes) a aquella fórmula de cuadratura numérica de tipo interpolatorio, donde los nodos vienen dados por la expresión $${x_j} = a + jh\,\,\,,\,\,\,0 \le j \le n\,\,\,\,\,,\,\,\,h = {{b - a} \over n}$$ Es decir, se tienen $n+1$ nodos equidistantes $$a = {x_o} < {x_1} < {x_2} < ... < {x_n} = b$$ $$h = {x_j} - {x_{j - 1}}\,\,\,\,\,\,j = 1,...,n$$

En el siguiente interactivo se puede obtener un número variable de nodos equidistantes en un intervalo.

Intervalo [a, b] con n+1 nodos equidistantes

En la práctica resulta de utilidad el resultado siguiente a la hora de calcular los pesos.

Los pesos son independientes del intervalo siempre que se elijan adecuadamente los nodos, esto es, estén relacionados por la transformación de $[a,b]$ en $[c,d]$ dada de la siguiente forma, $$\begin{aligned} & \left[ {a,b} \right] &\to &\left[ c,d \right] \\ & x &\to & t = c + {{d - c} \over {b - a}}\left( {x - a} \right) \end{aligned}$$
Mapeo entre dos intervalos [a, b] y [c, d]
Este resultado significa que si se cambia de intervalo $[a,b]$ a $[c,d]$ y se consideran los nodos $x_i$ en $[a,b]$ y $t_i$ en $[c,d]$ relacionados de la forma siguiente: $${t_i} = c + {{d - c} \over {b - a}}\left( {{x_i} - a} \right)$$ se tendrá que los pesos en ambos casos coinciden.
En efecto, $$\widehat {{\omega _i}} = {1 \over {d - c}}\int\limits_c^d {\widehat {{l_i}}\left( t \right)dt} = {1 \over {b - a}}\int\limits_a^b {{l_i}\left( x \right)dx} = {\omega _i}$$ donde $$\widehat {{l_i}} \left( t \right) = \prod\limits_{j = 0\,\,\,j \ne i}^n {{{t - {t_j}} \over {{t_i} - {t_j}}}} \,\,\,\,\,\, 0 \le i \le n$$ $${l_i}\left( x \right) = \prod\limits_{j = 0\,\,\,j \ne i}^n {{{x - {x_j}} \over {{x_i} - {x_j}}}} \,\,\,\,\,\, 0 \le i \le n$$

Con los resultados expuestos anteriormente vamos a ver que la construcción de las fórmulas de Newton-Cotes no precisa calcular los polinomios base de Lagrange y luego realizar las integrales para obtener los correspondientes pesos. Bastará resolver un sistema de $n+1$ ecuaciones con $n+1$ incógnitas que se obtendrá aplicando que la fórmula de cuadratura es exacta para todos los polinomios de grado menor o igual a $n$ como se muestra a continuación.

Dados los nodos $x_i$ para $i=0,1,...,n$ se pueden determinar los pesos formando un sistema de $n+1$ ecuaciones con $n+1$ incógnitas considerando las siguientes $n+1$ igualdades: $$\int\limits_a^b {{x^k}dx} = \left( {b - a} \right)\sum\limits_{j = 0}^n {{\omega _j}x_j^k} \,\,\,\,\,\,\,k = 0,1,...,n$$ Este sistema tiene una única solución ya que la matriz de coeficientes es de Vandermonde.

Cálculo de las fórmulas de cuadratura Newton-Cotes

Calculamos las primeras fórmulas de Newton-Cotes aplicando también que el cálculo de los pesos no depende del intervalo siempre que se elijan adecuadamente en él.

Primera fórmula de Newton-Cotes (n=1)

Dados dos nodos en el intervalo $[a,b]$, esto es, $x_0=a$ y $x_1=b$, la fórmula de cuadratura es $$\int\limits_a^b {f\left( x \right)dx} \approx \left( {b - a} \right)\left[ {{\omega _o}f\left( a \right) + {\omega _1}f\left( b \right)} \right]$$

Para calcular los pesos se considera el intervalo $[0,1]$ y se resuelve el sistema siguiente $$\begin{aligned} & k = 0\,\,\,\,\,\,\,\,\,& 1 = \int\limits_0^1 {dx} = {\omega _o} + {\omega _1} \\ & k = 1\,\,\,\,\,\,\,\,\,&{1 \over 2} = \int\limits_0^1 {xdx} = {\omega _1} \end{aligned}$$

Resolviendo el sistema ${\omega _o} = {\omega _1} = {1 \over 2}$. Por lo tanto,

$$\int\limits_a^b {f\left( x \right)dx} \approx {{b - a} \over 2}\left[ {f\left( a \right) + f\left( b \right)} \right]$$ Esta fórmula de Newton-Cotes de dos puntos se llama fórmula del trapecio.
Regla del trapecio

Método del trapecio. Escena tomada de la unidad Integración Numérica. Proyecto Un100.

Segunda fórmula de Newton-Cotes (n=2)

En este caso el número de nodos es 3: $x_o=a$, $x_1=\frac{a+b}{2}$ y $x_2=b$ y la fórmula de cuadratura es $$\int\limits_a^b {f\left( x \right)dx} \approx \left( {b - a} \right)\left[ {{\omega _o}f\left( a \right) + {\omega _1}f\left( {{{a + b} \over 2}} \right) + {\omega _2}f\left( b \right)} \right]$$ Para determinar los nodos consideramos el intervalo $[-1,1]$. Resolviendo el sistema de 3 ecuaciones con 3 incógnicas, $${k = 0 \,\,\,\,\,\,\,\,\, 2 = \int\limits_{ - 1}^1 {dx} = 2\left[ {{\omega _o} + {\omega _1} + {\omega _2}} \right]}$$ $${k = 1 \,\,\,\,\,\,\,\,\, 0 = \int\limits_{ - 1}^1 {x\,dx} = 2\left[ { - {\omega _o} + 0 \cdot {\omega _1} + {\omega _2}} \right]}$$ $$k = 2\,\,\,\,\,\,\,\,\,{2 \over 3} = \int\limits_{ - 1}^1 {{x^2}\,dx} = 2\left[ {{\omega _o} + 0 \cdot {\omega _1} + {\omega _2}} \right]$$ obtenemos ${\omega _o} = {\omega _2} = {1 \over 6}$, ${\omega _1} = {2 \over 3}$. Por lo tanto:

$$\int\limits_a^b {f\left( x \right)dx} \approx {{\left( {b - a} \right)} \over 6}\left[ {f\left( a \right) + 4f\left( {{{a + b} \over 2}} \right) + f\left( b \right)} \right]$$

Esta regla se llama regla de Simpson.

Regla de Simpson

Regla de Simpson. Escena tomada de la unidad Integración Numérica. Proyecto Un100.

Fórmula de Newton-Cotes con n=3

En este caso el número de nodos es 4: $x_0=a$, $x_1=a+\frac{b-a}{3}$, $x_2=a+2 \frac{b-a}{3}$ y $x_3=b$ y la fórmula de cuadratura es $$\int\limits_a^b {f\left( x \right)dx} \approx \left( {b - a} \right)\left[ {{\omega _o}f\left( a \right) + {\omega _1}f\left( { {{2a+b} \over 3}} \right) + } \right.{\rm{ }}$$ $$\left. +{{\omega _2}f\left( {{{a+2b} \over 3}} \right) + {\omega _3}f\left( b \right)} \right]$$ Para determinar los nodos se considera el intervalo $[0,3]$ y se resuelve el sistema de 4 ecuaciones con 4 incógnitas asociado, obteniendo ${\omega _o} = {\omega _3} = {1 \over 8}$, ${\omega _1} = {\omega _2} = {3 \over 8}$ Por lo tanto:

$$\int\limits_a^b {f\left( x \right)dx} \approx $$ $$ \approx {{\left( {b - a} \right)} \over 8}\left[ {f\left( a \right) + 3f\left( {{{2a + b} \over 3}} \right) + 3f\left( {{{a + 2b} \over 3}} \right) + f\left( b \right)} \right] $$ Esta fórmula se llama regla de los tres octavos.
Regla de los tres octvavos
Notar que los pesos son simétricos, es decir, el primero es igual al último, el segundo es igual al penúltimo, etc.

De forma análoga pueden obtenerse las siguientes fórmulas de Newton-Cotes.

Obtener con Matlab la aproximación de la integral $\int\limits_0^\pi {{e^{senx\,\,\cos x}}dx} $ utilizando la regla de los tres octavos ($n=3$) y la de Hardy ($n=6$).
****Añadir solución *****

Error en la fórmula de cuadratura de Newton-Cotes.

Se analizará en este apartado el error de la aproximación, es decir, la diferencia entre el valor exacto y el aproximado por la fórmula de Newton-Cotes $$E = \int\limits_a^b {f\left( x \right)dx} - \left( {b - a} \right)\sum\limits_{j = 0}^n {{\omega _j}f\left( {{x_j}} \right)} $$ El siguiente resultado nos da una expresión para este error.

TEOREMA. Si $n$ es impar y la función $f$ es $n+1$ veces derivable y $f^{(n+1}$ es continua entonces existe $\xi \in \left[ {a,b} \right]$, de forma que el error de la fórmula viene dada por $$E = {{{h^{n + 2}}} \over {\left( {n + 1} \right)!}}{f^{(n + 1}}\left( \xi \right)\int\limits_0^n { \pi \left( x \right)} \,dx$$ donde $h=\frac{b-a}{n}$ y $\pi \left( x \right) = \left( x \right)\left( {x - 1} \right)...\left( {x - n} \right)$ Si $n$ es par y la función $f$ es $n+2$ veces derivable y $f^{(n+2}$ es continua entonces existe $\xi \in \left[ {a,b} \right]$, de forma que el error de la fórmula viene dada por $$E = {{{h^{n + 3}}} \over {\left( {n + 2} \right)!}}{f^{(n + 2}}\left( \xi \right)\int\limits_0^n {x\pi \left( x \right)} \,dx$$
Según este teorema, si $n$ es par, entonces el grado de precisión de la fórmula de Newton-Cotes es $n+1$. Cuando $n$ es impar, el grado de precisión es $n$.

Este teorema se puede escribir de la siguiente manera:

$$E = \left\{ \begin{aligned} &{C_n}{h^{n + 2}}{f^{(n + 1}}\left( \xi \right)\,\,\,\,\,\text{si n impar} \\ &{C_n}{h^{n + 3}}{f^{(n + 2}}\left( \xi \right)\,\,\,\,\,\text{si\ n par} \end{aligned} \right. $$ donde la constante $C_n$ tiene el siguiente valor: $$C_n = \left\{ \begin{aligned} &{1 \over {\left( {n + 1} \right)!}}\int\limits_0^n {t \left( {t - 1} \right)\left( {t - 2} \right)} ...\left( {t - n} \right)dt \,\,\,\,\,\text{si n impar} \\ & {1 \over {\left( {n + 2} \right)!}}\int\limits_0^n {t^2 \left( {t - 1} \right)\left( {t - 2} \right)} ...\left( {t - n} \right)dt \,\,\,\,\,\text{si n par} \end{aligned} \right. $$
El error de la fórmula de cuadratura de Newton Cotes se puede escribir de la forma siguiente: $$E = {C_n}{h^{m + 1}}{f^{(m}}\left( \xi \right)$$ siendo $m = \left\{ \begin{aligned} & n + 1\,\,si\,\,n\,\,impar \\ & n + 2\,\,si\,\,n\,\,par \\ \end{aligned} \right.$, $C_n$ una constante que viene dada por la expresión anterior y $\xi \in \left[ {a,b} \right]$.
Vamos a determinar el valor de las constantes $C_n$ para las primeras fórmulas de Newton-Cotes.

Error en la fórmula del trapecio ($n=1$)

Consideremos la fórmula de Newton-Cotes para $n=1$, que es impar. Tomamos $m=n+1=2$. Se tiene que $$\begin{aligned} E=&\color{red}{\int\limits_a^b {f\left( x \right)dx}} \color{black}{-} \color{green}{{{b - a} \over 2}\left( {f\left( a \right) + f\left( b \right)} \right)} \\ E=&{C_1} h^3 f''\left( \xi \right) \end{aligned}$$

Para determinar $C_1$, consideramos la función $f(x)=(x-a)^m=(x-a)^2$. Para esta función se tiene que por un lado se cumple

$$\color{red}{\int\limits_a^b {f(x)dx}} \color{black}{=\int\limits_a^b {{(x-a)^2}dx} = {1 \over 3}{\left( {b - a} \right)^3} =} \color{red}{{ {h^3} \over 3}}$$

y por otro

$$\color{green}{{{b - a} \over 2}\left( {f\left( a \right) + f\left( b \right)} \right)} \color{black}{= {{b - a} \over 2}\left( {0 + {{\left( {b - a} \right)}^2}} \right) =} {{{{\left( {b - a} \right)}^3}} \over 2} = \color{green}{ \frac {h^3} {2}}$$

Por lo tanto,

$${C_1}{h^3}{f^{''}}\left( \xi \right) = {{{h^3}} \over 3} - {{h^3} \over 2}$$

es decir,

$$2 {C_1} = {1 \over 3} - {1 \over 2} = - {1 \over 6}$$ $${C_1} = - {1 \over 12}$$
Se cumple entonces $$\int\limits_a^b {f\left( x \right)dx = {{b - a} \over 2}\left[ {f\left( a \right) + f\left( b \right)} \right]} - {1 \over {12}}{h^3}{f^{''}}\left( \xi \right)$$ para algún valor de $\xi$ en $[a,b]$.

Error en la fórmula de Simpson

Consideremos la fórmula de Newton-Cotes para $n=2$ que es par, consideramos $m=n+2=4$. Se tiene que $$\begin{aligned} E=&\int\limits_a^b {f\left( x \right)dx} - {{{b - a} \over 6}\left[ {f\left( a \right) + 4f\left( {{{a + b} \over 2}} \right) + f\left( b \right)} \right]} \\ E=&{C_2} h^5 f''\left( \xi \right) \end{aligned}$$ Para determinar $C_2$ consideramos la función $f(x)=(x-a)^m=(x-a)^4 $. Se tiene que por un lado se cumple $$\int\limits_a^b {{(x-a)^4}dx} = {1 \over 5}{\left( {b - a} \right)^5} = { {(2h)^5} \over 5}$$ y por otro $${{b - a} \over 6}\left[ {0 + 4\, \cdot {h^4} + {(2h)^4}} \right] = {{2h^5} \over 6} \cdot 20$$

Por lo tanto, $${C_2}{h^5}{f^{iv}}\left( \xi \right) = {{{2^5 h^5}} \over 5} - {{20 h^5} \over 3}$$ es decir, $$4!{C_2} = {{{2^5}} \over 5} - {{20} \over 3} = - {4 \over {15}}\,\,\,\,\,\,\, \Rightarrow \,\,\,\,\,\,{C_2} = - {1 \over {90}}$$
Se cumple entonces $$\int\limits_a^b {f\left( x \right)dx = {{b - a} \over 6}\left[ {f\left( a \right) + 4f\left( {{{a + b} \over 2}} \right) + f\left( b \right)} \right]} + E$$ $$E = - {1 \over {90}}{h^5}{f^{(iv}}\left( \xi \right)$$ para algún valor de $\xi$ en $[a,b]$.

Error en la fórmula de cuadratura 3/8

Consideremos la fórmula de Newton-Cotes para $n=3$, que es impar. Tomamos $m=n+1=4$. Se tiene que $$E=\int\limits_a^b {f\left( x \right)dx} - $$ $${{\left( {b - a} \right)} \over 8}\left[ {f\left( a \right) + 3f\left( {{{2a + b} \over 3}} \right) + 3f\left( {{{a + 2b} \over 3}} \right) + f\left( b \right)} \right] $$

$$E={C_3} h^5 f^{(4}\left( \xi \right)$$

Para determinar $C_3$ se considera la función $f(x)=(x-a)^m=(x-a)^4$. Se cumplirá $$\int\limits_a^b {{(x-a)^4}dx} = {1 \over 5}{\left( {b - a} \right)^5} = { {(3h)^5} \over 5}$$ $${{3h} \over 8}\left[ 0 + 3\, \cdot {h^4} + 3\, \cdot (2h)^4 + (3h)^4 \right] = {{99h^5} \over 2} $$ Por lo tanto, $$E={C_3} h^5 f^{(4}\left( \xi \right)=\frac{-9}{10}h^5$$ $$4!{C_3} = {{ - 9} \over {10}}\,\,\,\,\,\, \Rightarrow \,\,\,{C_3} = - {3 \over {80}}$$

Se cumple $$\int\limits_a^b {f\left( x \right)dx} = $$ $${{\left( {b - a} \right)} \over 8}\left[ {f\left( a \right) + 3f\left( {{{2a + b} \over 3}} \right) + 3f\left( {{{a + 2b} \over 3}} \right) + f\left( b \right)} \right] + E$$ $$ E=-\frac{3}{80} h^5 f^{(4}\left( \xi \right)$$ para algún valor de $\xi$ en $[a,b]$.

En la siguiente imagen se muestra la expresión del resto para cada una de las fórmulas de Newton-Cotes vistas anteriormente.

Considerar la integral $\int\limits_0^\pi {{e^{sen\left( x \right)}}dx} $ usando la regla del trapecio.
En este caso, $f(x)=e^{sen(x)}$, $a=0$, $b=\pi$ y la aproximación utilizando la fórmula de los trapecios será
$$\int\limits_0^\pi {{e^{sen\left( x \right)}}dx} \approx {\pi \over 2}\left[ {f\left( 0 \right) + f\left( \pi \right)} \right] = {\pi \over 2}\left[ {{e^{sen0}} + {e^{sen\pi }}} \right] = \pi $$

El error de la fórmula de los trapecios

$$E = \color{red}{\int\limits_a^b {f\left( x \right)dx} } - \color{green}{{\rm{ }}{{\left( {b - a} \right)} \over 2}\left[ {f\left( a \right) + f\left( b \right)} \right]}\color{black}{ = - {{{{\left( {b - a} \right)}^3}} \over {12}}{f^{''}}\left( \xi \right)}$$

con $\xi \in \left[ {a,b} \right]$. En este caso

$$E = \color{red}{\int\limits_0^\pi {{e^{sen\left( x \right)}}dx}} -\color{green}{ {{\pi} \over 2}\left[ {f\left( 0 \right) + f\left( {\pi} \right)} \right] }\color{black}{= - {{{\pi ^3}} \over {12}}{f^{''}}\left( \xi \right){\rm{ }}\,\,\,\,\xi \in \left[ {0,\pi } \right]}$$

Dado que

$$f'\left( x \right) = \cos \left( x \right){e^{sen\left( x \right)}}{\rm{ }}$$$$ f''\left( x \right) = {\cos ^2}\left( x \right){e^{sen\left( x \right)}} - sen\left( x \right){e^{sen\left( x \right)}}$$

se tiene que

$$\left| {f''\left( x \right)} \right| \le 2e$$

Una cota del error es, por tanto,

$$\left| E \right| = \left| { - {{{\pi ^3}} \over {12}}{f^{''}}\left( \xi \right)} \right| \le {{{\pi ^3}e} \over 6}$$

Observamos que, en el caso de la fórmula de los trapecios, el error que se comete en la aproximación depende del cubo de la longitud del intervalo. Si se disminuye esta longitud, el error disminuye rápidamente. Eso se puede lograr dividiendo el intervalo en subintervalos, y aplicando la cuadratura a cada uno de ellos y sumando después los resultados obtenidos.

Fórmulas compuestas

Cuando la distancia entre los nodos $h$ es de longitud grande, mayor que 1, el error que se comete puede ser grande. Por conseguir una mejor aproximación, se divide el intervalo $[a,b]$ en $N$ subintervalos $$a = {\alpha _o} < {\alpha _1} < ... < {\alpha _N} = b$$ calculando la integral como $$\int\limits_a^b {f\left( x \right)dx} = \sum\limits_{i = 1}^N {\int\limits_{{\alpha _{i - 1}}}^{{\alpha _i}} {f\left( x \right)dx} } $$ aplicando la fórmula de cuadratura a cada uno de los subintervalos $[{\alpha _{i-1}},{\alpha _i}]$.

Fórmulas compuestas. Escena tomada de Integración Numérica. Proyecto Un100..

La cuadratura del trapecio compuesta consiste en aproximar una integral en $[a,b]$ utilizando $N$ trapecios. En primer lugar, se divide el intervalo en $N$ subintervalos de longitud $h=\frac{b-a}{N}$. Despues de aplicar en cada uno de ellos la fórmula de cuadratura de los trapecios se obtiene

$$\int_{a}^{b}fx)dx \approx \frac{h}{2} \left [ f(a)+2f(a+h)+2f(a+2h)+...+f(b) \right ]$$

El error en esta aproximación se corresponde con

$$-\frac{(b-a)^3}{12N^2}f''(\xi ) \,\,\,\,\, \xi\epsilon (a,b)$$

siendo $N$ el número de subintervalos.

La cuadratura de Simpson compuesta consiste en aproximar una integral en $[a,b]$ dividiendo el intervalo en $N$ subintervalos de longitud $h=\frac{b-a}{N}$ y aplicar en cada uno de ellos la regla de Simpson. En este caso se precisarían $2N+1$ nodos $x_i=a+ih/2, \,\,0 \le i \le 2N$ se obtiene

$$\int_{a}^{b}f(x)dx \approx \frac{h}{6} [ f(x_0)+4f(x_1)+2f(x_2)+4f(x_3)+...$$ $$...+4f(x_{2N-1})+f(x_{2N}) ]$$

El error en esta aproximación es

$$ - {\left( {{{b - a} \over {2N}}} \right)^5}{N \over {90}}{f^{(4}}(\xi ) = - {\rm{ }}{{{{\left( {b - a} \right)}^5}} \over {180 \cdot {{(2N)}^4}}}{f^{(4}}(\xi ) \,\,\,\,\,\,\,\,\,\,\xi \in (a,b)$$
Calcular la siguiente integral $$\int\limits_0^1 {\left( {1 + sen\left( {{x^2}} \right)} \right)\,dx} $$ utilizando la cuadratura de los trapecios compuesta dividiendo el intervalo en 4 subintervalos.
*** Añadir explicación ****

Métodos adaptativos

Observa que los métodos compuestos no tienen en cuenta las zonas de mayor variabilidad de la función ya que se considera la longitud de cada subintervalo siempre igual.

Dependiendo de la función, puede ser conveniente utilizar subintervalos más pequeños donde haya más variabilidad de la función. En estos métodos adaptativos se estima el error cometido en cada intervalo de forma que permita decidir si hay que subdividir el intervalo.

Cuadratura adaptiva trapecios

Se calcula la aproximación $I_1$ de la integral de $f$ en $[a,b]$ mediante la cuadratura de los trapecios en el intervalo $[a,b]$.

Por otro lado, se considera $I_2$ la aproximación de la integral utilizando la regla del trapecio compuesta con $N=2$ siendo $ \color{red}{E}$ el error de esta aproximación.

Se tendrá:

$$\int\limits_a^b {f\left( x \right)dx} = I_1 - {\color{blue}{\frac{(b-a)^3}{12} f''(\xi _1)}}$$ $$\int\limits_a^b {f\left( x \right)dx} = I_2 {\color{red}{-\frac{(b-a)^3}{12 \cdot 4} f''(\xi _2)}}=I_2+ {\color{red}{E}}$$

Si suponemos que $f''(\xi _1)\approx f''(\xi _2)$, restando las dos expresiones anteriores, podemos considerar que una estimación del error utilizando el método de los trapecios en dos subintervalos

$$\left|I_2-I_1\right| \approx \left | \color{red}{E}-\color{blue}{4E} \right|= \left |3E\right|$$ $$\color{red}{\left |E\right|=\left |\int\limits_a^b {f\left( x \right)dx} - I_2\right|\approx \left |\frac{1}{3}(I_2-I_1)\right|}$$
Una estimación del error considerando como valor de la integral el valor de $I_1$ es decir, utilizando la cuadratura de los trapecios en el intervalo $[a,b]$, es $\color{blue}{\left |\frac{4}{3}(I_2-I_1)\right|}$.

Teniendo en cuenta la estimación anterior del error, el método recursivo para calcular la integral consiste en aplicar lo siguiente,

  • Si la estimación del error es menor que la tolerancia, devolvemos el valor de $I_2$ con la estimación del error.
  • Si esta estimación del error es mayor que la tolerancia, repetimos el proceso en cada subintervalo $[a, \frac{a+b}{2}$ y $[\frac{a+b}{2},b]$ permitiendo en cada subintervalo solo la mitad de la tolerancia.
Calcular $$\int\limits_0^1 {\left( {1 + sen\left( {{x^2}} \right)} \right)\,dx} $$ utilizando la cuadratura de los trapecios adaptativa con un error menor que $10^{-5}$.

Cuadratura adaptiva Simpson

Llamando $I_1$ a la fórmula de cuadratura de Simpson en $[a,b]$ y llamando $I_2$ a la fórmula de cuadratura de Simpson compuesta con $N=2$, se tendrá, llamando $h=(b-a)/2$

$$\int\limits_a^b {f\left( x \right)dx} = I_1 -{\color{blue}{ \frac{h^5}{90 } f''(\xi _1)}}$$ $$\int\limits_a^b {f\left( x \right)dx} = I_2 - {\color{red}{\frac{h^5}{90 \cdot 2^4 } f''(\xi _2)}}=I_2+\color{red}{E}$$ Si suponemos que $f''(\xi _1)\approx f''(\xi _2)$, restando las dos expresiones anteriores, podemos considerar que una estimación del error utilizando el método de Simpson en dos subintervalos $$\left|I_2-I_1\right| \approx \left |E-16E \right|= \left |15E\right|$$ $$\color{red}{\left |E\right|=\left |\int\limits_a^b {f\left( x \right)dx} - I_2\right|\approx \left |\frac{1}{15}(I_2-I_1)\right|}$$
Una estimación del error utilizando Simpson en un intervalo $[a,b]$ es, por tanto, $\color{blue}{\left |\frac{16}{15}(I_2-I_1)\right|}$.

Teniendo en cuenta la estimación anterior del error, el método recursivo para calcular la integral consiste en aplicar lo siguiente,

  • Si esta estimación del error es menor que la tolerancia, devolvemos el valor de $I_2$ con la estimación del error.
  • Si esta estimación del error es mayor que la tolerancia, repetimos el proceso en cada subintervalo $[a, \frac{a+b}{2}$ y $[(\frac{a+b}{2},b]$ permitiendo en cada subintervalo solo la mitad de la tolerancia.
Calcular $$\int\limits_0^1 {\left( {1 + sen\left( {{x^2}} \right)} \right)\,dx} $$ utilizando el método de Simpson adaptativo con un error menor que $10^{-5}$.
**** Añadir solución ****
Calcular la siguiente integral $\int\limits_0^\pi {{e^{{\rm{sen}}x\cos x}}\,dx} \,$ con un error inferior a $10^{-12}$.
Solución: 3.341031544735790
Calcular la siguiente integral $\int\limits_0^4 {{e^{ - {x^2}}}dx} $ con un error inferior a $10^{-12}$.
Solución: 0.886226911789732
Calcular la siguiente integral $\int\limits_0^4 {{e^{{x^2}}}dx} $ con un error inferior a $10^{-6}$.
Solución: 1.149400634590278e+06

Cuadratura adaptiva

Veamos cómo encontrar una estimación del error cuando se utiliza una fórmula de Newton-Cotes considerando dos pasos diferentes $h$ y $h/2$ y una estrategia para aplicar este método adaptativo en general.

Si llamamos $I$ a la aproximación de la integral $$\int\limits_a^b {f\left( x \right)dx} = I + E \,\,\, \text{con} \,\,E = {C_n}{h^{m + 1}}{f^{(m}}\left( \xi \right)$$ siendo $$m = \left\{ \begin{aligned} & n + 1\,\,si\,\,n\,\,impar \\ & n + 2\,\,si\,\,n\,\,par \\ \end{aligned} \right.$$

Aplicando la misma fórmula a los intervalos $[a,\frac{a+b}{2}]$ y $[\frac{a+b}{2},b]$ se tendrá, $$\begin{aligned} \int\limits_a^{\frac {a+b}{2}} {f\left( x \right)dx} &= {I_1} + {E_1} = {I_1} + {C_n}{\left( {{h \over 2}} \right)^{m + 1}}{f^{(m}}\left( {{\xi _1}} \right)\\ & {\xi _1} \in \left[ {a,{{a + b} \over 2}} \right] \end{aligned}$$ $$\begin{aligned} \int\limits_{{{a + b} \over 2}}^b {f\left( x \right)dx} &= {I_2} + {E_2} = {I_2} + {C_n}{\left( {{h \over 2}} \right)^{m + 1}}{f^{(m}}\left( {{\xi _2}} \right)\\ &{\xi _2} \in \left[ {{{a + b} \over 2},b} \right] \end{aligned}$$

Si $[a,b]$ es pequeño, $$I + E{\mkern 1mu} {\mkern 1mu} = {I_1} + {I_2} + {C_n}{{{h^{m + 1}}} \over {{2^m}}}\left[ {{{{f^{(m}}\left( {{\xi _1}} \right) + {f^{(m}}\left( {{\xi _2}} \right)} \over 2}} \right]$$ dado que el intervalo es pequeño, $$I + E{\mkern 1mu} {\mkern 1mu} \approx {I_1} + {I_2} + \underbrace {{C_n}{{{h^{m + 1}}} \over {{2^m}}}{f^{(m}}\left( \xi \right)}_{E/{2^m}}$$ $$I + E \approx {I_1} + {I_2} + {E \over {{2^m}}}$$ $${{{2^m} - 1} \over {{2^m}}}E \approx {I_1} + {I_2} - I$$ $$E \approx {{{2^m}} \over {{2^{m}-1}}}\left( {{I_1} + {I_2} - I} \right)$$

Se ha obtenido que si se utiliza la fórmula de Newton-Cotes de orden $n$ para aproximar la función en el intervalo $[a,b]$, tomando $m=n+1$ si n es impar y $m=n+2$ si n es par y considerando las aproximaciones $I$, $I_1$ e $I_2$ respectivamente en los subintervalos $[a,b]$, $[a,\frac{a+b}{2}]$ y $[\frac{a+b}{2},b]$, se cumple que el error $E$ de la aproximación en $[a,b]$ es $$\left| E \right| \approx \left| {{{2^m}} \over {{2^{m}-1}}}\left( {{I_1} + {I_2} - I} \right) \right|$$

Por lo tanto, fijada una precisión $\epsilon$ deseada de la integral, se describe la estrategia para obtener la aproximación con la precisión deseada.

  1. Elegimos una fórmula de Newton-Cotes para aproximar la integral en $[a,b]$.
  2. Subdividimos el intervalo $[a,b]$ en dos subintervalos de la misma longitud y calculamos las aproximaciones de las integrales $I_1$ e $I_2$ en ambos intervalos, con las correspondientes estimaciones de los errores $E_1$ y $E_2$. Definimos los vectores $I=[I_1, \,\,I_2]$ y $E=[E_1, \,\,E_2]$
  3. Si la suma de los errores, sum(E), es inferior a $\epsilon$, tomamos la suma de las aproximaciones $I$ como valor aproximado de la integral y se habrá terminado. Si no es así, $sum(E) \ge \epsilon$, entonces vamos al paso siguiente.
  4. Buscamos el error $E_k$ más grande de los contenidos en el vector $E$. Subdividimos el intervalo asociado a $E_k$ en dos mitades y calculamos las aproximaciones de la integral en cada una de las mitades y los correspondientes errores. Eliminamos $I_k$ y $E_k$ y ponemos en su lugar los dos valores de la integral calculados y los correspondientes errores. Volvemos al paso 3.
Para las prácticas utlizaremos los ficheros iehardy.m que a su vez utiliza la función hardy.m, para obtener la aproximación de la integral utilizando la la fórmula de Hardy. Estas dos funciones han sido creadas por el profesor Eduardo Casas (ficheros Matlab).
[itg error]=iehardy(a,b,f)
%Devuelve una estimación de la integral y
%el error cometido. Requiere que la
%función f se programe vectorialmente.
Calcular la integral $\int\limits_0^\pi {{e^{senx\,\cos x}}dx} $ con un error inferior a $\epsilon_a=10^{-12}$ considerando la regla de Hardy.
a=0;b=pi;
format long
f=@(x) exp(sin(x).*cos(x));
error=10^-12;
Dividimos el intervalo en dos partes y aplicamos la fórmula de Newton-Cotes de Hardy. Se tendrá que
x=[a (a+b)/2 b];
[i1 e1]=iehardy(x(1),x(2),f);
[i2 e2]=iehardy(x(2),x(3),f);
E=[e1 e2];I=[i1 i2];
error=sum(E)
itg=sum(I)
Si el error es menor que $\epsilon_a$ habremos terminado y el valor de la integral es itg. Como en este caso no es así, se considera el subintervalo con mayor error. Ejecutando la orden,
[s k]=max(E)
el valor que se obtiene es $k=1$, Se continúa repitiendo el proceso en el intervalo $[x(k),x(k+1)]$ hasta conseguir la precisión considerada.
Los vectores $x$, $E$, $I$ van creciendo según se van tomando subdivisiones en los intervalos.
xn=(x(k)+x(k+1))/2;
x=[x(1:k) xn x(k+1:end)];
[i1 e1]=iehardy(x(k),xn,f);
[i2 e2]=iehardy(xn,x(k+2),f);
E=[E(1:k-1) e1 e2 E(k+1:end)]
I=[I(1:k-1) i1 i2 I(k+1:end)];
itg=sum(I)
error=sum(E)
Se repite el proceso 26 veces obteniendo que el valor de la integral es $ 3.341031544735853$. El valor que devuelve matlab es $3.341031544735852$
integral(f,0,pi)
Si se considera el error absoluto en la precisión de la solución el algoritmo se detiene si $E < \epsilon_a$. Si se usa el error relativo, el algoritmo se detenderá si $E < \epsilon_r|I|$. A menudo se utiliza un test de parada que combina ambos errores: $$E < \epsilon_a+\epsilon_r |I|$$

Usualmente, si la integral es un número grande, el algoritmo se detiene cuando el error relativo es inferior a $\epsilon_r$, mientras que si $|I|$ es pequeño, el algoritmo finaliza cuando el error absoluto es inferior a $\epsilon_a$.

En general, se tendrá que el código Matlab a ejecutar es

%ea error absoluto
%er error relativo
x=[a (a+b)/2 b]
[i1 e1]=iehardy(x(1),x(2),f)
[i2 e2]=iehardy(x(2),x(3),f)
I=[i1 i2];E=[e1 e2];
error=sum(E);
if error<ea
   itg=sum(I);
   [itg error]
else
  [s,k]=max(E)
end
parar=0
while parar==0
  xn=(x(k)+x(k+1))/2
  x=[x(1:k) xn x(k+1:end)]
  [i1 e1]=iehardy(x(k),xn,f);
  [i2 e2]=iehardy(xn,x(k+2),f);
  E=[E(1:k-1) e1 e2 E(k+1:end)];
  I=[I(1:k-1) i1 i2 I(k+1:end)];
  error=sum(E);
  if error < ea+er*abs(itg)
   itg=sum(I);
   [itg error]
   parar=1;
  else
      [s,k]=max(E);
  end
end

Cálculo de Integrales impropias

En este apartado, veremos cómo proceder cuando el intervalo $[a,b]$ no es acotado. En el primer caso, se considerará que $a$ o $b$ o ambos no son finitos (integrales impropias de primera especie) y en el segundo caso cuando $f$ tenga una singularidad en un punto $x_o$ en $[a,b]$ de forma que se cumple $\mathop {\lim }\limits_{x \to {x_o}} \left| {f\left( x \right)} \right| = + \infty $ (integrales impropias de segunda especie).

Integrales impropias de primera especie

TIPO I. Consideraremos en este caso integrales del tipo $$\int\limits_a^\infty {f\left( x \right)dx} = \mathop {\lim }\limits_{b \to \infty } \int\limits_a^b {f\left( x \right)dx} $$ donde $f$ es continua. Cuando el límite anterior existe, la integral impropia es convergente. En este caso se tendrá que $$\mathop {\lim }\limits_{b \to \infty } \int\limits_b^\infty {f\left( x \right)dx} = 0$$
En primer lugar se hallará un valor de $b$ de forma que $$\left| {\int\limits_b^\infty {f\left( x \right)dx} } \right| < {\varepsilon \over 2}$$
y luego se buscará una aproximación de la intengral $Itg$ de forma que $$\left| {\int\limits_a^b {f\left( x \right)dx} - Itg} \right| < {\varepsilon \over 2}$$

TIPO II. De forma análoga se podrá hacer para calcular las integrales

$${\int\limits_{ - \infty }^a {f\left( x \right)dx} }$$

TIPO III. En el caso de una integral de la forma $${\int\limits_{ - \infty }^\infty {f\left( x \right)dx} }$$ se tendrá en cuenta que $$\int\limits_{ - \infty }^\infty {f\left( x \right)dx} = \int\limits_{ - \infty }^0 {f\left( x \right)dx} + \int\limits_0^\infty {f\left( x \right)dx} $$ buscando una aproximación de cada una de ellas con un error menor que $\epsilon/2$. Alternativamente se puede buscar números $a<0$ y $b>0$ de forma que $$\left| {\int\limits_{ - \infty }^a {f\left( x \right)dx} } \right| < {\varepsilon \over 4}\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\left| {\int\limits_b^\infty {f\left( x \right)dx} } \right| < {\varepsilon \over 4}\,\,\,\,\,\,\,\,\,\left| {\int\limits_a^b {f\left( x \right)dx} } \right| < {\varepsilon \over 2}$$

Calcular $\int\limits_0^\infty {{e^{ - x}}{{\cos }^2}\left( x \right)dx} $ considerando $e_a=10^{-12}$.
Dado que $$\int\limits_0^\infty {{e^{ - x}}{{\cos }^2}\left( x \right)dx} = \underbrace {\int\limits_0^b {{e^{ - x}}{{\cos }^2}\left( x \right)dx} }_{ = {I_1}} + \underbrace {\int\limits_b^\infty {{e^{ - x}}{{\cos }^2}\left( x \right)dx} }_{ = {I_2}}$$ se debe tomar $b$ de forma que $$\left| {{I_2}} \right| \le {{{{10}^{ - 12}}} \over 2}$$ Puede considerarse $${\log \left( {2 \cdot {{10}^{12}}} \right) \le b}$$ Calbulando $I_1$ con un error menor que $10^{-12}/2$, el valor de la integral es $0.599999999999007$.
Calcular $\int\limits_0^\infty {{e^{ - x}}\log \left( {2 + {\rm{sen}}x} \right)dx} $ considerando $e_a=10^{-12}$.
Solución Matlab: 0.798285100587732
Calcular $\int\limits_0^\infty {{e^{ - {x^4}}}dx} $ considerando $e_a=10^{-12}$.
Solución Matlab: 0.906402477053391
Calcular $\int\limits_0^\infty {{{{\rm{sen}}x} \over {1 + {x^3}}}dx} $ considerando $e_a=10^{-12}$.
Solución Matlab: 0.610912718838516
Calcular $\int\limits_0^\infty {{{{e^{ - x}}} \over {1 + {x^4}}}dx} $ considerando $e_a=10^{-12}$.
Solución Matlab: 0.630477834918498

Integrales impropias de segunda especie

En este tipo de integrales la función $f$ es continua en $[a,b]$ salvo en un punto $x_0$ donde $$\mathop {\lim }\limits_{x \to {x_0}} \left| {f\left( x \right)} \right| = + \infty $$

Caso 1 Si el punto $x_0=a$ será $$\int\limits_a^b {f\left( x \right)dx} = \mathop {\lim }\limits_{\delta \searrow 0} \int\limits_{a + \delta }^a {f\left( x \right)dx} $$

Se procede de la siguiente forma:

Se busca $\delta$ cumpliendo $$\left| {\int\limits_a^{a + \delta } {f\left( x \right)dx} } \right| < {\varepsilon \over 2}$$ y luego una aproximación verificando $$\left| {\int\limits_{a + \delta }^b {f\left( x \right)dx} } \right| < {\varepsilon \over 2}$$
Caso 2 Si el punto $x_0=b$ será $$\int\limits_a^b {f\left( x \right)dx} = \mathop {\lim }\limits_{\delta \searrow 0} \int\limits_a^{b - \delta } {f\left( x \right)dx} $$
Se procede de la misma forma que en el caso anterior
Caso 3 Si $x_0$ es un punto interior se define esta integral impropia de la forma siguiente: $$\int\limits_a^b {f\left( x \right)dx} = \mathop {\lim }\limits_{\delta \searrow 0} \int\limits_a^{{x_o} - \delta } {f\left( x \right)dx} + \mathop {\lim }\limits_{\delta \searrow 0} \int\limits_a^{{x_o} + \delta } {f\left( x \right)dx} $$
Se busca un valor de $\delta > 0$ verificando $$\left| {\int\limits_{{x_o} - \delta }^{{x_o}} {f\left( x \right)dx} } \right| + \left| {\int\limits_{{x_o}}^{{x_o} + \delta } {f\left( x \right)dx} } \right| < {\varepsilon \over 2}$$ Después se buscan aproximaciones de las integrales cumpliendo $$\left| {\int\limits_a^{{x_o} - \delta } {f\left( x \right)dx} } \right| < {\varepsilon \over 4}\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\left| {\int\limits_{{x_o} + \delta }^b {f\left( x \right)dx} } \right| < {\varepsilon \over 4}$$
Calcular $$\int\limits_0^1 {{{\cos \left( x \right)} \over {2\pi \,{\rm{sen}}\left( {\sqrt x } \right)}}dx} $$ considerando $e_a=10^{-12}$.
Solución Matlab: 0.302993744656398

Autoevaluación

**** Incluir preguntas del tema ****

Actividad de autoevaluación

Ejercicios

Consideremos la función \(f(x) = e^{-2x}\), el intervalo \([0,1]\), y los nodos: \(x_0 = 0\), \(x_1 = 1/3\), \(x_2 = 2/3\), \(x_3 = 1\). Calcular la fórmula de cuadratura a partir de los polinomios base de Lagrange.
Comprobar:
  • (a) La fórmula \(\int_0^1 f(x) dx \approx f(0) + f(2/3)\) no es de tipo interpolatorio.
  • (b) La fórmula \(\int_0^1 f(x) dx \approx f(0) + f(1/3) + f(2/3) + f(1)\) es de tipo interpolatorio.
Obtener con MATLAB la aproximación de la integral: \[ \int_0^{\pi} e^{\cos(x)} \sin(x) dx \] utilizando:
  • (a) La regla de los tres octavos (\(n=3\)).
  • (b) La regla de Hardy (\(n=6\)).
Utiliza la fórmula de los trapecios compuesta con tres subintervalos para aproximar la integral \(\int_0^{\pi} \sin(x) dx\). Calcular cuántos subintervalos serían necesarios para que el error cumpla \(E \leq 0.5 \times 10^{-8}\).
Aproximar el valor de \(\pi\) mediante la integral: \[ \int_0^1 \frac{4}{1+x^2} dx, \] utilizando las fórmulas compuestas del trapecio y de Simpson con 1024 nodos.
Calcular una cota del error al aproximar \(\int_0^{0.2} e^x dx\) utilizando la regla de los trapecios.
Calcular el área limitada por las gráficas de las funciones: \[ y = \frac{\sin(x)}{1+x}, \quad y = 0, \quad x = 1, \] con un error inferior a \(10^{-8}\). Calcular los puntos de corte utilizando el método de Newton.
Calcular el valor aproximado de la integral: \[ \int_1^{\pi/2} \log(\sin(x)) dx, \] utilizando:
  • (a) La regla del trapecio compuesta con 10 intervalos.
  • (b) Un error absoluto inferior a \(10^{-10}\).
Calcular las siguientes integrales con un error inferior al indicado utilizando la fórmula adaptativa de los trapecios:
  • (a) \(\int_0^{\pi} e^{\cos(x)} \sin(x) dx\), con \(E_a \leq 10^{-12}\).
  • (b) \(\int_0^4 e^{2x} dx\), con \(E_a \leq 10^{-12}\), \(E_r \leq 10^{-10}\).
  • (c) \(\int_0^{\pi} (1+x^2)e^{\sin(x)} dx\), con \(E_a \leq 10^{-12}\).
Calcular el valor aproximado de las siguientes integrales:
  • (a) \(\int_0^{\infty} e^{-x^2} \cos(x) dx\), con \(E_a \leq 10^{-12}\).
  • (b) \(\int_0^{\infty} \log(2+x)e^{-x} dx\), con \(E_a \leq 10^{-12}\).
  • (c) \(\int_0^{\infty} x^4e^{-x} dx\), con \(E_a \leq 10^{-12}\).
  • (d) \(\int_0^{\infty} \frac{\sin(x)}{1+x^3} dx\), con \(E_a \leq 10^{-8}\).
  • (e) \(\int_0^{\infty} \frac{e^{-x^4}}{1+x} dx\), con \(E_a \leq 10^{-12}\).
RESUMEN

En este capítulo, se aborda la integración numérica, una herramienta fundamental para calcular integrales cuando las soluciones analíticas no son posibles o prácticas. Se centra en los métodos numéricos para aproximar el valor de una integral definida, describiendo varias técnicas y evaluando su precisión y eficiencia. Además, se estudian métodos específicos para tratar integrales impropias y la forma de gestionar errores asociados a estas aproximaciones.

Los principales aspectos tratados en este tema son los siguientes.


  1. Fórmulas de cuadratura interpolatorias

    Describen cómo aproximar una integral utilizando funciones polinómicas interpolantes, mostrando su utilidad en casos donde se conoce el valor de la función en puntos específicos.

  2. Fórmulas de Newton-Cotes

    Estas son técnicas basadas en interpolación polinómica que incluyen reglas conocidas como la del trapecio y Simpson. Se analizan sus derivaciones, aplicaciones y errores asociados.

  3. Fórmulas compuestas

    Extienden las fórmulas de Newton-Cotes a subintervalos más pequeños, mejorando la precisión para integrales de funciones complejas. Además, se introducen métodos adaptativos que ajustan dinámicamente los intervalos según la función.

  1. Cálculo de integrales impropias

    Se presentan métodos para evaluar integrales que tienen singularidades o límites infinitos, diferenciando entre aquellas de primera y segunda especie.

  2. Errores en integración numérica

    Se analizan las fuentes de error en los métodos numéricos, como el error de truncamiento y los errores asociados a las aproximaciones polinómicas, con énfasis en cómo minimizarlos.

  1. Ejercicios y autoevaluaciones

    El capítulo incluye ejemplos prácticos y ejercicios diseñados para aplicar y comprender los conceptos, así como autoevaluaciones para reforzar el aprendizaje.



Capítulo

Integración numérica de ecuaciones diferenciales

Introduccion

En Ingeniería, el comportamiento de un sistema puede describirse mediante ecuaciones que relacionan la tasa de variación de una magnitud con la magnitud misma y otras variables asociadas. Igualmente, las leyes físicas se expresan con frecuencia como una razón de cambio, por ejemplo, la caída de un cuerpo, el cambio de temperatura, etc. Estas relaciones suelen expresarse a través de ecuaciones diferenciales ordinarias (EDO). Las ecuaciones diferenciales tienen gran importancia para modelar y explicar el comportamiento de muchos fenómenos.

En este capítulo vamos a estudiar la resolución numérica de dos problemas asociados a las ecuaciones diferenciales ordinarias:

  1. el problema de Cauchy o problema de valor inicial
  2. el problema de contorno.
En un problema de valor inicial las condiciones se establecen sobre el instante inicial y en un problema de contorno, las condiciones se establecen tanto en el instante inicial como en el final.

En la siguiente escena se muestra un ejemplo de aplicación de las ecuaciones diferenciales a un sistema muelle-resorte.

Sistema muelle-resorte. Escena tomada de Red Digital Descartes

En el siguiente ejemplo, las ecuaciones diferenciales modelizan al vaciado de un tanque.

Vaciado de un tanque. Escena tomada de Red Digital Descartes

Formulación del problema de valor inicial

Un problema de valor inicial (PVI) se formula a partir de una ecuación diferencial ordinaria junto con un valor específico de la función en un instante dado, de modo que la solución buscada deba satisfacer simultáneamente la relación diferencial y dicha condición inicial.
El problema de valor inicial, PVI, puede escribirse de forma general como $$\left\{ \begin{aligned} & y'\left( t \right) = f\left( {t,y\left( t \right)} \right)\,\,\,\,\,\,\,\,\,t \in \left[ {{t_o},{t_f}} \right] \\ & y\left( {{t_o}} \right) = {y_0} \end{aligned} \right.$$ siendo $$ - \infty < {t_0} < {t_f} < \infty $$ $$f:\left[ {{t_o},{t_f}} \right]\text{x}{\mathbb R^n} \to \mathbb R^n$$

En su forma general, se considera

$$y\left( t \right) = \left( \begin{aligned} &{{y_1}\left( t \right)} \\ & {{y_2}\left( t \right)} \\ &\vdots \\ & {{y_n}\left( t \right)} \\ \end{aligned} \right)\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,f\left( {t,y\left( t \right)} \right) = \left( \begin{aligned} & {{f_1}\left( {t,{y_1},{y_2},...,{y_n}} \right)} \\ &{{f_2}\left( {t,{y_1},{y_2},...,{y_n}} \right)} \\ & \vdots \\ &{{f_n}\left( {t,{y_1},{y_2},...,{y_n}} \right)} \\ \end{aligned} \right)$$ $$\begin{aligned} & y'_1={{f_1}\left( {t,{y_1},{y_2},...,{y_n}} \right)} \\ & y'_2={{f_2}\left( {t,{y_1},{y_2},...,{y_n}} \right)} \\ & \vdots \\ & y'_n={{f_n}\left( {t,{y_1},{y_2},...,{y_n}} \right)} \\ \end{aligned}$$

Esta forma permite escribir muchos problemas. Veamos algún ejemplo.

Consideremos el siguiente problema

$$\left\{ \begin{aligned} & y''\left( t \right) + y\left( t \right) = 1\,\,\,\,\,\,\,\,\,\,t \in \left[ {0,2\pi } \right] \\ & y\left( 0 \right) = 1,\,\,y'\left( 0 \right) = 1 \end{aligned} \right.$$ Escribirlo en la forma dada para un problema de valor inicial.

Llamando

$${y_1} = y \,\,\,\,\,\,\,\,{y_2} = y'$$ se puede escribir $$\left\{ \begin{aligned} & y{'_1} = {y_2} \\ & y{'_2} = 1 - {y_1} \\ & y_1(0)=1, \,\,\,\,y_2(0)=1 \end{aligned} \right.$$

Considerando

$$y\left( t \right) = \left( \begin{aligned} {{y_1}\left( t \right)} \\ {{y_2}\left( t \right)} \\ \end{aligned} \right)\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,f\left( {t,y\left( t \right)} \right) = \left( \begin{aligned} {{y_2}} \\ {1- {y_1}} \\ \end{aligned} \right)$$

la ecuación diferencial puede escribirse de la forma

$$ \left( \begin{aligned} {{y'_1}\left( t \right)} \\ {{y'_2}\left( t \right)} \\ \end{aligned} \right)=\left( \begin{aligned} {{y_2}} \\ {1- {y_1}} \\ \end{aligned} \right)$$

con las siguientes condiciones en el punto inicial $t_0=0$

$$y\left( 0 \right) = \left( \begin{aligned} 1 \\ 1 \\ \end{aligned} \right)$$
Repetimos el ejemplo considerando el siguiente problema

$$\left\{ \begin{aligned} & y''\left( t \right) =2t y\left( t \right)+t^2 \,\,\,\,\,\,\,\,\,\,t \in \left[ {0,2\pi } \right] \\ & y\left( 0 \right) = 1,\,\,y'\left( 0 \right) = 0 \end{aligned} \right.$$

Llamando

$${y_1} = y \,\,\,\,\,\,\,\,{y_2} = y'$$ se puede escribir $$\left\{ \begin{aligned} & y{'_1} = {y_2} \\ & y{'_2} = 2t{y_1} +t^2\\ & y_1(0)=1, \,\,\,\,y_2(0)=0 \end{aligned} \right.$$

Considerando

$$y\left( t \right) = \left( \begin{aligned} &{{y_1}\left( t \right)} \\ & {{y_2}\left( t \right)} \\ \end{aligned} \right)\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,f\left( {t,y\left( t \right)} \right) = \left( \begin{aligned} {{y_2}} \\ {2t{y_1} + {t^2}} \\ \end{aligned} \right)$$

la ecuación diferencial puede escribirse de la forma

$$ \left( \begin{aligned} {{y'_1}\left( t \right)} \\ {{y'_2}\left( t \right)} \\ \end{aligned} \right)=\left( \begin{aligned} {{y_2}} \\ {2t {y_1}+t^2} \\ \end{aligned} \right)$$

con las siguientes condiciones en el punto inicial

$$y\left( 0 \right) = \left( \begin{aligned} 1 \\ 0 \\ \end{aligned} \right)$$

Existencia y unicidad

Para asegurar que un problema de valor inicial (PVI) tenga una única solución, se considera el siguiente teorema de existencia y unicidad.

Dado el problema $$\left\{ \begin{aligned} & y'\left( t \right) = f\left( {t,y\left( t \right)} \right)\,\,\,\,\,\,\,\,\,t \in \left[ {{t_o},{t_f}} \right] \\ & y\left( {{t_o}} \right) = {y_0} \end{aligned} \right.$$ con $$f:\left[ {{t_o},{t_f}} \right]\text{x}{\mathbb R^n} \to \mathbb R^n$$ si $f$ es continua y acotada en un dominio que contenga a $(t_0,y_o)$ entonces el problema tiene al menos una solución.

Para que la solución sea única se puede exigir que la función cumpla la condición de Lipschitz para la variable $y$, es decir, exista $L> 0$ de forma que para todo $t$ en $[t_0,t_f]$

$$\left\| {f\left( {t,{y_1}} \right) - f\left( {t,{y_2}} \right)} \right\| \le L\left\| {{y_1} - {y_2}} \right\|$$

Métodos de Runge-Kutta

En este apartado se estudiarán los métodos de Runge-Kutta de un solo paso, donde la solución aproximada se obtiene progresivamente de un punto al siguiente a partir de la información de la derivada en puntos intermedios dentro de cada intervalo, sin emplear los valores de pasos previos. Así, dado el problema

$$y'\left( t \right) = f\left( {t,y\left( t \right)} \right)\,\,\,\,\,\,\,\,\,t \in \left[ {{t_o},{t_f}} \right] $$

la integración numérica del problema consiste en determinar unos instantes

$${t_o} < {t_1} < {t_2} < ... < {t_N} = {t_f} \,\,\,\,\,\,h_n=t_{n+1}-t_n$$

y valores $$\left\{ {{y_o},\,\,{y_1},\,\,{y_2}...,\,\,{y_N}} \right\}$$ de forma que a partir de $$y\left( {{t_n}} \right) \approx {y_n}$$ se pueda obtener la aproximación de $y_{n+1}$. En este apartado veremos distintos métodos de Runge-Kutta Carl David Tolmé Runge (30 de agosto de 1856 - 3 de enero de 1927) fue un matemático y físico alemán conocido por su trabajo en análisis numérico y ecuaciones diferenciales. Nació en Bremen, Alemania, y estudió matemáticas y física en las universidades de Múnich y Berlín, obteniendo su doctorado en 1880. Runge es reconocido por desarrollar, junto con Martin Kutta, los métodos de Runge-Kutta para resolver ecuaciones diferenciales ordinarias de manera numérica. También realizó importantes contribuciones a la espectroscopía y la teoría de aproximación. Fue profesor en la Universidad de Hannover y, más tarde, en la Universidad de Gotinga. Martin Wilhelm Kutta (3 de noviembre de 1867 - 25 de diciembre de 1944) fue un matemático alemán conocido principalmente por su trabajo conjunto con Carl Runge en el desarrollo de los métodos de Runge-Kutta para la solución numérica de ecuaciones diferenciales ordinarias. Nacido en Pitschen (entonces parte de Prusia), estudió en las universidades de Breslavia y Múnich, donde trabajó con destacados matemáticos de la época. Además de su contribución a los métodos de Runge-Kutta, Kutta realizó estudios en mecánica y aerodinámica, desarrollando la teoría de sustentación conocida como el "teorema de Kutta-Joukowski". Fue profesor en la Universidad Técnica de Stuttgart.. Su idea principal es aproximar la solución mediante una combinación ponderada de evaluaciones de la función derivada en puntos intermedios dentro de un intervalo. Estas evaluaciones permiten calcular el siguiente valor de la solución con más exactitud, sin necesidad de derivadas superiores, lo que los hace altamente versátiles y aplicables en problemas científicos e ingenieriles.

En la imagen siguiente se muestra, para una ecuación diferenciable de primer orden, la solución de un problema de valor inicial y la solución aproximada con 7 pasos considerando el intervalo $[0,4]$. El método numérico deberá indicar cómo obtener cada punto de la solución numérica a partir del anterior. En el caso del gráfico, el avance al siguiente punto utiliza la pendiente en el punto anterior.

Representación de la solución exacta y aproximada de un PVI

Método de Euler

El método de Euler es el procedimiento más sencillo para aproximar la solución de un problema de valor inicial. Veamos cómo obtener a partir de $y(t_n) \approx y_n$ el valor $y_{n+1}$.

Dado que, $${y(t_{n + 1})} = {y(t_n)} +\color{blue}{ \int\limits_{{t_n}}^{{t_{n + 1}}} {f\left( {t,y\left( t \right)} \right)dt}}$$

se puede usar la fórmula de cuadratura con un nodo para obtener un valor aproximado de la integral de la forma siguiente

$${y(t_{n + 1})} \approx {y_{n+1}}={y_n} + \color{blue}{{h_n}f\left( {{t_n},{y_n}} \right)}$$

En la siguiente figura se muestra gráficamente cómo obtener $y_1$ a partir de $y_0$, esto es, a partir del valor de la solución en $t_0$ se muestra cómo obtener el valor en $t_1$.

Primer paso del método de Euler.

Método de Lagrange

Con esta aproximación, vemos que el método usa la pendiente dada por la ecuación diferencial en el extremo inicial de cada paso para “mover” la solución al extremo siguiente.

Consideremos el problema de valor inicial

$${{dy} \over {dt}} = 0.7y - {t^2} + 1\,\,\,\,\,\,\,,\,\,\,\,\,\,y\left( 1 \right) = 1\,\,\,\,\,\,\,,\,\,\,\,\,\,\,\,t \in \left[ {1,2} \right]$$ Encontrar la solución aproximada al problema utilizando por el método de Euler con 11 puntos.

En este caso, $f(t,y)=0.7y-t^2+1$, el intervalo es $[1,2]$ y la condición inicial es $y(1)=1$. Como se pide que la solución pase por 11 puntos, se considera ($N = 10$). En este caso el valor $h_n$ es $(2-1)/10=0.1$.

Calculamos los dos primeros pasos de la aproximación de la curva solución del PVI

$${t_1} = 1.1 \,\,\,\,\,\,\,\, {y_1} = y\left( {1.1} \right) = y\left( 1 \right) + 0.1 \cdot \,f\left( {1,\,\,y\left( 1 \right)} \right) = 1.07$$ $${t_2} = 1.2 \,\,\,\,\,\,\,\, {y_2} = y\left( {1.2} \right) = y\left( {1.1} \right) + 0.1\, \cdot f\left( {1.1,\,\,y\left( {1.1} \right)} \right) = 1.1239$$ $${t_3} = 1.3 \,\,\,\,\,\,\,\, {y_3} = y\left( {1.3} \right) = y\left( 1.2 \right) + 0.1 \cdot \,f\left( {1.2,\,\,y\left( 1.2 \right)} \right) = 1.15857$$ $${t_4} = 1.4 \,\,\,\,\,\,\,\, {y_4} = y\left( {1.4} \right) = y\left( {1.3} \right) + 0.1\, \cdot f\left( {1.3,\,\,y\left( {1.3} \right)} \right) = 1.17067$$ $$...$$

y así sucesivamente con el resto de puntos. Puedes ver estos valores en el siguiente interactivo. Observa que aumentando el valor del número de nodos, la aproximación de la solución (marcada en azul) es mejor. En la parte inferior del interactivo, verás la comparativa con otros métodos que se irán viendo en este capítulo (Heun y Runge-Kutta de 3 y 4 etapas).

Cálculo de la solución de la EDO por el método de Euler

Se muestra seguidamente el código Matlab para obtener los cálculos de la solución aproximada del PVI en los 11 nodos.

clear all
f=@(t,y) 0.7*y-t^2+1;%Función
a=1;b=2;y0=1;%Intervalo
N=10;%Pasos (N+1 puntos)
h=(b-a)/N; %Longitud del paso
t(1)=a;
y(1)=y0;
for n=1:N
     t(n+1)=t(n)+h;
     %dy/dt=f(t,y)
     y(n+1)=y(n)+h*f(t(n),y(n));
end
[t y]

Para dibujar en Matlab en una misma gráfica tanto los valores obtenidos como la solución exacta, se añadiría al código anterior el siguiente.

plot(t,y,'o')
hold on
%Solución exacta
syms s(u)
eqn=diff(s)==f(u,s)
cond=s(a)==y0
sol(u)=dsolve(eqn,cond)
t1=linspace(a,b,50);
plot(t1,sol(t1))
hold off
xlabel(['Metodo de Euler con N=',num2str(N),' pasos'])
Gráfica de la solución exacta y aproximada

.

Nótese que en cada paso se necesita el valor $y(t_n)$, por lo que cuanto más cercano sea el valor $y_n$ al real, $y(t_n)$, más preciso será el método. Así, para calcular $y_1$ se utiliza el valor $y_0$, para calcular $y_2$ sustituimos el valor exacto $y(t_1)$ desconocido por su valor aproximado $y_1$, para calcular $y_3$, sustituimos el valor $y(t_2)$ por su valor aproximado $y_2$, y así sucesivamente.

**** poner ejemplo de una edo de orden mayor ****

Método de Heun

Como en el caso anterior, para encontrar el valor de $y_{n+1}$ a partir de $y_n$, tendremos en cuenta que

$${y(t_{n + 1})} = {y(t_n)} +\color{blue}{ \int\limits_{{t_n}}^{{t_{n + 1}}} {f\left( {t,y\left( t \right)} \right)dt}}$$

El valor aproximado de $y(t_{n+1})$ se obtendrá utilizando la fórmula de cuadratura del trapecio para la integral, esto es,

$$\int\limits_{{t_n}}^{{t_n} + {h_n}} {g\left( t \right)dt} \approx {{{h_n}} \over 2}\left( {g\left( {{t_{_n}}} \right) + g\left( {{t_{n + 1}}} \right)} \right)$$

De esta manera teniendo en cuenta que ${y_n} \approx y\left( {{t_n}} \right)$, se tendrá que el siguiente paso se podrá caclular como $y_{n+1}$ de la forma siguiente

$${y_{n + 1}} = {y_n} + {{{h_n}} \over 2}\left[ {f\left( {{t_n},{y_n}} \right) + f\left( {{t_{n + 1}},\color{blue}{{y_{n + 1}}}} \right)} \right]$$ y considerando la fórmula de Euler para aproximar $\color{blue}{{y_{n + 1}}}$ $${y_{n + 1}} = {y_n} + {{{h_n}} \over 2}\left[ {f\left( {{t_n},{y_n}} \right) + f\left( {{t_n} + {h_n},\color{blue}{\underbrace {{y_n} + {h_n}f\left( {{t_n},{y_n}} \right)}_{Euler}}} \right)} \right]$$
El valor de $y_{n+1}$ se obtiene a partir del punto $(t_n,y_n)$ considerando la media ponderada de la pendiente en ese punto, y la pendiente en el punto que se obtendría aplicando el método de Euler, $(t_n+h_n,y_n+h_nf(t_n,y_n)))$.
Método de Heun

Este método podría escribirse de la forma siguiente:

$$\begin{aligned} & \,\,\,\,\,\,\,\,\,\,{K_{n,1}} = f\left( t_n,y_n \right) \\ & \,\,\,\,\,\,\,\,\,\,{K_{n,2}} = f\left( {t_n}+{\color{blue}{1}}\,\, h_n, y_n + {\color{magenta}{1}} h_n K_{n,1} \right) \\ & {y_{n+1}} = {y_n} + {h_n} \left[ {\color{red}{\frac{1}{2}}}\,\, K_{n,1} + {\color{red}{\frac{1}{2}}}\,\, {K_{n,2}} \right] \\ \end{aligned}$$

Este algoritmo puede asociarse al siguiente tablero

$$\begin{array} {r|r r } 0 & 0 & 0 \\ \color{blue}{1} & \color{magenta}{1} & 0 \\ \hline & \color{red} {1/2} & \color{red} {1/2} \\ \end{array}$$
Calculo del primer paso por el método de Heun (cambiar la imagen***)
Considera el siguiente PVI:
$$y' = (t-y)/2 \,\,\,\,\,, t \in [0, 3] \,\,\,\, y(0) = 1$$ Calcula por el método de Heun con 10 pasos la solución aproximada. La solución exacta para esta ecuación es $y(t) = 3e^{t/2} - 2 + t$.
En el siguiente interactivo puedes ver los cálculos para obtener la solución aproximada. En este caso $f(t,y)=\frac {t-y}{2}$, $t_0=0$, $t_f=3$, $y_0=1$ y $h=3/10$.
.
Solución aproximada por el método de Heun

A continuación se muestra el código Matlab para calcular los pasos del método de Heun.

f=@(t,y) (t-y)/2%Función
t0=0;tf=3;%Intervalo
N=30;%Pasos (N+1 puntos)
h=(tf-t0)/N; %Longitud del paso
tn=t0;t=[tn];yn=1;y=[yn];
for n=1:N %
    K1=f(tn,yn);
    K2=f(tn+h,yn+h*K1);
    yn1=yn+(K1+K2)*h/2;
    yn=yn1; tn=tn+h;
    y=[y yn];t=[t tn];
end
plot(t,y,'*')
Calcular y dibujar la solución del problema

$$y'' + 7seny + 0.1\cos t = 0\,\,\,\,\,\,t \in \left[ {0,5} \right]$$ $$y\left( 0 \right) = 0\,\,\,\,\,\,\,\,\,\,\,y'\left( 0 \right) = 1 $$

Llamando $y_1=y$,   $y_2=y'$, se tiene

$$\begin{aligned} &{y'_1} = {y_2} \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, {y'_2} = - 7seny - 0.1\cos t \\ &{y_1}\left( 0 \right) = 0\,\,\,\,\,\,\,\,\,\,\,\,\,\,{y_2}\left( 0 \right) = 1 \end{aligned} $$

En este caso,

$$ \left( \begin{aligned} {{y'_1}\left( t \right)} \\ {{y'_2}\left( t \right)} \\ \end{aligned} \right)=\left( \begin{aligned} {{y_2}} \\ {-7sen({y_1})-0.1cos(t)} \\ \end{aligned} \right)\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, \left( \begin{aligned} {{y_1}\left( 0 \right)} \\ {{y_2}\left( 0 \right)} \\ \end{aligned} \right)=\left( \begin{aligned} {{0}} \\ {1} \\ \end{aligned} \right)$$

El código para resolver la ode con matlab considerando $N=30$ pasos se muestra a continuación.

Método general de Runge Kutta

Dada el PVI

$$\begin{aligned} & y'\left( t \right) = f\left( {t,y\left( t \right)} \right)\,\,\,\,\,\,\,\,\,t \in \left[ {{t_o},{t_f}} \right] \\ & y\left( {{t_o}} \right) = {y_0} \end{aligned} $$ veamos como calcular, $y(t_{n+1})$ a partir de $y(t_n)$. Para ello, se considera la siguiente igualdad $$y\left( {{t_{n + 1}}} \right) = y\left( {{t_n}} \right)\, + \int\limits_{{t_n}}^{{t_n+h_n}} {y'\left( t \right)dt} $$ es decir,
$$y\left( {{t_{n + 1}}} \right) = y\left( {{t_n}} \right)\, +\color{blue}{ \int\limits_{{t_n}}^{{t_{n + 1}}} {f\left( {t,y\left( t \right)} \right)dt}} $$ La aproximación, se obtendrá calculando la integral de $f(t,y(t))$ utilizando una fórmula de cuadratura de $m$ nodos $$y\left( {{t_{n + 1}}} \right) \approx {y_n} + \color{blue}{{h_n}\sum\limits_{i = 1}^m {{b_i}f\left( {{t_n} + {c_i}{h_n},\color{red}{y\left( {{t_n} + {c_i}{h_n}} \right)}} \right)}} $$ donde $b_i$ son los pesos y los $c_i$ son los números entre 0 y 1 que definen los nodos $$t_{n,i}=t_n+c_i h_n$$ en el intervalo $[t_n,t_{n+1}]$.

En la imagen se representa un ejemplo con $m=6$ donde se muestran los valores $c_i$ y $t_{h,i}$.

Representación de los nodos de la forma de cuadratura con $m=6$

En la expresión anterior observamos que se precisa también calcular una aproximación de los valores $\color{red}{y(t_n+c_ih_n)}$. Considerando

$${y_{n,i}} = y\left( {{t_n} + {c_i}{h_n}} \right) = y\left( {{t_n}} \right) + \int\limits_{{t_n}}^{{t_n} + {c_i}{h_n}} {f\left( {t,y\left( t \right)} \right)dt} $$ se puede utilizar alguna fórmula de cuadratura de $m$ pasos obteniendo $$\color{red}{y\left( {{t_n} + {c_i}{h_n}} \right)} \approx {y_n} + {h_n}\sum\limits_{j = 1}^m {{a_{ij}} {\underbrace {f({t_n} + {c_j}{h_n},{y_{n,j}})}_{{K_{n,j}}} } } $$
Observad que el método de Runge-Kutta queda definido a partir de los valores $c_i$, los pesos $b_i$ y la matriz $(a_{ij})$.
Se define un método Runge-Kutta de $m$ etapas como el método numérico que dada una aproximación $y_n$ nos da una aproximación a dicha solución en el punto $t_{n+1}=t_n+h_n$ mediante las siguientes fórmulas: $$ \begin{aligned} & {t_{n,i}} = {t_n} + {\color{red} {c_i}} {h_n}    ,  1 \le i \le m\\ & \left\{ \begin{aligned} &\,\,\,{y_{n,1}} = {y_n}    ,  {K_{n,1}} = f\left( {{t_{n,1}},{y_{n,1}}} \right)\\ &\,\,\,{y_{n,i}} = {y_n} + {h_n}\sum\limits_{j = 1}^{m} {\color{green}{a_{ij}}} {K_{n,j}} , {K_{n,i}} = f\left( {{t_{n,i}},{y_{n,i}}} \right)\\&\,\,\,\,\,\,\,\,\,\,2 \le i \le m \end{aligned} \right.\\ &{y_{n + 1}} = {y_n} + {h_n}\sum\limits_{j = 1}^m {\color{blue}{b_j}}{K_{n,j}}\\ \end{aligned}$$

El método puede escribirse también la forma siguiente:

$$ \begin{aligned} & {t_{n,i}} = {t_n} + {\color{red} {c_i}} {h_n}\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,,\,\,\,\,\,\,\,\,\,\,\,1 \le i \le m\\ &\,\,\,\,\,\,\,\,\,{K_{n,1}} = f\left( {{t_{n,1}},{y_{n,1}}} \right)\\ &\,\,\,\,\,\,\,\,\, {K_{n,i}} = f\left( {t_n} + {\color{red} {c_i}} {h_n},y_n+{h_n} \sum\limits_{j = 1}^{m} {\color{green}{a_{ij}}} {K_{n,j}} \right) \,\,\,\,\,\,2 \le i \le m\\ &{y_{n + 1}} = {y_n} + {h_n}\sum\limits_{j = 1}^m {\color{blue}{b_j}}{K_{n,j}}\ \end{aligned} $$

Los métodos de Runge-Kutta pueden describirse a trávés del llamado tablero de Butcher John Charles Butcher (nacido en 1933 en Auckland, Nueva Zelanda) es un matemático reconocido por sus contribuciones a los métodos numéricos para ecuaciones diferenciales, en particular los métodos de Runge-Kutta y el "Butcher tableau". Estudió en el Auckland University College y la Universidad de Sídney, donde obtuvo su Ph.D. en 1961. En 2013, fue nombrado Oficial de la Orden del Mérito de Nueva Zelanda por sus servicios a las matemáticas. donde se pueden disponer los parámetros $A$, $b$ y $c$ de la forma siguiente:

$c$ $A$
  $b^T$

Cuando los métodos son explícitos la matriz $A$ es triangular inferior.

Vamos a ver algunos métodos de Runge -Kutta con su tablero de Butcher.

Tableros de Butcher

Método de Runge de tres pasos

En este caso, se considerará la fórmula de cuadratura de tres puntos

$$\int\limits_{{t_n}}^{{t_n} + {h_n}} {g\left( t \right)dt} \approx {{{h_n}} \over 6}\left[ {g\left( {{t_n}} \right) + 4g\left( {{t_n} + \\ {1 \over 2}{h_n}} \right) + g\left( {{t_n} + {h_n}} \right)} \right]$$

Se tendrá, $m=3$, $c_1=0$, $c_2=1/2$, $c_3=1$, $b_1=1/6$, $b_2=3/2$, $b_3=1/6$ obteniendo

$${y_{n + 1}} = {y_n} + {{{h_n}} \over 6}\left[ {f\left( {{t_n},{y_n}} \right) + 4f\left( {{t_n} + {1 \over 2}{h_n},y\left( {{t_n} + {1 \over 2}{h_n}} \right)} \right)} \right.$$ $${ + f\left( {{t_{n + 1}},y\left( {{t_{n + 1}}} \right)} \right)}$$

siendo el tablero de Butcher

$$\begin{array} {r|r r r } 0 & 0 & 0 & 0 \\ 1/2 & 1/2 & 0 & 0 \\ 1 & -1 & 2 & 0 \\ \hline & 1/6 & 4/6 & 1/6 \\ \end{array}$$

Este método se podría escribir:

$$\begin{aligned} & {t_{n,1}} = {t_n}\,\,\,,\,\,\,{t_{n,2}} = {t_n}+h_n/2\,\,\,,\,\,\,{t_{n,3}} = {t_n}+h_n \\ & \,\,\,\,\,\,\,\,\,\,{y_{n,1}} = {y_n} \\ & \,\,\,\,\,\,\,\,\,\,{y_{n,2}} = {y_n} + \frac{{h_n}}{2} f\left( {{t_{n,1}},{y_{n,1}}} \right) \\ & \,\,\,\,\,\,\,\,\,\,{y_{n,3}} = {y_n} + {h_n}\left[ {-f\left( {{t_{n,1}},{y_{n,1}}} \right) + 2f\left( {{t_{n,2}},{y_{n,2}}} \right)} \right] \\ & {y_n} = {y_n} + {{{h_n}} \over 6}\left[ {f\left( {{t_{n,1}},{y_{n,1}}} \right) + 4f\left( {{t_{n,2}},{y_{n,2}}} \right) + f\left( {{t_{n,3}},{y_{n,3}}} \right)} \right] \end{aligned}$$

También podría escribirse de la forma siguiente.

$$\begin{aligned} & \,\,\,\,\,\,\,\,\,\,{K_{n,1}} = f\left( t_{n},y_{n} \right) \\ & \,\,\,\,\,\,\,\,\,\,{K_{n,2}} = f\left(t_n+h_n/2, y_n + \frac{{h_n}}{2} K_{n,1} \right) \\ & \,\,\,\,\,\,\,\,\,\,{K_{n,3}} =f\left (t_n+h_n, {y_n} + {h_n}\left[ -K_{n,1}+2K_{n,2} \right] \right)\\ & {y_{n+1}} = {y_n} + {{{h_n}} \over 6}\left[ K_{n,1} + 4K_{n,2} + K_{n,3} \right] \end{aligned}$$

Otros métodos de Runge-Kutta

Se incluyen los correspondientes tableros de Butcher de algunos métodos de Runge-Kutta.

Método de Euler

$$\begin{array} {r|r } 0 & 0 \\ \hline & 1 \\ \end{array}$$

Método de Heun

$$\begin{array} {r|r r } 0 & 0 & 0 \\ 1 & 1 & 0 \\ \hline & 1/2 & 2/2 \\ \end{array}$$

Método de Kutta de Tres Etapas

$$\begin{array} {r|r r } 0 & 0 & 0 & 0 \\ 1/2 & 1/2 & 0 & 0 \\ 1 & -1 & 2 & 0 \\ \hline & 1/6 & 4/6 & 1/6 \\ \end{array}$$
Método de Heun de Tres Etapas $$\begin{array} {r|r r r } 0 & 0 & 0 & 0 \\ 1/3 & 1/3 & 0 & 0 \\ 2/3 & 0 & 2/3 & 0 \\ \hline & 1/4 & 0 & 3/4 \\ \end{array}$$ Método de Runge-Kutta Clasico $$\begin{array} {r|r r r r } 0 & 0 & 0 & 0 & 0 \\ 1/2 & 1/2 & 0 & 0 & 0 \\ 1/2 & 0 & 1/2 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 \\ \hline & 1/6 & 2/6 & 2/6 & 1/6\\ \end{array}$$
Método de Runge-Kutta asociado a tableros
Escribir el algoritmo del método Runge-Kutta explícito de tres etapas cuyo tablero tiene la forma $$\begin{array} {r|r r } 0 & 0 & 0 & 0 \\ 1/2 & 1/2 & 0 & 0 \\ 3/4 & 0 & 3/4 & 0 \\ \hline & 2/9 & 3/9 & 4/9 \\ \end{array}$$ Dado el PVI, $$y'(t)=t+e^{y(t)}, y(0)=0$$ aproximar mediante dicho método, la solución en el tiempo $t=0.4$ tomando como paso $h=0.2$:

El método dado por la tabla se corresponde con el siguiente algoritmo

$$\begin{aligned} & K_1=f(t_n,y_n)\\ & K_2=f(t_n+\frac{1}{2}h,y_n+\frac{1}{2} h K_1)\\ & K_3=f(t_n+\frac{3}{4}h,y_n+\frac{3}{4} h K_2)\\ \end{aligned}$$ $$y_{n+1}=y_n+\frac{h}{9}(2K_1+3K_2+4K_3)$$

Para aproximar la solución del PVI del enunciado en $t=0.4$, partiendo de $t_0=0$ e $y_0=0$ con paso $h=0.2$, siendo $f(t,y)=t+e^y$, hemos de realizar dos pasos.

Con el siguiente código Matlab/Octave se pueden realizar los cálculos.

%Definición de la función
f=@(t,y) t+exp(y)
%Valores h=0.2;t0=0;y0=0;
%Paso 1
K1=f(t0,y0)
K2=f(t0+h/2,y0+h/2*K1)
K3=f(t0+3*h/4,y0+3*h/4*K2)
y1=y0+h/9*(2*K1+3*K2+4*K3)
%Paso 2
t1=t0+h;
K1=f(t1,y1)
K2=f(t1+h/2,y1+h/2*K1)
k3=f(t1+3*h/4,y1+3*h/4*K2)
y2=y1+h/9*(2*K1+3*K2+4*k3)

En el siguiente interactivo se calcula los dos pasos con otros métodos de Runge-Kutta.

Método de Runge-Kutta de 3 pasos
Resolver el problema $y'=yt^3-1.5y$ con la condición inicial $y(0)=1$ en el intervalo $[0,1.8]$ considerando 9 pasos en el método Runge-Kutta clásico (de cuarto orden): $$\begin{array} {r|r r } 0 & 0 & 0 & 0 & 0 \\ 1/2 & 1/2 & 0 & 0 & 0 \\ 1/2 & 0 & 1/2 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 \\ \hline & 1/6 & 2/6 & 2/6 & 1/6\\ \end{array}$$
En la siguiente escena se visualiza, para distintos métodos de Runge-Kutta, incluido el clásico de cuarto orden, la integral del problema. En este caso puede obtenerse la solución exacta que es la función $y(t)={e^{{{t\left( {{t^3} - 6} \right)} \over 4}}}$.
Método de Runge-Kutta de 4 pasos

Escribimos el código Matlab para resolver el problema definiendo los valores $K_i$ correspondientes al tablero.

Modificamos el código para definir los valores $K_i$ a través de las matrices A,B y C que definen el tablero.

Consideremos el problema plano de dos cuerpos puntuales que se mueven atraídos según la ley de la gravitación universal de Newton. En unidades apropiadas, las ecuaciones del movimiento adoptan la forma siguiente: $$\begin{aligned} & y_1' = {y_3} \\ & y_2' = {y_4} \\ & y_3' = - {{{y_1}} \over {{{\left( {{y_1}^2 + y_2^2} \right)}^{3/2}}}}\\ & y_4' = - {{{y_2}} \over {{{\left( {{y_1}^2 + y_2^2} \right)}^{3/2}}}} \end{aligned}$$ donde $(y_1,y_2)$ son las coordenadas de uno de los cuerpos (satélite) en un sistema con origen en el otro cuerpo central. Los valores $(y_3,y_4)$ representan el vector velocidad del cuerpo satélite.

Utiliza el método de Runge-Kutta clásico para encontrar la solución con las condiciones iniciales siguientes

$$y_1(0) = 1,\,\,y_2(0) =1,\,\,\, y_3(0) = 0,\,\,\,y_4(0) = 1$$
Ségún la primera ley de Kepler: ”los planetas describen ́orbitas eĺıpticas alrededor del sol, que ocupa uno de los focos de esa elipse”. En general, las soluciones del problema de dos cuerpos son cónicas (pueden ser elipses, paŕabolas o hiṕerbolas), pero si se toman las condiciones iniciales siguientes: $$y_1(0) = 1,\,\,y_2(0) = y_3(0) = 0,\,\,\,y_4(0) = 1$$ la solución es una circunferencia de centro el origen radio 1 y con periodo $2\pi$.

Se muestra a continuación el código Matlab/Octave para resolver el problema.El tablero de Butcher para el método de Runge-Kutta clásico de 4 pasos es

$$\begin{array} {r|r r r r } 0 & 0 & 0 & 0 & 0 \\ 1/2 & 1/2 & 0 & 0 & 0 \\ 1/2 & 0 & 1/2 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 \\ \hline & 1/6 & 2/6 & 2/6 & 1/6\\ \end{array}$$

En la siguiente imagen se muestra la trayectoria del satélite una vez resuelto el problema.

Para resolver este ejercicio de forma alternativa, vamos a utilizar dos funciones creadas por el profesor Eduardo Casas (ficheros Matlab).
  • la función mirkf4c.m para definir los parámetros del método de Runge-kutta clásico: a, b, c
  • la función pasorkf.m para definir un paso del método con los parámetros: f, tn, hn, yn, a, b, c

Utilizándolas, el código Matlab/Octave para encontrar la solución se muestra a continuación.

%Definición de la función
f=@(t,y) [y(3);y(4);-y(1)/(y(1)^2+y(2)^2)^(3/2);-y(2)/(y(1)^2+y(2)^2)^(3/2)];
%Datos PVI
t0=0;tf=8*pi;
y0=[1;1;0;1];N=100;hn=tf/N;
%Método Runge Kutta
[a,b,c]=mirkf4c;
for iter=1:N
   [yn1]=pasorkf(f,tn,hn,yn,a,b,c);
   tn=tn+hn;yn=yn1;
   t=[t tn];y=[y yn];
end
%Representación de la solución
plot(y(1,:),y(2,:),'r')
axis equal

Error de los métodos de Runge-Kutta

Veamos a continuación cómo analizar el error en los métodos de Runge-Kutta. Observemos en primer lugar que los métodos pueden escribirse de la forma $${y_{n + 1}} = {y_n} + {h_n}{\Phi _f}\left( {{t_n},{y_n},{h_n}} \right)\,\,\,\,\,\,\,0 \le n \le N - 1$$ Se definen a continuación dos tipos de errores.

El error local del método en el paso $n$ es la cantidad $${\varepsilon_n} = y\left( {{t_n} + {h_n}} \right) - \left[ {y\left( {{t_n}} \right) + {h_n}{\Phi _f}\left( {{t_n},y\left( {{t_n}} \right),{h_n}} \right)} \right]$$ El error global del método en el paso $n$ es la cantidad $${e _n} = y\left( {{t_n} + {h_n}} \right) - \left[ {{y_n} + {h_n}{\Phi _f}\left( {{t_n},{y_n},{h_n}} \right)} \right]$$ Diremos que el método es de orden $p$ si para toda función $f$ definiendo la ecuación diferencial se tiene que $||{\varepsilon _n}||=O(h_n^{p + 1})$, es decir, si existe $C>0$ de forma que $||{\varepsilon_n}|| \le C h_n^{p+1}$.
Observa que:
  1. El error local es que se comete al dar un paso partiendo del valor exacto de la solución en el instante $t_n$.
  2. El error global es el que se comete al dar un paso a partir de la aproximación de ${y_n} \approx y(t_n)$.

Puede demostrarse que si el método es de orden $p$, entonces el error global es estimado por la siguiente expresión:

$$\left\| {{e _n}} \right\| \le {C \over A}\left[ {{e^{\left( {{t_n} - {t_o}} \right)}} - 1} \right]{h^p}$$

donde $h = \max {h_n}$ y $A$ es la constante positiva que existe, al ser $f$ derivable, cumpliendo

$$\left\| {{\phi _f}\left( {t,y,h} \right) - {\phi _f}\left( {t,z,h} \right)} \right\| \le A\left\| {y - z} \right\|$$

Para obtener el orden de un método en términos de los coeficientes del mismo, Butcher estableció las condiciones que se deberían cumplir. Tomando el vector de $m$ componentes $e=(1,1,...,1)^T$ se debe exigir a todos los métodos que $Ae=c$ y además, a continuación, se indican las condiciones que se deben cumplir para los tres primeros órdenes.

  • Orden 1. $b^Te=1$
  • Orden 2. La anterior más la condición $b^Tc=1/2$
  • Orden 3. La anterior más la condición $b^Tc^2=1/3$, $b^TAc=1/6$
Puede comprobarse que el método de Euler es de orden 1, los de Heun de 2 y 3 etapas poseen, respectivamente, orden 2 y 3. El método de Kutta de 3 etapas es de orden 3 y el de Runge-Kutta clásico de orden 4.

Métodos de Runge Kutta encajados

Los métodos vistos hasta este momento tienen una dependencia directa con el paso $h$ considerado, por lo que su eleccíon puede condicionar enormemente el funcionamiento del propio ḿetodo. Nos planteamos en este apartado ćomo determinar cúal es el paso de tiempo $h$ mas indicado analizando los llamados métodos encajados.

Estos ḿetodos consisten en una variación del paso $h$ a partir del control de los errores de aproximacion obtenidos a medida que se calculan las diferentes iteraciones del ḿetodo.

Así, si llegado el momento, el error de aproximación supera la tolerancia establecida para ́este, el método varía el paso para tener una mejor aproximacion. Por el contrario, si el error es menor que la tolerancia, el ḿetodo amplía el paso con el fin de acelerar el rendimiento.

Estos métodos emplean dos fórmulas de diferente orden, que comparten evaluaciones intermedias de la función derivada, para calcular dos aproximaciones del siguiente paso: una más precisa y otra menos precisa. La diferencia entre ambas proporciona una estimación del error, que puede usarse para ajustar automáticamente el tamaño del paso en los métodos de paso variable, optimizando el equilibrio entre precisión y eficiencia en la solución.

Se considera entonces dos métodos: $${y_{n + 1}} = {y_n} + {h_n}{\Phi _f}\left( {{t_n},{y_n},{h_n}} \right)\,\,\,\,\,\,\,\,\,\,orden\,\,p$$ $${\widehat y_{n + 1}} = {y_n} + {h_n}{\psi _f}\left( {{t_n},{y_n},{h_n}} \right)\,\,\,\,\,\,\,\,\,\,orden\,\,q > p$$

donde las matrices $A$ y $C$ del método de orden $p$ están encajados en $\widehat A$ y $\widehat c$ de orden $q > p$.

Fehlberg construyó pares de métodos encajados de orden 4 y 5. En este método los parametros $A$ y $c$ del ḿetodo de orden 4 son coincidentes con las 5 primeras filas de los paŕametros $\widehat A$ y $\widehat c$ del método de orden 5. Por lo tanto, los valores $K_{n,i}$ para $1 \le i \le 5$ son coincidentes para ambos metodos. Esto simplifica notablemente el numero de cálculos, particularmente el ńumero de evaluaciones de la función $f$.

Runge-Kutta-Felhberg 4-5 #1 $$\begin{array} {r|r r r r r} 0 & & & & & \\ 2/9 & 2/9 & & & & \\ 1/3 & 1/12 & 1/4 & & & \\ 3/4 & 69/128 & -243/128 & 135/64 & & \\ 1 & -17/12 & 27/4 & -27/5 & 16/15 & \\ \hline orden \,\,4 & 1/9 & 0 & 9/20 & 16/45 & 1/12\\ \end{array}$$ $$\begin{array} {r|r r r r r} 0 & & & & & \\ 2/9 & 2/9 & & & & \\ 1/3 & 1/12 & 1/4 & & & \\ 3/4 & 69/128 & -243/128 & 135/64 & & \\ 1 & -17/12 & 27/4 & -27/5 & 16/15 & \\ 5/6 & 65/432 & -5/16 & 13/16 & 4/27 & 5/144 & \\ \hline orden \,\,5 & 47/450 & 0 & 12/25 & 32/225 & 1/30 & 6/25\\ \end{array}$$

Para pasar de $t_n$ a $t_{n+1}$ aplicamos el método de orden 5 para obtener $\widehat y_{n+1}$. Para hallar una cota del error local de aproximacion de $y(t_{n+1})$ se aplica el método de orden 4 para obtener $y_{n+1}$. Una estimación del error cometido es $$\left\| {{{\widehat y}_{n + 1}} - {y_{n+1}}} \right\|$$

Además, si $${y_{n + 1}} = {y_n} + {h_n}\sum\limits_{j = 1}^m {{b_j}{K_{n,j}}} $$ $${\widehat y_{n + 1}} = {y_n} + {h_n}\sum\limits_{j = 1}^{\widehat m} {{{\widehat b}_j}{K_{n,j}}} \,\,\,\,\,\,\,\,\,\,\,\widehat m > m$$se tiene que

$$\left\| {{{\widehat y}_{n + 1}} - {y_{n+1}}} \right\| = {h_n}\sum\limits_{j = 1}^{\widehat m} {\left( {{{\widehat b}_j} - {b_j}} \right){K_{n,j}}} $$

por lo que basta conocer los parámetros del método de orden $q$ y los estimadores (${{{\widehat b}_j} - {b_j}})$ para calcular $$e_n=||{\widehat y_{n + 1}}-y_{n+1}||$$

La información que se precisa se incluye en el siguiente tablero.

$$ {\begin{array} {r|r r r r r} 0 & & & & & \\ 2/9 & 2/9 & & & & \\ 1/3 & 1/12 & 1/4 & & & \\ 3/4 & 69/128 & -243/128 & 135/64 & & \\ 1 & -17/12 & 27/4 & -27/5 & 16/15 & \\ 5/6 & 65/432 & -5/16 & 13/16 & 4/27 & 5/144 & \\ \hline orden 5 & 47/450 & 0 & 12/25 & 32/225 & 1/30 & 6/25\\ estimadores & 1/150 & 0 & -3/100 & 16/75 & 1/20 & -6/25\\ \end{array}}$$

La función rkf45a.m desarrollada por Eduardo Casas (ficheros Matlab) devuelve los valores $A$, $b$, $c$, $est$ para el par de métodos encajados de orden 4 y 5 del método de Runge-Kutta-Fehlberg #1.


Runge-Kutta-Felhberg 4-5 #2

El siguiente tablero describe otro método Runge-Kutta-Fehlberg donde también se encajan también un método de orden 4 y otro de orden 5.

$$ {\begin{array} {r|r r r r r} 0 & & & & & \\ 1/4 & 1/4 & & & & \\ 3/8 & 3/32 & 9/32 & & & \\ 12/13 & 1932/2197 & -7200/2197 & 7296/2197 & & \\ 1 & 439/216 & -8 & 3680/513 & -845/4104 & \\ 1/2 & -8/27 & 2 & -3544/2565 & 1859/4104 & -11/40 & \\ \hline orden 5 & 16/135 & 0 & 6656/12825 & 28561/56430 & -9/50 & 2/55\\ estimadores & -1/360 & 0 & 128/4275 & 2197/75240 & -1/50 & -2/55\\ \end{array}}$$
La función rkf45b.m desarrollada por Educardo Casas devuelve los valores $A$, $b$, $c$, $est$ para el par de métodos encajados de orden 4 y 5 del método de Runge-Kutta-Fehlberg #2.

La tolerancia deseada se mide entre el error absoluto $e_a$ y el error relativo $e_r$. Dado que el error de $q$ es menor que el de $p$, se considera para la tolerancia el del método de orden

$$TOL=e_a+e_r||{\hat y_{n + 1}}||$$

Con todo lo anterior, a partir de dos métodos encajados de órdenes $p$ y $q$ con $q <q$, utilizando los estimadores, $est$, el algoritmo que daría un paso de método es el siguiente.

$$\left\{ \begin{aligned} & {t_{n,i}} = {t_n} + {c_i} {h_n}\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,,\,\,\,\,\,\,\,\,\,\,\,1 \le i \le {\widehat m}\\ &\,\,\,\,\,\,\,\,\,{K_{n,1}} = f\left( {{t_{n,1}},{y_{n,1}}} \right)\\ &\,\,\,\,\,\,\,\,\, {K_{n,i}} = f\left( {t_n} + {c_i} {h_n},y_n+{h_n} \sum\limits_{j = 1}^{i-1} {a_{ij} } {K_{n,j}} \right) \,\,\,\,\,\,2 \le i \le {\widehat m}\\ &{\hat y_{n + 1}} = {y_n} + {h_n}\sum\limits_{j = 1}^{\widehat m} {{b_j}{K_{n,j}}} {\rm{ }}\\ &{e _n} = {h_n}\left\| {\sum\limits_{j = 1}^{{\widehat m}} {es{t_j}{K_{n,j}}} } \right\| \end{aligned} \right.$$

La función rkf.m desarrollada por Eduardo Casas (ficheros Matlab) implementa el algoritmo. Para ello necesita:

  • f: nombre de la función que define la ecuación diferencial
  • tn: el instante del que se parte
  • hn: el paso que se va a dar
  • yn: la aproximación de la solución conocida en el instante $t_n$
  • a,b,c,est: los parámetros del algorítmo A,b,c y los estimadores

Esta función devuelve

  • yn1: la aproximación de $y(t_{n+1})$ con $t_{n+1}=t_n+h_n$
  • en: una estimación del error $e_n=||y(t_{n+1})-y_{n+1}||$

Antes de aceptar el valor obtenido, se debe comprobar si el error es menor que la tolerancia. Si es menor se acepta el paso y si es mayor se rechaza. En cualquier paso se debe proceder con la estrategia de control de paso siguiente:

  1. Elección de $h_0$

    $${h_o} = \max \left\{ {e_a + e_r{{\left\| {{y_o}} \right\|}^{{1 \over {p + 1}}}},{\rm{h_{min}}}} \right\}$$ donde podemos fijar por ejemplo $${h_{\min }} = {{{t_f} - {t_o}} \over {{{10}^6}}}$$

  2. Criterio de aceptación del paso. Se acepta si

    $$e_n = \left\| {{{\hat y}_{n + 1}} - {y_{n + 1}}} \right\|{\rm{ < }}\,\,TOL = {e_a} + {e_r}||{\hat y_{n + 1}}||$$

  3. Reducción del paso tras un fallo. Si $e_n>TOL$ se debe reducir $h_n$ con un factor de reduccion $r_n<1$. Se considera $${r_n} = 0.9{\left( {{TOL} \over {e_{n}} } \right)^{{1 \over {p + 1}}}}$$ y como medida de seguridad se reducirá el paso al menos a la mitad, por lo que se considerará $${h_n} \to \min \left\{ {{r_n},{r_{\min }}} \right\}{h_n}$$ Se toma un valor entre 0.1 y 0.5, tomaremos $r_{min}=0.5$
  1. Previsión del paso siguiente. Si ha habido un fallo del paso en la determinación de una de las dos últimas aproximaciones de la solución, entonces se toma $r_{max}=1$, en caso contrario se fija $r_{max}=5$.

    Se calcula $r_n$ de la forma indicada en el punto 3 y se toma $${h_{n + 1}} = \left\{ \begin{aligned} & {h_n}\,\,si\,\,\,{r_n} \in \left[ {1,\,\,1.1} \right]\\ & \min \left\{ {{r_n},{r_{\max }}} \right\}\,\text{en otro caso} \end{aligned} \right.$$ En el caso de que el paso proporcione un error inferior a la tolerancia, tenemos que analizar la posibilidad de incrementar este paso para acelerar la integración. El factor de incremento del paso nunca será mayor que $r_{max}=5$, esto se hace para evitar fallos.

Ejercicio 6 propuesto del
Ejercicio 3 propuesto del tema 5.
Ejercicio 7 propuesto del tema 5.

Problemas de contorno. Método de tiro

En este apartado vamos a estudiar el problema siguiente:

$$\begin{aligned} & y''\left( t \right) = f\left( {t,y\left( t \right),y'\left( t \right)} \right)\,\,\,\,\,\,\,\,t \in \left[ {{t_o},{t_f}} \right] \cr & y\left( {{t_o}} \right) = {y_o}\,\,\,\,\,,\,\,\,\,y\left( {{t_f}} \right) = {y_f} \end{aligned}$$

En este caso no se puede aplicar el método de Runge-Kutta para integrar esta ecuación porque no tenemos $y'(t_0)$. Lo que haremos será resolver el siguiente problema:

$$(P) \,\,\,\,\left\{ \begin{aligned} & y{'_1}\left( t \right) = {y_2}\left( t \right) \\ & y{'_2}\left( t \right) = f\left( {t,{y_1}\left( t \right),{y_2}\left( t \right)} \right)\,\,\,\,\,\,\,t \in \left[ {{t_o},{t_f}} \right] \\ & y_1\left( {{t_o}} \right) = {y_o}\,\,\,\,\,,\,\,\,\,y_2\left( {{t_o}} \right) = x \end{aligned} \right.$$ y buscar el valor de $x$ de forma que la solución $y_x=(y_{x,1},y_{x_2})^T$ cumpla que $y_{x,1}$ para el valor de $t=t_f$ sea $y_f$.

Para resolver este problema utilizaremos la función oderkf.m desarrollada por Eduardo Casas (ficheros Matlab que resuelve el problema de valor inicial (P) para un valor de $x$ dado.

Esta función tiene la siguiente sintáxis:

$$[t,y]=oderkf(f,t0,y0,tf,ea,er)$$ donde:
  • $e_a=10^{-14}$, $e_r=10^-12$.
  • $f$ es el nombre del fichero .m que define a la función diferencial
  • $t$ es el vector fila de instantes $t_n$ donde se ha calculado la aproximación de la solución de (P).
  • $y$ es el vector solución que tiene dos filas $y_{x,1}$ para $y_1$ e $y_{x,2}$ para $y_2$.

Para encontrar el valor $x$ se debe resolver, por el método de la secante, el valor de $x$ que cumple que la solución del problema correspondiente tiene en $t_f$ el valor dado $y_f$. Se construye la función g a la cual aplicar el método de la secante.

function [gx,tx,yx]=g(x)
 f=....;
 to=. . .;
 yo=[y0;x];
 tf=. . .;
 ea=10^−14;
 er=10^−12;
 [tx,yx]=oderkf(f,to,yo,tf,ea,er);
 %la condición es y(tf)=yf;
 gx=yx(1,end)-yf;
end

Veamos el procedimiento en un ejemplo.

Calcular la solución de $$t^3y''=(y-t*y')^2$$ $$y(1)=0,\,\,\,y(2)=2 \,\,\,\,\,\,\,\,t \in \left[ {1,2 } \right]$$

Paso 1. Definición de la ecuación diferencial en la función en el fichero odeEj.m

function z=odeEj(t,y)
z=[y(2);1/t^3*(y(1)-t*y(2))^2];

Paso 2. Definición de la función $fe$ a la que aplicar el método de la secante.

function [fx,tx,yx]=fe(x)
 f='odeEj';
 to=1;
 tf=2;
 yo=[0;x];
 ea=10^-14;
 er=10^-12;
 [tx yx]=oderkf(f,to,yo,tf,ea,er);
 fx=yx(1,end)-2;
end

Paso 3. Aplicamos método de la secante a la función $fe(x)$ para hallar $x$ de forma que $fe(x)=0$.

El método puede adaptarse fácilmente al siguiente ejemplo.

Calcular la solución de $$t^3y''=(y-t*y')^2$$ $$y(1)=0,\,\,\,y'(2)=2 \,\,\,\,\,\,\,\,t \in \left[ {1,2} \right]$$

Paso 1. Definición de la ecuación diferencial en la función en el fichero odeEj.m

function z=odeEj(t,y)
z=[y(2);1/t^3*(y(1)-t*y(2))^2];

Paso 2. Definición de la función $fe$ a la que aplicar el método de la secante.

function [fx,tx,yx]=fe(x)
 f='odeEj';
 to=1;
 tf=2;
 yo=[0;x];
 ea=10^-14;
 er=10^-12;
 [tx yx]=oderkf(f,to,yo,tf,ea,er);
 fx=yx(2,end)-2;
end

Paso 3. Aplicamos método de la secante a la función $fe(x)$ para hallar $x$ de forma que $fe(x)=0$.

Ejercicio 2.1 propuesto del tema 5.

Paso 1. Definición de la ecuación diferencial en la función en el fichero ode.m

function z=ode(t,y)
z=[y(2);t*y(1)^3-1-sin(t)];

Paso 2. Definición de la función $g$ a la que aplicar el método de la secante.

function [fx,tx,yx]=g(x)
  f='ode';
  to=0;
  tf=pi/2;
  yo=[0;x];
  ea=10^-14;
  er=10^-12;
  [tx yx]=oderkf(f,to,yo,tf,ea,er);
  fx=yx(1,end)-1;
end

Paso 3. Aplicamos método de la secante a la función $g(x)$ para hallar $x$ de forma que $g(x)=0$.

Resolver el siguiente problema:

$$\begin{aligned} & y''\left( t \right) = sen\left( {y\left( t \right)} \right) + 0.01\,t\,y\left( t \right) + 0.1\,z\left( t \right)\\ & z'\left( t \right) = sen\left( {y\left( t \right) + z\left( t \right)} \right) + w\left( t \right)\\ & w'\left( t \right) = \cos \left( {y\left( t \right) + z\left( t \right) + w\left( t \right)} \right)\\ & y\left( 0 \right) = 0 = z\left( 0 \right),\,\,\,\,\,w\left( 0 \right) = 1\,\,\,\,\,\,\,\,t \in \left[ {0,\pi } \right]\\ & y\left( \pi \right) + z\left( \pi \right) + w\left( \pi \right) = 0 \end{aligned}$$
Consideramos $${y_1} = y,\,\,\,{y_2} = y',\,\,\,\,\,{y_3} = z,\,\,\,\,{y_4} = w$$ pudiendo escribirse $$\begin{aligned} & y'_1 = {y_2}\\ & y'_2 = sen\left( {{y_1}} \right) + 0.01\,\, t\,\, {y_1} + 0.1\,\, {y_3}\\ & y'_3\left( t \right) = sen\left( {{y_1} + {y_3}} \right) + {y_4}\\ & y'_4\left( t \right) = \cos \left( {{y_1} + {y_3} + {y_4}} \right)\\ & {y_1}\left( 0 \right) = 0 = {y_3}\left( 0 \right),\,\,\,\,\,{y_4}\left( 0 \right) = 1\,\,,\,\,\,\,\,\,{y_2}\left( 0 \right) = x \end{aligned}$$ y se buscará x para que $${y_{x,1}}\left( \pi \right) + {y_{x,3}}\left( \pi \right)+ {y_{x,4}}\left( \pi \right) = 0$$ La función que definirá la ecuación diferencial será
function z=ode(t,x)
  z=[y(2);sin(y(1))+0.01*t*y(1)+0.1*y(3);
  sin(y(1)+y(3))+y(4);cos(y(1)+y(3)+y(4)]
end
En la función g habrá que considerar $$yo = [0;x;0;1]$$ $$fx = {y_x}\left( {1,end} \right) + {y_x}\left( {3,end} \right) + {y_x}\left( {4,end} \right)$$

Autoevaluación

**** Incluir preguntas del tema ****

Actividad de autoevaluación

Ejercicios

Resolver el problema de valor inicial: \[ \frac{dy}{dt} = -0.7y + t, \quad y(1) = 1, \quad t \in [1,2]. \] Utiliza el método de Euler con 10 pasos y representa la solución con MATLAB.
Resuelve el siguiente problema de valor inicial con los métodos de Euler, Heun, y Runge-Kutta de cuarto orden, utilizando 30 pasos: \[ y'' + 7\sin(y) + 0.1\cos(t) = 0, \quad y(0) = 0, \, y'(0) = 1, \quad t \in [0,5]. \]
Implementa el método de Runge-Kutta explícito de tres etapas (tablero de Butcher) para resolver: \[ \frac{dy}{dt} = t + e^t, \quad y(0) = 0, \quad t = 0.4, \quad h = 0.1. \]
Utilizando el método de Runge-Kutta clásico de cuarto orden, integra el problema: \[ \frac{dy}{dt} = -1.5yt, \quad y(0) = 1, \quad t \in [0,1.9], \] utilizando 5 pasos.
Resolver el sistema de ecuaciones diferenciales que describe el movimiento de dos cuerpos puntuales bajo la ley de gravitación universal: \[ \begin{aligned} y_1' &= y_3, \quad y_2' = y_4, \\ y_3' &= -\frac{y_1}{(y_1^2 + y_2^2)^{3/2}}, \quad y_4' = -\frac{y_2}{(y_1^2 + y_2^2)^{3/2}}. \end{aligned} \] Utiliza el método de Runge-Kutta clásico con 20 pasos en el intervalo \( [0, 8\pi] \).
Considera las oscilaciones amortiguadas descritas por la ecuación: \[ x'' + 2\gamma x' + \omega_0^2x = 0, \quad x(0) = 0, \, x'(0) = 10, \quad \omega_0 = 2, \, \gamma = 0.5, \quad t \in [0,3]. \] Resolver utilizando MATLAB y representar las oscilaciones.
Resuelve el siguiente sistema que describe la competencia entre dos especies por un mismo recurso: \[ \begin{aligned} y_1' &= y_1(4 - 0.0003y_1 - 0.0004y_2), \\ y_2' &= y_2(2 - 0.0002y_1 - 0.0001y_2), \end{aligned} \] con \( y_1(0) = y_2(0) = 10000 \) y \( t \in [0,4] \), utilizando el método de Runge-Kutta de cuarto orden.
Resolver el siguiente problema de valor inicial utilizando el método Runge-Kutta-Fehlberg con tolerancias absolutas y relativas: \[ \begin{aligned} y'' &= -0.65y' + 0.1z - 0.5\cos(t), \quad z'' = -\sin(t) + 0.1z + w, \\ w'' &= \cos(t) + 0.1w, \quad t \in [0,10], \\ y(0) &= 1, \, y'(0) = 0, \, z(0) = 0, \, z'(0) = 1, \, w(0) = 0. \end{aligned} \]
Resolver con el método de Runge-Kutta-Fehlberg: \[ y''' - y'' - 5y' - 3e^x = 0, \quad y(0) = 1, \, y'(0) = 0, \, y''(0) = -1, \quad t \in [0,2], \] con tolerancia \( \varepsilon_a = 10^{-12} \), \( \varepsilon_r = 10^{-10} \).
Resolver el siguiente sistema de ecuaciones: \[ \begin{aligned} y_1' &= y_2, \\ y_2' &= -\sin(y_1), \end{aligned} \] utilizando el método de Runge-Kutta con \( h = 0.1 \) y \( t \in [0, 2\pi] \).
Resolver el problema de valor inicial: \[ \frac{dy}{dt} = -10y + \sin(t), \quad y(0) = 1, \quad t \in [0, 2], \] usando el método de Euler implícito.
Resuelve el sistema de ecuaciones diferenciales: \[ \begin{aligned} x' &= y + t^2, \\ y' &= x - t, \end{aligned} \] con \( t \in [0, 5] \), utilizando un método implícito y comparando con Runge-Kutta clásico.
Resolver: \[ \frac{d^2y}{dt^2} + \frac{dy}{dt} + 3y = 2e^{-t}, \quad y(0) = 0, \, y'(0) = 1, \quad t \in [0, 10], \] utilizando el método de Euler explícito y comparar los resultados con Runge-Kutta.
Implementa un método predictor-corrector para resolver: \[ \frac{dy}{dt} = y^2 - t, \quad y(0) = 1, \quad t \in [0, 5]. \]
RESUMEN

En este capítulo se trata la integración numérica de ecuaciones diferenciales, una herramienta fundamental en la resolución de problemas matemáticos y científicos que no tienen solución analítica. Este capítulo presenta diversas técnicas para resolver problemas de valor inicial mediante métodos numéricos y analiza sus características, errores y aplicabilidad.

Los contenidos principales del capítulo son los siguientes.


  1. Formulación del problema de valor inicial

    Se introduce el concepto de ecuaciones diferenciales ordinarias (EDO) y su resolución a través de condiciones iniciales dadas, planteando el problema como una base para aplicar métodos numéricos.

  2. Existencia y unicidad de soluciones

    Explicación de las condiciones bajo las cuales las soluciones de las EDO están garantizadas y son únicas, un punto clave para entender la validez de los métodos numéricos.

  3. Método de Euler

    Este es el método numérico más básico para resolver EDO. Se describe su implementación, ventajas y desventajas, además de discutir el error global acumulado.

  1. Método de Heun

    Una mejora del método de Euler que utiliza una corrección iterativa para aumentar la precisión. También conocido como método del trapecio, es un ejemplo de método de orden 2.

  2. Métodos de Runge-Kutta

    Se analizan los métodos de mayor precisión basados en evaluaciones de la pendiente intermedia, destacando el método de cuarto orden como estándar debido a su equilibrio entre precisión y esfuerzo computacional.

  1. Error en los métodos de Runge-Kutta

    Se detalla cómo se evalúan y minimizan los errores locales y globales en los métodos Runge-Kutta, incluyendo estrategias para ajustar el tamaño del paso.

  2. Métodos de Runge-Kutta encajados

    Introducción a los métodos adaptativos que ajustan dinámicamente el tamaño del paso en función de una estimación del error, optimizando la eficiencia y precisión del cálculo.

  3. Problemas de contorno y método de tiro

    Este apartado aborda problemas de contorno, en los cuales las condiciones iniciales y finales están especificadas. Se introduce el método de tiro como técnica para aproximar soluciones.



Capítulo

Programación lineal

Introduccion

La optimización es una disciplina matemática y computacional que busca identificar la mejor solución posible para un problema, maximizando o minimizando una función objetivo dentro de un conjunto de condiciones o restricciones. Su importancia radica en su amplia aplicabilidad en diversos campos como la ingeniería, la economía, la logística y la inteligencia artificial, donde es esencial mejorar procesos, reducir costos, etc. Desde problemas simples, como encontrar la ruta más corta entre dos puntos, hasta desafíos complejos en el diseño de sistemas, la optimización proporciona herramientas y métodos que permiten tomar decisiones óptimas en escenarios con recursos limitados.

La optimización y los métodos numéricos están estrechamente relacionados, ya que muchos problemas de optimización requieren soluciones que no pueden encontrarse de manera analítica y, por lo tanto, dependen de enfoques numéricos. Los métodos numéricos proporcionan algoritmos para aproximar soluciones óptimas en problemas donde la función objetivo es compleja, no lineal o involucra grandes conjuntos de datos.

Definición de Optimización

La optimización es una rama de las matemáticas y la ingeniería que se centra en encontrar la mejor solución posible para un problema, de acuerdo con un conjunto de criterios o restricciones. Su objetivo principal es maximizar o minimizar una función objetivo, como el costo, el tiempo o el rendimiento.

Clasificación de problemas de optimización

Según la Naturaleza del Objetivo
  • Optimización de máximo: Buscar el valor más alto de la función objetivo.
  • Optimización de mínimo: Buscar el valor más bajo de la función objetivo.
Según el Tipo de Variables
  • Continuas: Las variables pueden tomar cualquier valor dentro de un rango.
  • Discretas: Las variables solo pueden tomar valores específicos.
  • Enteras: Las variables son números enteros.
  • Mixtas: Combinación de variables continuas y enteras.
Según las Restricciones
  • Con restricciones: Incluyen limitaciones explícitas en la solución.
  • Sin restricciones: No tienen limitaciones explícitas en la solución.
Según la Naturaleza del Problema
  • Lineal: La función objetivo y las restricciones son lineales.
  • No lineal: La función objetivo o las restricciones no son lineales.
  • Convexo: La región factible y la función objetivo son convexas.
  • No convexo: La región factible o la función objetivo no son convexas.
Optimización Determinista vs. Estocástica
  • Determinista: Los parámetros y datos son conocidos con certeza.
  • Estocástica: Los parámetros y datos incluyen incertidumbre.
RESUMEN

En este capítulo,

**** Añadir *****

Bibliografía

Aubanell, A., Benseny, A., & Delshams, A. (1993). Útiles básicos de cálculo numérico. Barcelona: Editorial Labor, S.A. Burden, R. L., & Faires, J. D. (2015). Numerical analysis (10ª ed.). Cengage Learning.. Casas Rentería, Eduardo (2024). Métodos Matemáticos para la Ingeniería. Cálculo Numérico. Recuperado de: https://personales.unican.es/casase/MMI/pdfs/Apuntes.pdf Arnold, D. N. (2000). The Patriot Missile Failure. Institute for Mathematics and its Applications. Recuperado de http://www.ima.umn.edu/~arnold/disasters/patriot.html Arnold, D. N. (2000). The Explosion of the Ariane 5 Rocket. Institute for Mathematics and its Applications. Recuperado de http://www.ima.umn.edu/~arnold/disasters/ariane.html SIAM News. (1996, octubre). Vol. 29, Number 8. Arnold, D. N. (2000). The sinking of the Sleipner A offshore platform. Institute for Mathematics and its Applications. Recuperado de http://www.ima.umn.edu/~arnold/disasters/sleipner.html Infante del Río, J. A., & Rey Cabezas, J. M. (2022). Métodos numéricos: teoría, problemas y prácticas con MATLAB. Ediciones Pirámide.. Rivera, J. G., Álvarez, E. E., Galo, J. R., & Tabares, H. A. (2017). Métodos numéricos interactivo. Primera edición. Recuperado de Métodos Numéricos. Interactivo Faires, J. D., & Burden, R. L. (2012). Numerical methods, 4th. Cengage Learning.