5  Aproximación polinomial

Consultar el Capítulo 18: Series.

5.1 Aproximación por polinomios de Taylor

Consideremos el conjunto de funciones reales denominados polinomios algebraicos que son de la forma

\[\begin{equation} P_n(x)=a_n x^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0 \end{equation}\]

donde \(n\) es un entero no negativo; \(a_0, ..., a_n\) son constantes reales y \(a_n\neq 0\).

Dada una función definida y continua sobre un intervalo cerrado y acotado, existe un polinomio que está tan cerca de la función dada como se desee.

Teorema 5.1 Aproximación de Weierstrass. Sea \(f\) una función definida y continua en el intervalo \([a,b]\). Para cada \(\varepsilon >0\), existe un polinomio \(P\), tales que

\[\begin{equation} |f(x)-P(x)|<\varepsilon \end{equation}\]

para cualquier \(x\in [a,b]\).

Inicialmente consideraremos la aproximación por medio de polinomios alrededor de un punto utilizando las series de Taylor.

Teorema 5.2 Taylor. Suponga que \(f\in C^n[a,b]\), \(f^{(n+1)}\) existe en \([a,b]\) y \(x_0\in [a,b]\). Para cada \(x\in [a,b]\), existe un número \(\xi (x)\) entre \(x_0\) y \(x\) con

\[\begin{equation} f(x)=P_n(x)+R_n(x) \end{equation}\]

donde

\[\begin{equation} \begin{aligned} P_{n}(x) &=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+\frac{f^{\prime \prime}\left(x_{0}\right)}{2 !}\left(x-x_{0}\right)^{2}+\cdots+\frac{f^{(n)}\left(x_{0}\right)}{n !}\left(x-x_{0}\right)^{n} \\ &=\sum_{k=0}^{n} \frac{f^{(k)}\left(x_{0}\right)}{k !}\left(x-x_{0}\right)^{k} \end{aligned} \end{equation}\]

y

\[\begin{equation} R_n(x)=\frac{f^{(n+1)}(\xi (x))}{(n+1)!}(x-x_0)^{n+1} \end{equation}\]

Aquí \(P_n(x)\) es llamado el \(n\)-ésimo polinomio de Taylor para \(f\) alrededor de \(x_0\) y \(R_n(x)\) recibe el nombre de residuo (o error de truncamiento) relacionado con \(P_n(x)\).

Los polinomios de Taylor concuerdan tanto como es posible con una función dada en un punto específico, pero concentran su precisión cerca de ese punto. Un buen polinomio de aproximación debe dar precisión relativa sobre un intervalo completo y, en general, los polinomios de Taylor no lo hacen.

Ejemplo 5.1 Calcular los seis primeros polinomios de Taylor de \(x_0=0\) para \(f(x)=e^x\). Ya que las derivadas de \(f(x)\) son todas \(e^x\), que evaluadas en \(x_0=0\) dan 1 los polinomios de Taylor son

\[\begin{equation} \begin{array}{l} P_{0}(x)=1, \quad P_{1}(x)=1+x, \quad P_{2}(x)=1+x+\frac{x^{2}}{2}, \quad P_{3}(x)=1+x+\frac{x^{2}}{2}+\frac{x^{3}}{6}, \\ P_{4}(x)=1+x+\frac{x^{2}}{2}+\frac{x^{3}}{6}+\frac{x^{4}}{24}, \quad \text { y } \quad P_{5}(x)=1+x+\frac{x^{2}}{2}+\frac{x^{3}}{6}+\frac{x^{4}}{24}+\frac{x^{5}}{120} . \end{array} \end{equation}\]

Código
import numpy as np
import matplotlib.pyplot as plt
import math

x = np.linspace(-1, 3, 200)
y = np.zeros(len(x))

grado = ["Constante", "Grado 1", "Grado 2", "Grado 3", "Grado 4",  "Grado 5" , "Grado 6"]
plt.figure(figsize = (8,5))
for n, label in zip(range(7), grado):
  y = y + x ** n / math.factorial(n)
  plt.plot(x,y, label = label)


plt.plot(x, np.exp(x), color = 'k', label = "Analítica")  
#plt.axhline(0, color = "black", linewidth = 0.8, linestyle = "--") #Eje x
#plt.axvline(0, color = "black", linewidth = 0.8, linestyle = "--") #Eje y

plt.xlabel("x")
plt.ylabel("y")
plt.grid()
plt.legend()

plt.show()

Para los polinomios de Taylor, toda la información que se usa en la aproximación se concentra en el único número \(x_0\), por lo que, en general, éstos darán aproximaciones imprecisas conforme nos alejamos de \(x_0\). El uso principal de los polinomios de Taylor en el análisis numérico no tiene propósitos de aproximación, sino la derivación de técnicas numéricas y el cálculo de errores.

5.2 Errores de truncamiento con las series de Taylor

En análisis numérico usualmente hay dos fuentes de error, los errores de redondeo y el de truncamiento. Los errores de redondeo son debidos a la inexactitud en la representación de números reales en una computadora y las operaciones aritméticas llevadas a cabo con éstos. Los errores de truncamiento se deben al nivel de aproximación que brinda cierto método, por ejemplo, cuando se utiliza una serie de Taylor para aproximar una función. Si usamos la serie de Taylor para aproximar la función \(f(x)=e^x\), tenemos:

\[\begin{equation} e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+\frac{x^5}{5!}+\cdots. \end{equation}\]

Dado que se estaría considerando una sucesión infinita para aproximar la función, al utilizar sólo algunos términos resultará un error de truncamiento. Por ejemplo, si se usan sólo los primeros cuatro términos para aproximar el valor de \(e^2\), se obtiene:

\[\begin{equation} e^2 \approx 1+2+\frac{2^2}{2!}+\frac{2^3}{3!}=6.333333 \end{equation}\]

Por lo tanto existe un error asociado al truncar los elementos de la sucesión en la serie de Taylor. Tomando en cuenta el Teorema 5.2, una función \(f\) puede escribirse como la aproximación de la serie de Taylor (el \(n\)-ésimo polinomio de Taylor ) más un término del error de truncamiento

\[\begin{equation} f(x)=P_n(x)+R_n(x) \end{equation}\]

Conforme más términos se utilicen en el polinomio, mejor será la aproximación. Utilicemos Python para generar una sucesión de aproximaciones.

Ejemplo 5.2 Aproximar \(e^2\) usando polinomios de Taylor de diferente grado y mostrar los resultados.

Código
exp_2 = 0
x = 2

for i in range(10):
  exp_2 = exp_2 + (x ** i)/ math.factorial(i)
  print(f"Aproximación con el polinomio de grado {i}: {exp_2}")
print("--------------------------")
print(f"El valor de e^2 es: {np.exp(2)}")
Aproximación con el polinomio de grado 0: 1.0
Aproximación con el polinomio de grado 1: 3.0
Aproximación con el polinomio de grado 2: 5.0
Aproximación con el polinomio de grado 3: 6.333333333333333
Aproximación con el polinomio de grado 4: 7.0
Aproximación con el polinomio de grado 5: 7.266666666666667
Aproximación con el polinomio de grado 6: 7.355555555555555
Aproximación con el polinomio de grado 7: 7.3809523809523805
Aproximación con el polinomio de grado 8: 7.387301587301587
Aproximación con el polinomio de grado 9: 7.3887125220458545
--------------------------
El valor de e^2 es: 7.38905609893065


5.2.1 Estimación del error de truncamiento

Utilizando la serie de Taylor para aproximar una función alrededor de \(x_0\) considerando los primeros \(n\) términos, tenemos:

\[\begin{equation} f(x) = P_n(x) + R_n(x) = \sum_{k=0}^{n} \frac{f^{(k)}\left(x_{0}\right)}{k !}\left(x-x_{0}\right)^{k} + R_n(x) \end{equation}\]

El residuo \(R_n(x)\) de la serie de Taylor, o error de truncamiento, cuantifica la diferencia del polinomio \(P_n(x)\) y el valor de \(f(x)\). Es posible estimar el error utilizando una cota. El Teorema 5.2 nos indica que existe un \(z\) entre \(x_0\) y \(x\) tal que

\[\begin{equation} R_n(x)=\frac{f^{(n+1)}(z)}{(n+1)!}(x-x_0)^{n+1} \end{equation}\]

Si es posible calcular el valor máximo \(M\) de \(|f^{(n+1)}|\) en el intervalo, se tiene:

\[\begin{equation} |R_n(x)|\leq \frac{M}{(n+1)!}|x-x_0|^{n+1} \end{equation}\]

Esto nos brinda una cota para el error de truncamiento.

Ejemplo 5.3 Estimar una cota para el residuo del valor aproximado de \(e^2\) usando el polinomio de Taylor de grado \(n=9\).

Previamente desarrollamos el polinomio de Taylor de \(f(x)=e^x\) alrededor de \(x_0=0\), además, tenemos que \(f^{(n)}(x)=e^x\) para toda \(n\in \mathbb{N}\), luego, el error para \(x=2\) y \(n=9\) es

\[\begin{equation} R_n(2)= \frac{f^{(9+1)}(z)}{(9+1)!} x^{(9+1)}=\frac{e^z2^{10}}{10!} \end{equation}\]

donde \(z\in [0,2]\) y \(e<3\); por lo tanto,

\[\begin{equation} |R_n(z)| \leq \frac{3^2 2^{10}}{10!} = 0.0025397 \end{equation}\]

Verifiquemos:

Código
residuo = np.abs(exp_2-np.exp(2))
print(f"El residuo es: {residuo}")

cota_residuo = 9 * (2 ** 10) /math.factorial(10)
print(f"Y la cota para tal residuo es: {cota_residuo}")

comparacion = residuo <= cota_residuo
print(f"Se satisface residuo <= cota: {comparacion}")
El residuo es: 0.0003435768847959153
Y la cota para tal residuo es: 0.0025396825396825397
Se satisface residuo <= cota: True