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:

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

Esta orientación del libro 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/Octave, 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.

Quiero agradecer sinceramente a la Red Educativa Digital Descartes y, en especial, a Juan Guillermo Rivera Berrio por compartir su conocimiento de manera desinteresada. Su experiencia y su compromiso con el aprendizaje han sido clave para enriquecer este trabajo.

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 estudia métodos y algoritmos para obtener soluciones aproximadas a problemas que no pueden resolverse de forma exacta mediante métodos analíticos convencionales. Entre estos problemas se ncluyen ecuaciones algebraicas, ecuaciones diferenciales, integrales, sistemas de ecuaciones lineales y no lineales, entre otros.

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

  • Desarrollo de métodos. Diseñar y analizar algoritmos que permitan obtener soluciones aproximadas con la suficiente precisión para su aplicación en 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 los errores inherentes a la aproximación de los métodos como los errores de redondeo y truncamiento derivados por las limitaciones en la representación numérica de los computadores.
  • 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 rendimiento. 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 ofrecer un alto rendimiento en términos del tiempo de cálculo y los recursos computacionales que utilizan, especialmente cuando se aplican a problemas de gran escala y complejidad.

Ejemplo de introducción

Para comprender la importancia de los métodos numéricos y su aplicación en problemas reales, consideremos 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.

Vamos a recurrir a técnicas numéricas para obtener una solución aproximada considerando 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 considerando $t=0$ el momento en el que sale el sol y tomando como valor máximo 50 kW a partir del cual disminuye siguiendo la función senoiedad:
$${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 que se analizará en detalle en el capítulo 6 de este libro.

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)$?

El ejemplo responde a un problema de valor inicial (PVI) que consiste en encontrar la curva solución de una ecuación diferencial

$\frac{dy}{dx} = f(x, y)$ que verifica una condición inicial $y(x_0)=y_0$, es decir, que pasa por el punto $(x_0,y_0)$. En estos problemas se conoce la pendiente de la curva \( y(x) \) en cualquier punto y se busca encontrar dicha función.

El método de Euler propone aproximar esta curva avanzando paso a paso a través de pequeños saltos en el eje \( x \) moviéndose suavemente por la recta tangente en cada instante ya que $f$ permite calcular la pendiente a la curva en cada punto. En este proceso, en cada paso se recalcula la dirección.

A continuación se detalla el proceso a seguir en este método numérico, que se inicia desde el punto $(x_0.y_0)$.

Pasos del Método de Euler
  1. Punto inicial: Se parte del punto \( y(x_0) = y_0 \) dado por el PVI. Nuestra solución al problema es una curva que pasa por el punto \( (x_0 , y_0 )\).
  2. Aproximación por pasos: A partir del punto inicial, se avanza 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) $ ya que $f(x_n, y_n)$ es la pendiente en el punto $(x_n, y_n)$.

En el ejemplo que estamos viendo, el problema de valor inicial es

$$ dE/dt = P_{solar}(t) - kE(t) \,\,\,\, E(0)=0$$ El método de Euler permitiría encontrar la solución con la siguiente fórmula: $$ 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. Mostramos el cálculo de los primeros pasos.

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}\).
    ...

El proceso continuaría completando de forma similar 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 se puede encontrar 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

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.

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.

Aunque Matlab es un software de pago, se puede utilizar también el software libre y gratuito Octave. Para facilitar ejecutar el código propuesto en los ejemplos y ejercicios se pueden utilizar los enlaces siguientes sin realizar ninguna instalación:

A continuación se incluye como recordatorio las principales características de Matlab/Octave necesarias para seguir y comprender los ejemplos presentados en los próximos capítulos. Para una explicación más detallada, se recomienda consultar la documentación oficial o la bibliografía .

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 guardamos código en un archivo y queremos utilizarlo más adelante, es necesario indicar al programa su ubicación. Matlab tiene preconfigurada la ruta donde almacena sus funciones nativas y las de los paquetes incluidos. Sin embargo, si trabajamos con archivos propios, debemos asegurarnos de que el programa pueda acceder a ellos correctamente.

Matlab busca funciones y scripts en los directorios especificados por el comando 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.

Se detallan a continuación algunas reglas a tener en cuenta a la hora de definir 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 justificando las respuestas.
  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 este comando 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 shortEng Notacion decimal con 4 dígitos 3.1416e+00
format longEng Notacion técnica larga 3.14159265358979e+000
Formatos de números

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 (^). Por ejemplo,


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 mayor, 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. Por ejemplo,


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 obtener el valor de
\[\frac{{\left( {\frac{\pi }{2} + 4} \right){2^{3 + {2^2}}}}}{{1 + {3^2}}}\]
Calcular el valor de

\[\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\%\). Las fórmulas del beneficio total y retorno de la inversión son: \[ 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 se deben escribir los 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

Por ejemplo, para definir la función que calcula 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 anónima 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

    Por ejemplo, para generar un vector con punto inicial 2 hasta 7 con un salto 2.

    
    >>v=4:2:9
    v=[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)

    Por ejemplo, para generar un vector fila de 7 elementos equiespaciados siendo el primer valor 2 y el último 3


>>v=linspace(2,3,7)
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$

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. Por ejemplo,


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(numFilas,numColumnas)

% Ejemplo: una matriz 4x3 de ceros
>>zeros(4,3)

Matriz de unos

ones(numFilas,numColumnas)

%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: Una matriz diagonal con el vector [2 3 4] en la diagonal
>>diag([2 3 4])

Matriz aleatoria

rand(m,n)     randi([imin imax],m,n)

%Ejemplo: Crea una matriz de valores aleatorios de dimension 2x3 y otra del mismo tamaño con números enteros entre -5 y 5
>>rand(2,3)
>>randi([-5 5],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];
    % Accede al elemento en la fila 2, columna 3
    elemento = A(2, 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]
    
  • Acceso a la última fila o a la última columna de una matriz sin especificar su dimensión
    
    A = [1 2 3; 4 5 6; 7 8 9]; % Matriz 3x3
    ultima_fila = A(end, :)
    ultimas_columnas=A(:,2:end)
    
  • Submatrices especificando rango de filas y columnas
    
    A = [1 2 3; 4 5 6; 7 8 9];
    % Submatriz con filas 1 y 2, y columnas 2 y 3
    submatriz = A(1:2,2:3);% Resultado: [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);
    % Resultado: elementos_mayores_a_5 = [6 7 8 9]
    

Operaciones con vectores y matrices

Matlab/Octave está diseñado para trabajar de manera óptima con matrices, permitiendo realizar operaciones como la transposición, 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
    
  • Transpuesta de una matriz
    
    A = [1 2 3; 3 4 5]; % A es 2x3
    A'  % Matriz transpuesta 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$, realiza las siguientes operaciones: $$y - k\,;\,\,\,\,ky\,\,;\,\,\frac{x}{k}\,\,\,\,\,;2x - y \,\,\,\,\,{x^2} + {y^2}\,\,;\,\,\,\,\frac{3}{{\sqrt[3]{x}}}\,\,\,\,\,;\,\,\frac{{1 + x}}{{{y^4}}}$$
Define una matriz A de orden 4 cualquiera 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 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.
En el siguiente interactivo puedes ver distintos ejemplos de manejo de vectores y matrices.

Ejercicios sobre matrices

Polinomios

En Matlab/Octave, los polinomios se representan como vectores de coeficientes, ordenados de mayor a menor grado.

p = [3 -2 5 0 1];
% Representa 3x^4 - 2x^3 + 5x^2 + 0x + 1

Para evaluar un polinomio en un punto se utiliza el comando polyval. Para multiplicar, el comando conv y para dividir deconv.


x = 2; p1=[3 -2 5 0 1];p2=[2 3];
valor = polyval(p1, x); disp(valor) % Evalúa p(2)
pmul = conv(p1, p2);
[cociente, resto] = deconv(p1, p2);

Funciones nativas de Matlab/Octave

Los programas Matlab/Octave ofrecen una amplia variedad de funciones integradas 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 11 entre 4
    
  • Funciones trigonométricas e hiperbólicas
    
    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)
    % Seno, coseno, tangente hiperbólicas
    asinh(v), acosh(v), atanh(v)
    % Arcoseno, arcocoseno, 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
    trace(A)	% Traza de A
    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
    size(A)		% Devuelve un vector con el número
    			% de columnas y filas de la matriz 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
    
En el siguiente interactivo puedes ver distintos ejemplos de uso de algunas de las funciones anteriores.

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: Representar $x^2$ en $[-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: code>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 tienen 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(2)+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 booleana.

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


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 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 20 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 se puede hacer también de la forma siguiente:


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 también de la forma siguiente:


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 y \( 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\). Utiliza una función anónima que dependa de estos tres parámetros.
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) \]
Realiza el ejercicio anterior utilizando funciones anónimas considerando 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 - 3, & \text{si } 3 \leq x \leq 4 \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 el número total 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 tantos sus componentes pares como el número de ellas.
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. Nota: El MCD(a,b) con a>b es b si a es múltiplo de b. En otro caso, MCD(a,b)=MCD(b,r) siendo r el resto de dividir a entre b.
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 tema es destacar la importancia de la aritmética computacional en el contexto de los métodos numéricos. Se analizará cómo los computadores representan los números y realizan cálculos, destacando que, debido a limitaciones inherentes, como el almacenamiento en binario y la precisión finita, los resultados que se realicen con el ordenador pueden contener errores.

En particular, se observará que:

  • Los computadores solo pueden representar un subconjunto finito de los números reales, ya que utilizan una cantidad limitada de bits para almacenar valores. Esto implica que muchos números, tanto raciones o irracionales, deben ser aproximados, lo que introduce errores en los cálculos.
  • Las operaciones aritméticas pueden generar errores acumulativos debido a las limitaciones en la precisión.

A continuación, presentaremos algunos ejemplos numéricos que ilustran este tipo de problemas y los errores que pueden generar.

Analiza el siguiente código Matlab y observa que al sumar 1000 veces 0.1 no se obtiene 100.

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 y observa que los valores de la función $(1-x)^6$ y la del polinomio resultado de expandir la potencia, varían en las cercanías del punto 1. Representa la gráfica en el intervalo considerado.


f=@(x) (1-x).^6
%Consideramos el polinomio resultado de calcular la potencia
%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;
%Comparamos resultados
[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 la de la función $g(x)$ del código anterior.

¿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, las operaciones aritméticas que se realicen también serán inexactas.

Gráficas de las funciones del ejemplo 2.2.

Sistemas de numeración

Un sistema de numeración consiste en un conjunto de símbolos que permiten representar cantidades numéricas, así como reglas para realizar operaciones con dichas cantidades. En este apartado, nos centraremos en el sistema decimal (base 10) y en el binario (base 2), fundamentales en el ámbito del cálculo numérico. Mientras que el sistema decimal es el que utilizamos en la vida cotidiana, el binario es esencial en computación y en el procesamiento numérico, ya que los ordenadores representan y manipulan los datos a través de este sistema.

Sistema decimal

En el sistema decimal los números se representan utilizando 10 dígitos: 0,1,2,3,4,5,6,7,8,9. Además, este sistema de numeración es posicional en el que las cantidades se representan utilizando como base aritmética las potencias del número diez. Así, si $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}}$$

Sistema binario

Si consideramos una base $b$, un número real $x$ positivo 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}}...$$

El Standard de IEEE (Institute of Electrical and Electronics Engineers) propone el uso de la base $b=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

Para convertir un número decimal a binario, basta dividir el número 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$.
En el siguiente interactivo puedes introducir un número natural y ver cómo se expresa en binario.
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_{-2}}} \over {{2^2}}} + {{{a_{-3}}} \over {{2^3}}} + ...$$ Estos valores se pueden obtener multiplicando por 2 y teniendo en cuenta la suma de la siguiente serie geométrica: $\sum\limits_{k = 1}^\infty {{1 \over {{2^k}}}} = 1$.
Convierte $0.1_{10}$ a binario.

Se tiene que,
$$ \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}}} + ... \\ &= 0.0001{\widehat {1001}_2} \end{aligned}$$

Conversión a binario. Escena creada por Héctor A. Tabares Ospina y Juan Guillermo Rivera Berrío
Del ejemplo anterior, se observa que el número 0.1 se escribe en base 2 con infinitas cifras distintas de cero.
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

Para convertir un número binario a decimal, se multiplica cada dígito binario por la potencia de 2 correspondiente a su posición y luego se suman todos los valores resultantes.

Con la siguiente herramienta interactiva puedes convertir a decimal un número binario sin parte fraccionaria.

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 se puede escribir de forma que la primera cifra no nula aparecezca 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 expresión normalizada en coma flotante donde:

  • s signo
  • e exponente
  • m mantisa
Considera el número $x=9028.304$ en base decimal, escríbelo en forma normalizada.
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, cualquier número $x$ se puede escribir normalizado en coma flotante de la forma

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

Por lo tanto, el número $x$ se puede almacenar guardando el signo $s$, el exponente $e$ y la mantisa $m$. Como en base 2, el primer dígito que precede a la mantisa es siempre 1, no es necesario almacenarlo. De esta forma se optimiza la representación mediante el llamado bit oculto.

En el ordenador los números reales se representan según la norma IEEE 754, establecida en 1985 por el Institute of Electrical and Electronics Engineers Esta norma establece dos formatos, simple y doble precision a partir de la expresión normalizada en 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

Para representar un número real en precisión simple en el ordenador se utiliza:

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

Teniendo en cuenta que se usan 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 poder considerar las potencias de 2 negativas se hace un desplazamiento del exponente para que represente valores desde -127 a 128. Así, en precisión simple, un exponente real de 0 se almacena

como 127, un exponente de -1 como 126, y un exponente de +1 como 128. En general, la relación entre el exponente real y el almacenado es la siguiente: $$e_{almacenado}=e_{real}+127$$

Exponente real y almacenado
Al valor 127 se le llama sesgo. El sesgo es un número fijo que depende del formato, en simple precisión es 127 pero en doble precisión es 1023. Con esta representacion, los números que se pueden representar en precisión simple son:

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

Los valores extremos del exponente, esto es 0 y 255, se reservan para números especiales (cero e infinito).

Para el número $3.125_{10}$ escribe cómo sería su codificación en precisión simple.

Se tiene que

$$3.125_{10}=11.001_{2}=1.1001 × 2^{1}$$

Por lo tanto, $m=1001$ que ajustada a 23 bits es $1001\underbrace{0...0}_{19 \,\,bits}$.

Para el exponente, considerando el sesgo, se codificará $e=127+1=128=2^{7}$. Este número en binario es $10000000$.

En definitiva, la representacion en precisión simple del número decimal 3.125 es la siguiente:

$$0     10000000    1001\underbrace{0...0}_{19 \,\,bits}$$

Con la siguiente herramienta interactiva puedes practicar en la conversión de números decimales a precisión simple según el estándar IEE 754.

Conversor 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 $$

Se consideran las siguientes representaciones especiales:

  • Cero:  $e=0$, $m=0$.
  • Infinito:   $e=2047$, $m=0$.
  • NAN:   $e=2047$, $m \ne 0$.
Dado el número $3.125_{10}$, veamos cómo codificar el número en doble precisión.
Se tiene $$3.125_{10}=11.001_{2}=1.1001 × 2^{1}$$ donde la mantisa es $m=1001$ que ajustada a 52 bits es $1001\underbrace{0...0}_{48 \,\,bits}$.

Respecto al exponente, el valor a almacenar es $e=1023+1=1024=2^{10}$, que en binario es $10000000000$.

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

Con la siguiente herramienta interactiva puedes practicar en la conversión de números decimales a doble precisión según el estándar IEE 754.

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: Se refiere al conjunto de valores donde existen números representables. Los valores máximo y mínimo normalizados representables en doble precisión son:

    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}} $$

    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.

  • Precisión: Nos da la diferencia entre dos números representables consecutivos, depende del número de bits de la mantisa. Debido a los 52 bits de la mantisa, la precisión en términos de dígitos decimales es aproximadamente: $log⁡_{10}(2^{52})≈15.95$ dígitos.
Obtén el menor número positivo desnormalizado.

El mínimo número desnormalizado positivo ocurre cuando la mantisa tiene un 1 en el bit menos significativo $m=2^{-52}$. El exponente real será

$$ {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
Los números representados en la máquina no están igualmente distribuidos en la recta real, hay muchos más cerca del cero.

El número más pequeño representable 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).

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|}}$

El error absoluto indica cuánto se ha desviado una medición del valor real, en las mismas unidades. El error relativo expresa el error en términos fraccionarios respecto al valor real y multiplicado por 100 se obtendría en porcentaje, lo que permite comparar errores en diferentes escalas.

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

Calcular el error absoluto y relativo siendo $p=3$ y $\widetilde p=3.1$. Repetir el cálculo para $p=3000$ y $\widetilde p=3100$.
En el caso $ p = 3 \,\,\,\,\,\, \tilde p = 3.1 $ se tiene $${E_a} = \left| {3 - 3.1} \right| = 0.1 \,\,\,\,\,\, \,\,\,{E_r} = \frac{{{E_a}}}{p} = 3\% $$ Para $p = 3000 \,\,\, \tilde p = 3001$, se tiene $${E_a} = \left| {3000 - 3100} \right| = 100 \,\,\, \,\,\,\,\,\,{E_r} = \frac{{{E_a}}}{p} = 3\%$$

En este ejemplo se muestra que si bien el error absoluto es distinto, el error relativo es el mismo. El error relativo de 3% indica que la medición tiene un error de aproximadamente el 3% respecto al valor real.

En 1862 el físico Foucault, utilizando un espejo giratorio, calculó la velocidad de la luz en $298 000$ km/s. 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.626×10^{−27}$ erg seg, estimar el error absoluto y relativo cometido por Planck.

¿Cuál de las dos medidas es más precisa?

En la tabla siguiente se recogen los errores absoluto y relativo para cada estimación.

Medición Valor estimado Valor real Error absoluto Error relativo
Velocidad de la luz (Foucault) 298000 299776 1776 5.920661e-03
Constante de Planck 6.41e-27 6.626e-27 2.13e-28 3.216246e-02

Para determinar cuál es la medición más precisa, observamos el error relativo:

  • Foucault tiene un error relativo menor (~0.00592), lo que indica mayor precisión.
  • Planck tiene un error relativo mayor (~0.03216), lo que sugiere menor precisión.

Errores de redondeo

En el sistema decimal, existen dos formas de redondear un número a $t$ decimales. En el proceso denominado truncamiento (o redondeo hacia el cero) 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 $t$ 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 representable, 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\,\,\,\,\,\,\,\,\,\,\,\,\,\,-1023 < {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 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$.
Ejecuta el siguiente código y observa que los valores obtenidos son 0 y 1, respectivamente.

x=10^20;y=-10^20;z=1;
x+(y+z)
(x+y)+z
Calcula con Matlab la siguiente operación $x=1 - 3\cdot (4/3 - 1)$. Observa que el valor no es cero.

x=1- 3*(4/3 - 1)
x =
	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-912.3)=fl(112.7)=1.12 \cdot 10^2$$ $$ fl(fl(x)-fl(y))=fl(90)=9.0 \cdot 10^1$$

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 el número mínimo de operaciones convenientemente dispuestas para evitar estos problemas y a la vez el tiempo de ejecucion sea aceptable.

Para un análisis detallado sobre los errores en cálculos numéricos, como son los 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 cero.

Dados $x=1+2^{-54}$ e $y=1$, calcula con Matlab $x-y$. Realizar la misma operación con $x=2^{60}+2^6$ e $y=2^{60}$.

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


% Apartado a)
x=1+2^-54;y=1;x-y
% Apartado b)
x=2^60+2^6;y=2^60;x-y

Considera la función \[f\left( x \right) = \left( {{e^x} - 1} \right)^2 + {\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 para ello un vector de valores de $h$ desde $10^{-1}$ hasta $10^{-17}$ y observa qué valor se obtendría para $f'(1)$ utilizando la aproximación anterior. Realiza también el cálculo derivando la función y sustituyendo en el punto 1 comparando los resultados.   

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 longEng
disp([h' v'])
Observa que a partir del valor $k=-16$ se obtiene 0. Realizando la derivada de la función y sustituyendo en el punto 1, 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. Repite después el cálculo de $e^{ - x}$ teniendo en cuenta que$ e^{ - x}= {1 \over {{e^x}}}$. ¿Qué observas?   

Observa que para calcular $e^{-40}$ el valor de $x$ es menor que cero, los términos de la serie exponencial irán cambiando de signo y, cuando $|x|$ es grande, el valor de los sumandos será cada vez más pequelo. 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 este problema de cancelación ya que todos los términos son positivos.


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
%Valor que da Matlab
exp(-40)    % 4.248354255291589e-018

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

Considera la función \[f\left( x \right) = \frac{1}{{1 + 2x}} - \frac{{1 - x}}{{1 + x}}\] Observa que para valores $x$ próximos a 0 se puede producir cancelacion. Comprueba que es así evaluando esta función en puntos próximos a 0 directamente y observa cómo evitar esta cancelación, considerando la siguiente expresión equivalente resultado de restar las dos fracciones

\[f\left( x \right) = \frac{{2x^2}}{{\left( {1 + 2x} \right)\left( {1 + x} \right)}}\]

%Se considera la primera expresión como resta de fracciones
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));
format longEng
%Se considera un vector de valores próximos a cero
k=-1:-1:-17;
h=10.^k;
%Se evalúan ambas expresiones
f1=f(h);
g1=g(h);
%Se imprimen los valores de h y los valores
%obtenidos para comparar
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 longEng
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 longEng
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, realmax, por dos para ilustrar el concepto de desbordamiento. Divide después el valor mínimo positivo normalizado, realmin, 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

En el siguiente ejemplo veremos cómo los errores de redondeo pueden conducir a resultados incorrectos si el algoritmo no es el adecuado. Este fenómeno, conocido como inestabilidad numérica, puede evitarse seleccionando algoritmos más apropiados.

Para cada $n \ge 0$ se considera la integral $${I_n} = \int\limits_0^1 {{x^n}sen\pi x\,dx} $$ Utilizando integración por partes, se sabe 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}$$ Calcula utilizando esta recurrencia el valor de $I_{30}$ e $I_{31}$. ¿Son los resultados aproximaciones satisfactorias de la integral? Propón una alternativa eficiente despejando $I_n$ en función de $I_{n+2}$ para calcular en forma descente $I_{30}$ e $I_{31}$ teniendo en cuenta que $I_{n}$ para $n$ grande es próxima a cero.

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. $$\left| {\int\limits_0^1 {{x^n}sen\left( {\pi x} \right)dx\,} } \right| \le \int\limits_0^1 {{x^n}dx\,} = \left. {{{{x^{n + 1}}} \over {n + 1}}} \right|_{x = 0}^{x?1} = {1 \over {n + 1}}$$

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 longEng
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}$, utilizando este cálculo, es $0.003139287076703$, y el valor de $I_{31}$ es $0.002950500704051$.

Consideremos la integral: \[y_n = \int\limits_0^1 {\frac{{{x^n}}}{{x + 5}}dx} \] Teniendo en cuenta los cálculos siguientes, podemos encontrar una ley de recurrencia para el valor de $y_n$:

\[{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}}\]

Se pide calcular de forma recurrente $y_{20}$ con la expresión anterior. Observa que se obtiene un valor negativo, lo cual es absurdo porque el integrando es positivo.

Para evitar este problema, considera después la fórmula de recurrencia en sentido descendente para obtener el valor de $y_{20}$

\[{y_{n - 1}} = \frac{1}{{5n}} - \frac{{{y_n}}}{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}}$, calculamos $y_{20}$.


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

Tomando límites en ${y_n} = \frac{1}{n} - 5{y_{n - 1}}$, vemos que la sucesión $y_n$ converge a 0. Por lo tanto, considerando $y_{60}=0$ y tomando la ley de recurrencia ${y_{n - 1}} = \frac{1}{{5n}} - \frac{{{y_n}}}{5}$, calculamos de nuevo el valor de $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'])
%y(20) es 7.997523028232164e-03

Autoevaluación

Actividad de autoevaluación

Ejercicios

Calcular los números cuya representación en punto flotante de precisión doble es
  • $0 \, 10000000100$ $0111110000000000000000000000000000000000000000000000$
  • $0\, 10000000010$$1011001000100000000000000000000000000000000000000000$
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.
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.
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.
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. Analizar la diferencia de resultado con una y otra expresión con valores de $x$ que sean potencias de 10 de exponente natural entre 6 y 16.
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 para resolver ecuaciones no lineales es encontrar raíces aproximadas, ya que la mayoría de las ecuaciones no tienen soluciones exactas o estas no son computacionalmente viables. Mediante métodos iterativos se va consiguiendo aproxima la solución dentro de un margen de error considerado .

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, por lo que se buscan 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$ es la masa del paracaidista.

Simulador de la velocidad de un paracaidista

Si quisieramos 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? Este valor sería el valor $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: 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 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.

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

En este capítulo abordaremos los principales métodos numéricos para la resolución de ecuaciones no lineales. Comenzaremos con el método de bisección, una técnica basada en el teorema de Bolzano, que garantiza la existencia de raíces en un intervalo y ofrece una convergencia segura aunque lenta. Luego, estudiaremos el método del punto fijo, que transforma la ecuación en una forma iterativa y permite analizar la convergencia local y global de la solución. Posteriormente, exploraremos el método de Newton-Raphson, que emplea la derivada de la función para obtener una convergencia rápida, aunque con ciertas limitaciones respecto a su punto de inicio. Finalmente, analizaremos el método de la secante, que mejora la eficiencia de Newton al evitar el cálculo de derivadas. A lo largo del capítulo, presentaremos ejemplos prácticos para ilustrar el comportamiento de cada método, comparando sus ventajas y limitaciones en diferentes escenarios.

Raíz o cero de una función

DEFINICIÓ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)$, esto es, derivable hasta el orden $m$ con derivadas continuas, 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. Si la función es estrictamente creciente o estrictamente decreciente en un intervalo donde hay cambio de signo en los extremos, la función tiene un único cero en dicho intervalo.

Algoritmos iterativos.

Para la aproximación al cero de la función $f$ se utilizan métodos iterativos. En el caso de de los de un paso, estos métodos consisten 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 el término $x_{k+1}$ a partir de $x_k$ mediante una 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$. Los algorítmos a utilizar deberán dar respuesta a cuestiones como las siguientes:

  1. la sucesión $x_k$ que se obtiene mediante el método iterativo, ¿es 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ántas iteraciones 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.

Representación método del punto fijo

Velocidad de convergencia

Se distinguen distintas velocidades 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$$

En este caso, 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 xk |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 $f(c)$ sea próximo a cero con 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,

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

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.

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 estrictamente 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 estrictamente 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 estrictamente creciente en ese intervalo.

Para calcular los valores de las tres primeras iteraciones del método de la bisección, se puede utilizar la herramienta interactiva siguiente introduciendo la función y los valores de $a$ y $b$ para cada caso. En el interactivo debes escribir el seno de x como sin(x).

Método de la bisección
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 Biseccion(a,b,tol,maxiter).

Calcula con esta función los ceros de la función $f(x)=x^3-6x^2+11x-6$ en el intervalo $[0, 1.5]$ tomando como tolerancia el valor $0.001$ y el valor de $30$ como máximo de iteraciones. En este ejemplo, las raíces se pueden obtener de forma exacta, son 1, 2 y 3, por lo que con este ejemplo únicamente se busca mostrar el método.

Calcula después el cero que está dentro del intervalo $[1.5,2.5]$ y el que se encuentra en el intervalo $[2.5,3-5]$.
La herramienta interactiva siguiente construye el código de la función Biseccion2(a,b,tol,maxiter). Para ello, se debe pulsar en el botón solucion guiada e ir avanzando paso a paso.
Programación método de la bisección

Para calcular los ceros en cada intervalo bastaría escribir:


Biseccion(0,1.5,10^-3,30)  %Solución: 1.0000
Biseccion(1.5,2.5,10^-3,30)  %Solución: 2.0000
Biseccion(2.5,3.5,10^-3,30)  %Solución: 3.0000
Modifica el código del ejemplo anterior para considerar como parámetro también la función cuyo cero se quiere calcular: Biseccion(fun,a,b,tol,maxiter).

Calcula con esta función el cero de $f(x)=x^3-6x^2+11x-6$ en el intervalo $[0,1.5]$, con una tolerancia $10^{-6}$ y un máximo de 25.

La función pedida podría ser:


function raiz = Biseccion2(f, a, b, tol, maxIter)
    raiz='';
    for i = 1:maxIter
        c = (a + b) / 2;
        fc = f(c);
        fa = f(a);
        if fa * fc < 0
            b = c;
        else
            a = c;
        end
        if abs(f(c)) < tol
            raiz = c;
            break;
        end
    end
end

Para calcular el cero de $f(x)=x^3-6x^2+11x-6$ en el intervalo $[0, 1.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
Biseccion2(f,0,1.5,10^-6,25)
%Solución: 1.0000

Método del punto fijo

Dada la ecuación $f(x)=0$, los pasos a seguir son los siguientes:
  1. Despejar de la ecuación anterior $x$, obteniendo $x=g(x)$. El problema de encontar el cero de $f$ se reduce a encontar el punto fijo de $g$, esto es, encontrar $\overline x$ cumpliendo $\overline x=g(\overline x)$.
  2. Partiendo de un valor inicial $x_0$, iterar de la forma $$x_{k+1}=g(x_k),        k=0,1,...$$ con el objeto de que ${x_k}$ converja a $\overline x$.
Método del punto fijo

Los siguientes resultados teóricos dan condiciones suficientes para que haya un punto fijo en un intervalo y para que la convergencia lo sea a un único punto fijo.

Sea $g$ continua en $[a,b]$ que aplica $[a,b]$ en $[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 un punto cualquiera 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, se verifica

$$\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 analiza los valores que se obtienen con el método del punto fijo.
Efectivamente, $g(0)=0$. La derivada de la función es $g'(x)=1-x/5$, que en el punto $0$ vale $1$. La convergencia por tanto no está asegurada. Representamos en primer lugar la función y la recta $y=x$ y luego calculamos distintas iteraciones comenzando en el punto 0.5 para ver cómo es la convergencia.

g=@(x) x-x.^2/10; h=@(x) x;
% Gráfica de la función
fplot(g, [-2, 2]); hold on;
fplot(h, [-2, 2], 'r--'); % Línea y = x
xlabel('x');
ylabel('g(x)');
title('Método del Punto Fijo para g(x) = x - x^2/10');
grid on;
legend('g(x)', 'y=x');
Gráfica del ejemplo

Iterando, se ve que la convergencia es muy lenta, después de 100 iteraciones, el valor es $0.0828$.


x(1)=0.5;maxIter=100;
for k=2:maxIter
	x(k)=g(x(k-1));
end
x(maxIter)
plot(1:maxIter,x,'o');
Con el siguiente interactivo puedes obtener las primeras iteraciones del método del punto fijo introduciendo distintas funciones y puntos iniciales. En el ejemplo se ve las tres primeras iteraciones del método para calcular la raíz de $\cos(x)-x=0$, tomando $g(x)=cos(x)$ y se muestra gráficamente cómo obtener el valor de una iteración a partir del anterior.

Ejemplos del método del punto fijo

Vamos a escribir el código Matlab para calcular la raíz de $f(x)=cos(x)-x$ considerando el proceso iterativo siguiente: $$ {x_o} = 0.5 \,\,\, , \,\,\,\,\, {x_{k + 1}} = \cos \left( {{x_k}} \right)\,\,\,\,\,k,0,1,2,... $$ tomando una tolerancia $\epsilon=10^{-16}$.
Gráficas del ejemplo

El código podría ser el siguiente:

g=@(x) cos(x); xk=0.5;
format long
error=1;iter=0;
while error>10^-16
	xk1=g(xk);
	error=abs(xk-xk1);
	xk=xk1;
	iter=iter+1;
end
disp('Iteraciones')
iter
disp('Raiz')
xk

Ejecutándolo, se puede ver que a partir de la iteración 89 se estabiliza la sucesión obteniendo como cero el valor 0.739085133215161.
Calcular los ceros de $f(x)=x-e^{-x^2}$ en $[0,1]$ utilizando el método del punto fijo tomando las funciones $g(x)=e^{-x^2}$ y $h(x)={(-log(x))}^{1/2}$. Empieza en el punto $0.5$ realizando 100 iteraciones y analiza los resultados.
Con ayuda de la herramienta vista anteriormente, se pueden obtener las primeras iteraciones en el caso de la función $g$. Visualmente se puede intuir que la sucesión converge.

Iteraciones del punto fijo para la función $e^{-x^2}$

Con el siguiente código se pueden realizar un máximo de iteraciones indicado en maxIter para ver si se consigue obtener la precisión dada.


% Se representa la función g y la recta y=x
g=@(x) exp(-x.^2);x=0:0.01:1;
plot(x,g1(x),x,x)
% Número fijo de iteraciones
xk=0.5;tol=10^-10;maxIter=100;format long
for  k=1:maxIter
	xk1=g(xk);
	if abs(xk1-xk)<tol
		xk=xk1; break
	end
	xk=xk1;
end
[xk g(xk) k]

Se puede ver que la función cumple la condición suficiente para asegurar la convergencia, basta calcular el máximo de $g'$ para ver que si $x \in \left[ {0,1} \right]$,

$$\left| {g'\left( x \right)} \right| = \left| { - 2x\,{e^{ - {x^2}}}} \right| < 1$$
En el segundo caso, $h(x)={(-log(x))}^{1/2}$, la representación de las primeras iteraciones hace intuir que no habrá convergencia.

Iteraciones del punto fijo para la función $h(x)={(-log(x))}^{1/2}$,

Con el siguiente código se pueden obtener las 5 primeras iteraciones. El valor de la derivada en $0.5$ no es menor que 1 en valor absoluto por lo que no se tendría garantizado la convergencia.


h=@(x) (-log(x)).^0.5;
%Derivada
h1=@(x) -0.5*((-log(x)).^-0.5)./x;
h1(0.5)  %-1.201122408786450
%Iteraciones
xk=0.5;
for k=1:5
    xk=h(xk)
end

En este ejemplo, se ha visto que el método del punto fijo aplicado a $g(x)$ permite obtener el cero de la función $f$, que es $0.652918640419205$, y que con la función $h$, el método del punto fijo no sería convergente.
Acotar las raíces de $p(x)=x^3+3x^2-1=0$ y encontrar las tres raíces reales mediante el método del punto fijo.

Acotamos en primer lugar los ceros de la función y vemos qué funciones se pueden 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 una función: puntoFijo(g,x0, tol, maxiter) que tenga como argumentos la función, el punto inicial, la tolerancia y el número máximo de iteraciones. Para calcular los tres ceros se puede escribir por ejemplo el siguiente código con una tolerancia de 10^-6 y considerando 100 iteraciones como máximo.


%Raiz en el intervalo [-3,-2]
g=@(x) x.^3-3;tol=10^-6;
puntoFijo(g,-2.5, tol, 100)
%Raíz en el intervalo [-1,0]
g=@(x) -sqrt((x+3)^-1); puntoFijo(g,-1.5, tol, 100)
%Raíz en el intervalo [0,1]
g=@(x) -sqrt((x+3)^-1); puntoFijo(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$ construida utilizando la expresión iterativa siguiente a partir de un valor inicial $x_0$: $$x_{k+1} = x_k − \frac{f(x_k )}{ f'(x_k )} \,\,\,\,\,k ≥ 0$$

La idea de este método se basa en la aproximación lineal que proporciona la recta tangente. Una vez obtenido $x_k$, se calcula $x_{k+1}$ utilizando la aproximación lineal de $f(x)$ mediante la recta tangente que pasa por 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
%Se puede ver que 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)
%Se repetiría la instrucción para iterar
%hasta conseguir 16 decimales

En la siguiente tabla se muestran las primeras seis iteraciones viendo que se estabiliza a partir de la sexta iteración.

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

Se puede observar, 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;
%Se repetiría el código para realizar
%una nueva iteración
Si se quisiera ir guardando los distintos valores de cada iteración en un vector, se podría considerar el siguiente código:

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;
%Se repetirían las tres últimas líneas de código
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$. El código siguiente muestra cómo obtener la raíz utilizando los comandos polyder y polyval específicos para polinomios.

p=[1 3 0 2] %polyder deriva el polinomio
dp=polyder(p)
%polyval(p,a) evalúa el polinomio en a
%Vemos que hay cambio de signo en [-4,-2]
polyval(p,-4)*polyval(p,-2) %Cambio de signo
x=-3
%Aplicamos el método de Newton
x=x-polyval(p,x)/polyval(dp,x)
%repetimos este último paso para iterar, sol=-3.195823345445647

Si se repitiera el proceso, por ejemplo con $x_0=1$, se puede ver que no converge, las iteraciones oscilan entre negativo y positivo. Esto ocurre porque el método de Newton converge localmente.

Test de parada

Como condición de parada para no seguir iterando, 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, dada una función, calcule a partir del punto inicial, el máximo de iteraciones y la tolerancia, la raíz de dicha función aplicando el método de Newton.
La herramienta siguiente muestra cómo generar paso a paso el código Matlab/Octave de la función Newton(x0, tol, maxiter) que utilice 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.
Calculamos la función y su derivada y el punto inicial para empezar con el método de Newton.

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]
Punto inicial
$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]$. Se comprueba antes de aplicar el método de Newton, si la derivada toma valores pequeños.

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$

El cambio de signo se produce en $[a,x]$.

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$

El cambio de signo es en $[a,x]$.

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$

De nuevo, el cambio de signo es en $[a,x]$.

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$

El cambio de signo vuelve a ocurrir en $[a,x]$.

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 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$

El cambio de signo es en $[a,x]$.

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$

Escribir el código Matlab/Octave para programar el método de Newton combinado con bisección en un intervalo donde la función cambie de signo, la tolerancia y el máximo de iteraciones permitidas: NewtonBisección(x0, tol, maxiter)

Con la herramienta siguiente se muestra cómo generar paso a paso el código Matlab/Octave de la función NewtonBiseccion(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

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.

Método de la secante

Este método se basa en considerar, en lugar de la recta tangente, la aproximación que da la secante en intervalos pequeños.

Este método parte de dos aproximaciones iniciales $x_o$ y $x_1$. En el paso $k+1$, se calcula $x_{k+1}$ usando $x_{k-1}$ y $x_k$ 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 $1$.
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 Secante(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=1$ 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 respectivamente $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 respectivamente $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 respectivamente $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 respectivamente $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 respectivamente $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 para calcular 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 para calcular el 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 para calcular el 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 para calcular el 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 para calcular el 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 para calcular el 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 para calcular el 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: SecanteBiseccion(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 SecanteBiseccion(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. 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 raices 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

Actividad de autoevaluación

Ejercicios

Encuentra una raíz de \(x = \frac{1}{2} sen(x) + \frac{1}{4}\) en el intervalo \([0, \pi/2]\) utilizando el método del punto fijo. Determina previamente que la raíz es única en dicho intervalo.

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) = \sqrt{(e^{-x})}\)
  • \(g(x) = -{\log(x^2)}\)

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.

Encuentra una raíz de $x^3 - x - 2 = 0$ en el intervalo \([1, 2]\) utilizando el método de bisección.

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

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.

Un puente colgante sigue la ecuación de la catenaria:

\[ y = a \cosh\left(\frac{x}{a}\right) \]

El punto más bajo del cable está en \( x = 0 \), y queremos encontrar la altura \( H \) de las torres en \( x = 100 \).

Si la altura mínima del cable en el centro es de 20 m, y las torres tienen una altura de 100m, determina el valor de "a" utilizando métodos numéricos.

Una empresa tiene costos y demanda modelados por:

$$ C(x) = 500 + 20x + 0.1x^2, \quad P(x) = 100 - 0.5x $$

La empresa desea maximizar sus beneficios. Sabiendo que el beneficio viene dado por Beneficio = Ingresos - Costos, utiliza un método numérico para encontrar el valor de x que maximiza el beneficio

Consideremos la función \(f(x) = 0.2 sen(16x) - x + 1.75\). 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.

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\)?

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\).

La temperatura en el interior de una pared de espesor \( L \) sigue:

$$ T(x) = T_0 \cosh\left(\frac{x}{L}\right) + T_s \sinh\left(\frac{x}{L}\right) $$

Encuentra \( x \) cuando \( T(x) = 50 \)°C, con \(T_0 = 100\)°C, \(T_s = 20\)°C, y \(L = 0.5\).

La función de error \(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.

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}\). Considera \( g = 9.81 m/s^2\).

En un intercambiador de calor, la temperatura de salida \(T_s\) satisface la ecuación:

$$ T_s = T_e + (T_i - T_e)e^{-\frac{UA}{mc_p}} $$

donde \(T_e = 20°C\) es la temperatura exterior, \(T_i = 80°C\) es la temperatura inicial, \(U = 200\, W/(m^2\cdot K)\) es el coeficiente global de transferencia de calor, \(m = 2\, kg/s\) es el flujo másico, y \(c_p = 4186\, J/(kg\cdot K)\) es el calor específico. Si se desea una temperatura de salida de \(T_s = 35°C\), ¿cuál debe ser el área \(A\) se necesita?

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 \( \epsilon_a = 10^{-12}\) utilizando el método de Newton-Bisección.

Se necesita diseñar un tanque esférico que almacene 1000 m³ de líquido. Si la altura del líquido es de 8 metros, ¿cuál debe ser el radio de la esfera? La fórmula para el volumen de un segmento esférico es:

$$ V = \frac{\pi h^2}{3}(3R - h) $$

donde \(V\) es el volumen, \(h\) es la altura del líquido y \(R\) es el radio de la esfera.

La ecuación de van der Waals para gases reales es:

$$ (P + \frac{an^2}{V^2})(V - nb) = nRT $$

donde \(P\) es la presión, \(V\) es el volumen, \(n\) es el número de moles, \(R\) es la constante de los gases, \(T\) es la temperatura, y \(a\) y \(b\) son constantes específicas del gas. Para el CO₂, \(a = 3.592\, L^2\cdot atm/mol^2\) y \(b = 0.0427\, L/mol\). Si tenemos 1 mol de CO₂ a 300K en un volumen de 1L, ¿cuál es la presión?

En un canal trapezoidal, la profundidad crítica \(y_c\) satisface la ecuación:

$$ \frac{Q^2}{g} = \frac{(by + my^2)^3}{b + 2y\sqrt{1+m^2}} $$

donde \(Q = 2\, m^3/s\) es el caudal, \(g = 9.81\, m/s^2\) es la gravedad, \(b = 1\, m\) es el ancho del fondo, y \(m = 1\) es la pendiente lateral. Encuentra \(y_c\).

Para la función \(f(x) = xe^x - 1\):

  • a) Demuestra que tiene una única raíz en el intervalo \([0,1]\).
  • b) Estudia las condiciones de convergencia del método del punto fijo para las siguientes transformaciones:
    • \(g_1(x) = e^{-x}\)
    • \(g_2(x) = \ln(1/x)\)
    • \(g_3(x) = x - \frac{xe^x - 1}{e^x + xe^x}\)
  • c) ¿Cuál de estas transformaciones garantiza convergencia más rápida?

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{pmatrix} \cos(x) & 1 & 2 & 3 \\ 0 & 1 & 0 & 1 \\ x & 2 & 3 & 4 \\ \sin(x) & x & 1 & \cos(x) \end{pmatrix} \]

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

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\).

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.

Se aborda la convergencia de estos métodos, la velocidad con la que se aproximan a la solución y las condiciones necesarias para poder alicarse. Además, se discuten estrategias para la localización y separación de raíces, haciendo hincapié en la importancia de una elección adecuada del intervalo inicial y de las aproximaciones iniciales para garantizar la precisión en la obtención de soluciones numéricas.

Los aspectos clave en el estudio de los métodos numéricos de este tema 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 no requiere el cálculo explícito de la derivada, sino que aproxima la pendiente mediante la cuerda que une dos puntos. Este método es útil cuando la derivada de la función cuyos ceros se quieren obtener 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 el proceso.
Capítulo
Aproximación de funciones por polinomios

Introduccion

El ajuste por polinomios en métodos numéricos consiste en encontrar un polinomio de cierto grado que aproxime un conjunto de datos que pueden haberse obtenido de un muestreo o una experimentación o bien de una función dada. Se utiliza cuando se quiere representar una función o una serie de datos mediante una expresión polinómica para facilitar cálculos, interpolaciones o predicciones.

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 estimar 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 que calcula los polinomios base de Lagrange con tres nodos.

Método de Lagrange
Calcula los polinomios base de Lagrange asociados a los nodos $x_0=-1$, $x_1=1$ y $x_2=2$. y luego 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:

$$\color{red}{x_o = - 1}\,\,\,\,\,\,\,\,\,\,\color{blue}{x_1 = 1}\,\,\,\,\,\,\,\,\,\,\,\color{green}{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 son:

$$\begin{array}{lll} {l_o}\left( x \right) & = \frac{{x - {\color{blue}{1}}}}{{{\color{red}{-1}} - {\color{blue}{1}}}} \cdot \,\frac{{x - {\color{green}{2}}}}{{{\color{red}{-1}} - {\color{green}{2}}}} \\ \\ & = \frac{1}{6}\left( {{x^2} - 3x + 2} \right) = \frac{1}{6}{x^2} - \frac{1}{2}x + \frac{1}{3} \end{array}$$ $$\begin{array}{lll} {l_1}\left( x \right) & = \frac{{x - \left( { {\color{red}{-1}}} \right)}}{{{\color{blue}{1}} - \left( { {\color{red}{-1}}} \right)}} \cdot \frac{{x - {\color{green}{2}}}}{{{\color{blue}{1}} - {\color{green}{2}}}} \\ \\ & = - \frac{1}{2}\left( {x + 1} \right)\left( {x - 2} \right) = - \frac{1}{2}{x^2} + \frac{1}{2}x + 1 \end{array}$$ $$\begin{array}{lll} {l_2}\left( x \right) & = \frac{{x - \left( {{\color{red}{-1}}} \right)}}{{{\color{green}{2}} - \left( { {\color{red}{-1}}} \right)}} \cdot \frac{{x - {\color{blue}{1}}}}{{{\color{green}{2}} - {\color{blue}{1}}}} \\ \\ & = \frac{1}{3}\left( {x + 1} \right)\left( {x - {\color{blue}{1}}} \right) = \frac{1}{3}{x^2} - \frac{1}{3} \end{array}$$

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_2}\left( x \right) =$$ $$p\left( x \right) = 2\,{l_0}\left( x \right) + {l_1}\left( x \right) + {l_2}\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 Jiménez

Genera un código Matlab/Octave para construir el polinomio de Lagrange a partir de los polinomios base que interpole un conjunto de datos dados.

%Añadir código

Aunque la fórmula del teorema anterior posee un interés teórico, existen otras formas de obtener el polinomio interpolador. Uno de estos ellos, 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 $x_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)
En Matlab se puede utilizar el comando vander para hallar la matriz de Vandermonde.

x=[-1 1 2]';
A=vander(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 para estimar el error de la aproximación.

Con los cálculos que se muestran en el documento siguiente 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, estos valores se pueden obtener dado que se conoce la función.

Error en la interpolación

El error de interpolación mide la diferencia entre la función real y el polinomio interpolante, proporcionando una estimación cuantitativa de la precisión de la aproximació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$ es el grado del polinomio, que en este caso es 2.

Si llamamos $M$ a la cota de la derivada tercera de $f$ en el intervalo, se tendrá que para cada $x$ en $[-1,2]$ se cumple,

$$\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 en funcion de $M$ será entonces:

$$M\cdot 2.112611790922380/6$$
Considerar la función $f(x)=sen(x)$ y el polinomio interpolador de Lagrange en los nodos $0$, $\pi/2$ y $\pi$. Vamos a calcular la cota del error de interpolación de Lagrange en el punto $\pi/4$.
En este caso, el polinomio de interpolación de Lagrange que se obtiene es

$$p\left( x \right) = - 0.4053{x^2} + 1.2732x$$

Según la expresión del error, el error en un punto $x$ entre $0$ y $pi$ sería

\[\left| {sen\left( x \right) - p\left( x \right)} \right| \leqslant \frac{{\mathop {\max }\limits_{c \in \left[ {0,\pi } \right]} \left| {{f^{(n + 1}}\left( c \right)} \right|}}{{3!}}\,\left| {x - 0} \right|\left| {x - \frac{\pi }{2}} \right|\left| {x - \pi } \right|\] $$ \le \frac{1}{{3!}}\left| {x - 0} \right|\left| {x - \frac{\pi }{2}} \right|\left| {x - \pi } \right|$$

Para encontrar una cota en todo el intervalo, se considera el polinomio $q(x)=x(x-\pi/2)(x-\pi)$ y se calculan sus máximos y mínimos, esto es, las raíces de la derivada. El valor absoluto máximo de $q$ en estos valores será una cota de $\left| {q\left( x \right)} \right|$.


format long
q=poly([0 pi/2 pi]);dq=polyder(q);
r=roots(dq);v=polyval(q,r)
max(abs(v))
%1.491790182328260

La cota del error sería entonces,

$$\left| {sen\left( x \right) - p\left( x \right)} \right| \le \frac{1}{{3!}}\left| {x - 0} \right|\left| {x - \frac{\pi }{2}} \right|\left| {x - \pi } \right| \le \frac{{1.492}}{6} \approx {\rm{0.248632}}$$

Dado que en este ejemplo se conoce la función, vamos a calcular una estimación del error de la aproximación entre la función y el polinomio interpolante evaluando en varios puntos y calculando el máximo de la diferencia entre $f$ y $p$ en todos ellos.


format long
%a es el polinomio interpolante
v=linspace(0,pi,300);
max(abs(polyval(a,v)-sin(v)))
%0.248631697054710

Función y polinomio de Lagrange interpolador del ejemplo 4.7
Interpola la función $f(x)=log(x)$ en los nodos ${0.99, 1, 1.1}$ utilizando polinomios de Lagrange obteniendo después aproximaciones de $log(x)$ en los puntos $0.95678$ y $1.03597$. Compara los valores obtenidos con los exactos. Da una cota del error de la aproximación en $[0.99, 1.1]$.


%Nodos: 0.9, 1, 1.1
%Función log(x)
format long
f=@(x) log(x);
n=2;x=[0.9 1 1.1]';fx=f(x);
A=[x ones(n+1,1)];t=x;
for k=1:n-1
	t=t.*x;
	A=[t A];
end
p=A\fx
%Comprobación
polyval(p,x)-f(x)
%cota de error
q=poly(x);dq=polyder(q);r=roots(dq);
v=polyval(q,r);M=max(abs(v))
%Derivada tercera de f: 2/x^3 el máximo es 2/(0.9^3)
%El error es M*2/(6*0.9^2)
error=M/(3*0.9^3)
% 1.759945950892248e-04

Nodos de Chebyshev

La elección de nodos que permite minimizar el valor de la expresión siguiente,

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

que aparece en la cota de error de interpolación de Lagrange, 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 tomando el polinomio de interpolación de grado $n=8$, calcular con Matlab/Octave los nodos de Chebyshev (9 nodos) y representarlos en el plano.

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));
plot(x,zeros(n+1),'o')

En la siguiente figura se muestran la distribución de los nodos de Chebyshev y se observa que no están igualmente distribuidos en el intervalo $[-3,3]$, se concentran más en los extremos.

Representación de 9 nodos de Chebyshev en el intervalo [-3,3]
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}}}} $$
Interpola la función $f(x)=sen(x)$ en los nodos $x_i=i \pi/10$ para $i=0,...,10$ utilizando polinomios de Lagrange y da una cota del error. Considera después 11 nodos de Chebyshev en el intervalo $[0, \pi]$ y analiza el error de la aproximación.

Representa la función y los dos polinomios obtenidos.

Dada la función de Runge \(f(x) = \frac{1}{1+25 x^2}\), halla el polinomio de Lagrange de grado menor o igual a 20 considerando puntos igualmente espaciados en \([-1, 1]\). Representa gráficamente la función y el polinomio interpolador.

n=20;% Número de nodos
f=@(x) 1./(1+25*x.^2);
u=linspace(-1,1);
plot(u,f(u))
%polinomio
x=linspace(-1,1,n)'
b=f(x)
m=n-1;
A=x.^(m:-1:0)
p=A\b
hold on
plot(u,polyval(p,u))
hold off
Fenómeno Runge

Dada la función de Runge \(f(x) = \frac{1}{1+25 x^2}\), halla los polinomios interpoladores de Lagrange de grado 20 considerando los nodos de Chebyshev en el intervalo \([-1, 1]\). Representa gráficamente la función y los polinomios interpoladores.

n=20;%Grado polinomio
f=@(x) 1./(1+25*x.^2);
x=linspace(-1,1);
plot(x,f(x))
%Nodos
x=cos((2*(0:n)+1)*pi/(2*n+2))';%21 nodos
%polinomio
b=f(x)
A=x.^(n:-1:0)
p=A\b
hold on
plot(x,polyval(p,x))
hold off
Fenómeno Runge: nodos de Chevishev

Diferencias divididas de Newton

El método de diferencias divididas de Newton es una técnica de interpolación que permite construir un polinomio de forma incremental, evitando recalcular desde cero cuando se añade un nuevo nodo. Gracias a su estructura recursiva, solo es necesario actualizar los términos nuevos, lo que facilita su aplicación en problemas donde se agregan puntos progresivamente.

*** Pendiente de hacer ***
*** Pendiente de hacer ***

Interpolación de Hermite

Los polinomios de Hermite extienden la interpolación de Lagrange al incluir no solo los valores de la función en ciertos puntos, sino también sus derivadas. Aseguran que la interpolación no solo pase por los puntos dados, sino que también respete las derivadas en esos puntos.

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}$ son $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$ cumpliendo
$$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 fije 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.

Polinomio de Hermite con cuatro nodos
Escribe el sistema que permite encontrar el polinomio interpolador de Hermite para los siguientes valores:
  • $f(0) = 1\,\,\,\,f'(0) = 1$
  • $f(1) = 2\,\,\,\,f'(1) = 3$

Determina el polinomio sin utilizar Matlab/Octave.

Error de interpolación

Se muestra a continuacion la expresión del error que nos permite estimar la precisión de la interpolación de Hermite.

COTA DEL ERROR. Supongamos que la función $f$ es $n+1$ veces derivable en el intervalo $[a,b]$ y además 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|$$
Dada la función $f(x)=e^{x/2}$ y los nodos $x_0=0$, $x_1=\pi/2$ y $x_2=\pi$, calcula el polinomio de Hermite que verifica $p(x_i)=f(x_i)$ y $p'(x_i)=f'(x_i)$. Da una cota del error de la aproximación.

Se define la función, su derivada y los nodos del ejemplo.


format long
f=@(x) exp(x/2);
df=@(x) exp(x/2)/2
x=[0;pi/2;pi];

El grado del polinomio a calcular es 2+1+1+1=5. Consideremos el término independiente del sistema a resolver.


dx=[f(x);df(x)]

Calculamos la matriz del sistema,


A=[x ones(3,1)];t=x;
for k=1:4
    t=t.*x
    A=[t A];
end
A
B=[2*x ones(3,1) zeros(3,1)];t=x;
for k=3:5
    t=t.*x;
    B=[k*t B];
end
B

Los coeficientes del polinomio se obtienen resolviendo un sistema de ecuaciones.


p=[A;B]\dx
%Comprobación
polyval(p,x)-f(x)
dp=polyder(p);polyval(dp,x)-df(x)

Calculamos una cota del error de la aproximación.


q=poly(x);q=conv(q,q);
dq=polyder(q);r=roots(dq);
v=polyval(q,r);
M=max(abs(v));
error=M*exp(pi/2)/((2^6)*factorial(6))
Dada la función $f(x)=log(1+x)$, calcula el polinomio de interpolación de Hermite $p(x)$$ que satisface

$$p\left( {{x_i}} \right) = f\left( {{x_i}} \right)\,\,\,\,,\,\,\,p'\left( {{x_i}} \right) = f'\left( {{x_i}} \right)\,\,\,\,\,\,\,,\,\,\,\,\,\,{x_i} = i/5\,\,\,\,\,\,0 \le i \le 5$$Da una cota del error.
**** Completar ****
Tomando como nodos $x_0=0$ y $x_1=1$, obtener el polinomio de interpolación de Hermite que interpola a la función $f(x)=cos(\pi x/2)$ en la forma siguiente:

$$p\left( {{x_i}} \right) = f\left( {{x_i}} \right)\,\,\,\,\,\,\,p'\left( {{x_i}} \right) = f'\left( {{x_i}} \right)\,\,\,\,\,\,\,\,\,p''({x_o}) = f''({x_o})$$

Da una cota del error de interpolación.

**** Completar ****

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.

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}$$

En el caso de todos los pesos igual a 1, el problema será minimizar la siguiente expresión:
$\min {\left\| {Ax - b} \right\|^2}$ donde

$$\begin{array}{l}Ax - b = \\\\ = \underbrace {\left( {\begin{array}{ccccccccccccccc}{{\mkern 1mu} x_0^k}&{{\mkern 1mu} x_0^{k - 1}}&{...}&{{\mkern 1mu} {x_0}}&1\\{{\mkern 1mu} x_1^k}&{x_1^{k - 1}}&{...}&{{\mkern 1mu} {x_1}}&1\\ \ldots & \ldots &{...}& \ldots & \ldots \\{x_n^k}&{{\mkern 1mu} x_n^{k - 1}}&{...}&{{\mkern 1mu} {x_n}}&1\end{array}} \right)}_{(n + 1) \times (k + 1)}\underbrace {\left( {\begin{array}{ccccccccccccccc}{{a_k}}\\{{a_{k - 1}}}\\ \ldots \\{{a_o}}\end{array}} \right)}_{\left( {k + 1} \right) \times 1}{\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} {\mkern 1mu} - \,\underbrace {\left( {\begin{array}{ccccccccccccccc}{f\left( {{x_o}} \right)}\\{f\left( {{x_1}} \right)}\\ \ldots \\{f\left( {{x_n}} \right)}\end{array}} \right)}_{(n + 1) \times 1}\end{array}$$
siendo $n+1$ el número de nodos y $k$ el grado del polinomio.
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 buscar el vector $x$ de ${\mathbb R}^3$ solución del problema $$\min \left\| r \right\| = \min \left\| {Ax - b} \right\|$$

La siguiente figura muestra el ajuste a una recta, en el sentido de mínimos cuadrados, a los puntos $(-1,3)$, $(2,-1)$, $(3,3)$, $(4,2)$ y $(5,0)$.

Ajuste lineal por mínimos cuadrados

En la siguiente figura se muestra el ajuste por mínimos cuadrados a un polinomio de grado 2 de los mismos puntos.

Ajuste cuadrático por 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$
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.


f=@(x) 1./(1+x.^2);
n=100;k=20;a=-5;b=5;
x=linspace(a,b,n+1)';fx=f(x);
A=[ x ones(n+1,1)];t=x;
for iter=1:k-1
	t=t.*x;
	A=[t A];
end;
[Q,R]=qr(A);
p=R(1:k+1,:)\Q(:,1:k+1)'*fx;
%Representamos la función
s=linspace(a,b,1001)';
fs=f(s);ps=polyval(p,s);
plot(s,[ps fs])
Representación de la aproximación del ejemplo

Autoevaluación

Actividad de autoevaluación

Ejercicios

Calcular el polinomio interpolador de grado 2 de una función que verifica: \(f(-1) = 2 \,\,\,\,f(1) = 1\,\,\,\,f(2) = 1\). Calcula este polinomio a partir de los polinomios base de Lagrange y resolviendo el sistema de ecuaciones.
Interpolar con MATLAB la función \(f(x) = e^{-x^2}\) 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.
Se considera la función $f\left( x \right) = \cos (x)$ en el intervalo $\left[ {0,\,\pi } \right]$.
  1. Escribe el sistema que permitiría obtener el polinomio de interpolación de Lagrange de la función $f\left( x \right)$ tomando como nodos ${x_o} = 0$, ${x_1} = \pi/2$, ${x_2} = \pi $.
  2. Calcula con Matlab el polinomio interpolador de Lagrange considerando 8 nodos equidistantes en el intervalo $\left[ {0,\,\pi } \right]$ siendo el primer nodo $0$ y $\pi$ el último. Dibuja la función y el polinomio interpolador calculado.
  3. ¿Cuál sería una cota del error de aproximación del polinomio obtenido en el apartado anterior en el intervalo $\left[ {0,\,\pi } \right]$?
  4. Considera 8 nodos de Chebyshev en $\left[ {0,\,\pi } \right]$ y escribe su valor. Determina el polinomio de interpolación de la función en este intervalo considerando estos nodos. Dibuja la función y el polinomio interpolador.
  5. ¿Cuál sería una cota del error de aproximación del polinomio obtenido en el apartado anterior en el intervalo $\left[ {0,\,\pi } \right]$?
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.

Se considera la función $f(x)=cos(x)$ en el intervalo $[0,\pi]$. Considera el siguiente problema de Hermite, donde $p$ es el polinomio interpolador.

$$\begin{array}{l}f\left( 0 \right) = p(0) & & f'\left( 0 \right) = p'(0) & & f''\left( 0 \right) = p''(0)\\f\left( {\frac{\pi }{2}} \right) = p\left( {\frac{\pi }{2}} \right) & & f'\left( {\frac{\pi }{2}} \right) = p'\left( {\frac{\pi }{2}} \right)\\f\left( \pi \right) = p\left( \pi \right)\end{array}$$ Escribe el sistema que habría que resolver para hallar el polinomio $p$ y la expresión que daría una cota del error de la interpolación de Hermite en cada $x$ de $[0,\pi]$.
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 y compara el resultado con el máximo en valor absoluto de la diferencia entre la función y el polinomio tomando 500 puntos del intervalo $[0,1]$.

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

  1. \(p(x_i) = f(x_i)\), \(p'(x_i) = f'(x_i)\) donde \(x_i\) son 10 puntos igualmente espaciados en el intervalo \([0, 1]\).
  2. \(p(x_i) = f(x_i)\), donde $p$ es un polinomio de grado 10 siendo \(x_i\) son los nodos de Chebyshev en el intervalo \([0,1]\).

Representa gráficamente ambos polinomios junto con la función \(f(x)\).

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) = e^{-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.
Dada la función $f(x)=\frac{e^{-x^2} \sin(x)} {x^3+x^2+1}$ calcula el polinomio $p$ de grado 25 mejor aproximación de $f$ en el sentido de mínimos cuadrados, tomando como datos 100 puntos $(x_i,f(x_i))$ estando $x_i$ igualmente espaciados en el intervalo $[0, 2\pi]$.
RESUMEN

Este capítulo, aborda 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. El interés de estas técnicas 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, aún siendo continuas, no tienen primitiva elemental, por ejemplo, $e^{x^2}$.
  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 o la posibilidad de obtener su valor en un número finito de puntos.

Estas razones obligan a encontrar métodos alternativos para calcular de forma aproximada el valor de una integral definida en un intervalo. 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.

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

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 la siguiente,

$$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. En la siguiente tabla se recogen unos datos para calcular el valor de $Q$ de forma aproximada.

Profundidad (m) Velocidad (m/s)
0 0.0
1 1.2
2 2.1
3 2.4
4 2.0
5 1.5
6 0.0
Velocidad del agua en función de la profundidad

En la siguiente figura, se muestra la velocidad del agua en función de la profundidad. El área bajo la curva es el valor a calcular.

Velocidad del agua en función de la profundidad

Si utilizamos una de las aproximaciones que se verá en este tema, la fórmula de los trapecios, se podría obtener un valor aproximado mediante la siguiente expresión :

\[ 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.

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}}$$
Como se verá posteriormente, el cálculo de los pesos $\omega_i$ se obtendrá de otra forma más sencilla sin integrar los polinomios base de Lagrange.
Demostrar que 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 al 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. Una 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)} $$ de tipo interpolatorio tiene grado de exactitud mayor o igual a $n$.
Comprobar que la fórmula $$\color{blue}{\int\limits_0^4 {f\left( x \right)dx}} \approx \color{green}{2f\left( 1 \right) + 2f\left( 3 \right)}$$ tiene orden de precisión 1.
Veamos que es exacta de grado $n=1$. Se puede comprobar que es exacta para $f(x)=1$, $$\color{blue}{\int\limits_0^4 {1\,dx} =4}= \color{green}{2 + 2}$$ Es exacta para $f(x)=x$ $$\color{blue}{\int\limits_0^4 {x\,dx}=\frac{4^2}{2} }= \color{green}{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 $$\color{blue}{\int\limits_0^4 {{x^2}\,dx} = {{64} \over 3} }\ne 2 \color{green}{\cdot {1^2} + 2 \cdot {3^2} = 20}$$
En este capítulo veremos que este tipo de fórmulas de cuadratura son eficientes en intervalos de longitud pequeña. Cuando el intervalo es de longitud grande, se deberá descomponer en subintervalos pequeños y aplicar 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} } $$

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

Analizaremos en este apartado las fórmulas de cuadratura de Newton-Cotes que son de tipo interpolatorio donde los nodos son 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

Dado que esta fórmula es interpolatoria, será exacta con orden de exactitud $n$. Por lo tanto, los nodos se podrán calcular resolviendo un sistema de ecuaciones.

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.

De cara a obtener los pesos, resulta de utilidad el resultado siguiente.

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}$$

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 de la fórmula interpolatoria 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$$

En el siguiente interactivo se muestra dos intervalos, $[a,b]$ y $[c,d]$ y cómo está vinculado el punto $x$ en $[a,b]$, en rojo, con el correspondiente punto $t$ en $[c,d]$ que se muestra en naranja teniendo en cuenta el mapeo anterior.

Mapeo entre dos intervalos $[a, b]$ y $[c, d]$

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

Calculamos a continuación las primeras fórmulas de Newton-Cotes tomando diferentes número de nodos $x_0$, $x_1$, ..., $x_n$. Para ello, utilizaremos que el cálculo de los pesos no depende del intervalo siempre que se consideren equidistantes en dicho intervalo.

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

En este caso se considerarán dos nodos en el intervalo $[a,b]$, esto es, $x_0=a$ y $x_1=b$. La fórmula de cuadratura será de la forma, $$\int\limits_a^b {f\left( x \right)dx} \approx \left( {b - a} \right)\left[ {{\color{red}{{\omega _o}}}f\left( a \right) + {\color{red}{{\omega _1}}}f\left( b \right)} \right]$$

Teniendo en cuenta que el cálculo de los pesos, no depende del intervalo considerado, tomaremos $[a,b]=[0,1]$. Para obtener $\omega_0$ y $\omega_1$, aplicamos que esta fórmula de cuadratura es exacta de grado $n=1$, por lo que los valores buscados cumplirán el siguiente sistema:

$$\begin{aligned} & \text{Exacta para }\,\,f(x)=1\,\,\,\,\,\,\,\,\,& 1 = \int\limits_0^1 {dx} = {\omega _o} + {\omega _1} \\ & \text{Exacta para }\,\,f(x)=x\,\,\,\,\,\,\,\,\,&{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, la fórmula de cuadratura es

$$\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 nodos equidistantes en $[a,b]$: $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[ {{\color {red}{\omega _o}}f\left( a \right) +{\color{red} {\omega _1}}f\left( {{{a + b} \over 2}} \right) + {\color{red}{\omega _2}}f\left( b \right)} \right]$$ Para determinar los nodos consideramos el intervalo $[a,b]=[-1,1]$. Resolviendo el sistema de 3 ecuaciones con 3 incógnicas, $${\text{Exacta para} \,\,f(x)=1 \,\,\,\,\,\,\,\,\, 2 = \int\limits_{ - 1}^1 {dx} = 2\left[ {{\omega _o} + {\omega _1} + {\omega _2}} \right]}$$ $${\text{Exacta para} \,\,f(x)=x\,\,\,\,\,\,\,\,\, 0 = \int\limits_{ - 1}^1 {x\,dx} = 2\left[ { - {\omega _o} + 0 \cdot {\omega _1} + {\omega _2}} \right]}$$ $${\text{Exacta para}} \,\,f(x)=x^2,\,\,\,\,\,\,\,\,{2 \over 3} = \int\limits_{ - 1}^1 {{x^2}\,dx} = 2\left[ {{\omega _o} + 0 \cdot {\omega _1} + {\omega _2}} \right]$$

Resolviendo el sistema, obtenemos ${\omega _o} = {\omega _2} = {1 \over 6}$, ${\omega _1} = {2 \over 3}$. Por lo tanto, la fórmula de cuadratura será:

$$\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


En la siguiente escena interactiva se puede ver las aproximaciones que proporciona esta cuadratura eligiendo la función y el intervalo a considerar. Puede observarse cómo mejora la aproximación cuando la longitud del intervalo es más pequeño.

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 equidistantes a considerar en el intervalo $[a,b]$ 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, la fórmula de cuadratura es:

$$\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
Se puede observae que los pesos en estas fórmulas de cuadratura son simétricos, es decir, el primero es igual al último, el segundo es igual al penúltimo, etc.

Procediendo de la misma forma, se pueden obtener las fórmulas de Newton-Cotes que se recogen a continuación.

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.

En este apartado se analizará error de la aproximación, es decir, la diferencia entre el valor exacto dado por la integral y el valor aproximado que se obtiene con 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, 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. Calcular el valor aproximado y una cota del error de dicha aproximación.
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.

Considerar la integral $\int\limits_0^\pi {{e^{sen\left( x \right)}}dx} $ usando la regla del trapecio compuesta considerando $N=8$ intervalos. Calcular el valor aproximado y una cota del error de dicha aproximación.
*** Solución ***

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)$$
Considerar la integral $\int\limits_0^\pi {{e^{sen\left( x \right)}}dx} $ usando la regla compuesta de Simpson considerando $N=8$ intervalos. Calcular el valor aproximado y una cota del error de dicha aproximación.
*** Solución ***
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. Da una cota del error de la aproximación.
*** Añadir explicación ****

Métodos adaptativos

En Los métodos compuestos se considera la longitud de cada subintervalo igual, por lo que no tienen en cuenta el comportamiento de la función.

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

En primer lugar, 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]$.

Además, 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|}$$
Se puede observar que 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}$.
*** Añadir solución ****

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á,

$$\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}$$

llamando $h=(b-a)/2$.

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 practicar con este procedimiento, se puede utilizar el fichero iehardy.m que a su vez utiliza la función hardy.m, que devuelve la aproximación de la integral utilizando la fórmula de Hardy. Estas dos funciones han sido desarrolladas por el profesor Eduardo Casas (ficheros Matlab).

[itg error]=iehardy(a,b,f)
%Devuelve tanto la estimación de la integral como
%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

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

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.
Mora Flores, W. (2022). Introducción a los métodos numéricos. Implementaciones en el lenguaje R. Recuperado de Matemáticas interactivas