# POLINOMIO DE INTERPOLACIÓN DE HERMITE
Grupo $\iota$ (iota)<br/>
Importante: Para correr los códigos, es necesario tener instalado lo siguiente:
- Python 2.7 o superior
- Numpy (para el manejo de arreglos optimizados)
- Sympy (para los polinomios)
- Matplotlib (para las gráficas)

Consideremos el problema de buscar un polinomio que cumpla con las siguientes características:
- Sean $x_0, . . . , x_n$ números distintos pertenecientes al intervalo $[a,b]$ de $f$ en $x_i$, un polinomio $p(x_i)$ que aproxime a las mismas imágenes de $f(x_i)$ con $i=0,1,2,...,n$

$$p(x_i)=f(x_i)$$


- Además, $p(x_i)$ debe aproximar a las imágenes de la primera derivada de $f(x_i)$

$$p'(x_i)=f'(x_i)$$

El polonomio que cumple con esas características es el **_Polinomio de Interpolación de Hermite_**.

## TEOREMA:

Si $f ∈ C^1 [a, b] $ y $x_0, . . . , x_n ∈ [a, b]$ son distintos, el **único** polinomio de menor grado que concuerda con $f$ y $f'$ en $x_0,x_1,...,x_n$ es el polinomio de Hermite de grado a lo sumo $2n + 1$ dado por

$$H_{2n+1}(x) = \sum_{j=0}^{n} f(x_j)H_{n,j}(x) + \sum_{j=0}^{n} f'(x_j)\hat{H}_{n,j}(x)$$

Siendo: 

$$H_{n,j}(x) = [1 - 2(x-x_j)L'_{n,j}(x_j)][L_{n,j}(x)]^2$$
$$\hat{H}_{n,j}(x) = (x-x_j)[L_{n,j}(x)]^2$$

Donde cada $L_{n,j}(x)$ son el $i$-ésimo coeficiente del polonomio de Lagrange de grado n.

## DEMOSTRACIÓN:

- ### $H_{2n + 1}(x) = f(x)$

Al igual que el _Lagrange_, Hermite es un polinomio $H_{2n + 1}(x)$ que interpola los mismos puntos que una función $f(x)$, por eso se le denomina **_polinomio osculante_**, ya que no tendrá específicamente la misma forma que $f(x)$, si no que solo "besará" los puntos dados de la función.

Por lo tanto, recordemos que en _Lagrange_:

$$L_{n,j}(x_i) = \begin{Bmatrix}0, i \neq j \\1, i=j\end{Bmatrix}$$

Entonces, cuando $i \neq j$:

$$H_{n,j}(x_i) = 0$$ 
$$y$$ 
$$\hat{H}_{n,j}(x_i)=0$$

Por lo que para cada $i$:

$$H_{n,i}(x_i) = [1 - 2(x_i-x_i)L'_{n,i}(x_i)]\cdot 1^2 = 1$$ 
$$y$$ 
$$\hat{H}_{n,i}(x_i) = (x_i-x_i)\cdot1^2 = 0$$

Sustituyendo:

$$H_{2n+1}(x_i) = \sum_{\substack{j=0 \\j\neq i}} ^{n} f(x_j) \cdot 0 + f(x_i) \cdot 1 + \sum_{j=0}^{n} f'(x_j) \cdot 0$$
$$H_{2n+1}(x_i) = f(x_i)$$
$$lqqd$$

- ### $H'_{2n + 1}(x) = f'(x)$

Realizando las derivadas obtenemos:

$$H'_{n,j}(x_i) = -2L'_{n,j}(x_i)\cdot[L_{n,j}(x_i)]^2 + 2\cdot[1 - 2(x_i-x_j)L'_{n,j}(x_i)]\cdot[L_{n,j}(x_i)]\cdot[L'_{n,j}(x_i)]$$
$$H'_{n,j}(x_i) = -2L'_{n,j}(x_i) + 2L'_{n,j}(x_i)$$
$$H'_{n,j}(x_i) = 0$$

Por lo tanto, $H'_{n,j}(x_i) = 0$ para todas las $i$ y $j$, finalmente:

$$\hat{H}'_{n,j}(x_i) = [L_{n,j}(x_i)]^2 + (x_i - x_j)2L_{n,j}(x_i)L'_{n,j}(x_i)$$
$$\hat{H}'_{n,j}(x_i) = 0$$

Sustituyendo:

$$H'_{2n+1}(x_i) = \sum_{j=0}^{n} f(x_j) \cdot 0 + \sum_{\substack{j=0\\j\neq i}}^{n} f'(x_j) \cdot 0 + f'(x_i) \cdot 1$$
$$H'_{2n+1}(x_i) = f'(x_i)$$
$$lqqd$$

## VENTAJAS:
- Además de encontrar con Hermite un polinomio que tenga las mismas imágenes que la función original, sus derivadas también son las mismas imágenes que las derivadas de la función original.
- Es fácil de calcular ya que garantiza la posición de los frames al ser una interpolación además de brindar la certeza de que la tangente de la curva generada es continua a lo largo de multiples segmentos.
- La precisión será más exacta, ya que las rectas tangentes serán las mismas que las de la función original.

## DESVENTAJAS:
- Ya que el grado del polinomio que cumple con los requisitos es de grado $2n + 1$, el grado n para obtener el polinomio de Hermite siempre será más alto de lo necesario.
- Requiere la disponibilidad de las primeras derivadas, lo cual en muchos casos son desconocidas.
- Similar a Lagrange, Hermite requiere que $f'(x_i)$ esté dentro de $0 < i < 1$, y no todas las funciones son capaces de cumplirlo.

## EJERCICIOS:

- ### Ejercicio 1

Use el polinomio de Hermite que concuerda con los datos listados en la tabla para encontrar una aproximación de $f(1.5)$.


|$k$|$x_k$|$f(x_k)$   |$f'(x_k)$   |
|---|-----|-----------|------------|
| 0 | 1.3 | 0.6200860 | −0.5220232 |
| 1 | 1.6 | 0.4554022 | −0.5698959 |
| 2 | 1.9 | 0.2818186 | −0.5811571 |


**Solución:** 
Primero calculamos los polinomios de Lagrange y sus derivadas.

$$L_{2,0}(x)= \frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}= \frac{50}{9}x^2-\frac{175}{9}x+\frac{152}{9},   \ \ \ \ \ \ \ \ \ L'_{2,0}(x)=\frac{100}{9}x-\frac{175}{9};$$

$$L_{2,1}(x)= \frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}= \frac{-100}{9}x^2-\frac{320}{9}x+\frac{247}{9},  \ \ \ \ \ \ \ \ \ L'_{2,1}(x)=\frac{-200}{9}x-\frac{320}{9};$$

$$L_{2,2}(x)= \frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}= \frac{50}{9}x^2-\frac{145}{9}x+\frac{104}{9},  \ \ \ \ \ \ \ \ \ L'_{2,2}(x)=\frac{100}{9}x-\frac{145}{9}.$$

Los polinomios $H_{2,j}(x)$ y $\hat{H}_{2,j}(x)$ son entonces

$$H_{2,0}(x)=[1-2(x-1.3)(-5)](\frac{50}{9}x^2-\frac{175}{9}x+\frac{152}{9})^2 = (10x-12)(\frac{50}{9}x^2-\frac{175}{9}x+\frac{152}{9})^2,$$

$$H_{2,1}(x)=1.(\frac{-100}{9}x^2+\frac{320}{9}x-\frac{247}{9})^2,$$

$$H_{2,2}(x)=10(2-x)(\frac{50}{9}x^2-\frac{145}{9}x+\frac{104}{9})^2,$$

$$\hat{H}_{2,0}(x)=(x-1.3)(\frac{50}{9}x^2-\frac{175}{9}x+\frac{152}{9})^2,$$

$$\hat{H}_{2,1}(x)=(x-1.6)(\frac{-100}{9}x^2+\frac{320}{9}x-\frac{247}{9})^2,$$

$$\hat{H}_{2,2}(x)=(x-1.9)(\frac{50}{9}x^2-\frac{145}{9}x+\frac{104}{9})^2.$$

Finalmente, multiplicamos los $H_{2,j}(x)$ por las imagenes en "y" $f(x_k)$ y los $\hat{H}_{2,j}(x)$ por los valores de las derivadas  $f'(x_k)$

$$H_5(x) = 0.6200860 H_{2,0}(x) + 0.4554022 H_{2,1}(x) + 0.2818186 H_{2,2}(x) − 0.5220232 \hat{H}_{2,0}(x) - 0.5698959 \hat{H}_{2,1}(x) - 0.5811571 \hat{H}_{2,2}(x)$$

$$H_5(1.5) = 0.6200860 (\frac{4}{27}) + 0.4554022 (\frac{64}{81}) + 0.2818186 (\frac{5}{81}) − 0.5220232 (\frac{4}{405}) - 0.5698959 (\frac{-32}{405})  - 0.5811571 (\frac{-2}{405})$$

$$H_5(1.5) = {\color{green}{0.5118277}}$$

- ### Ejercicio 1.1: Realizando el ejercicio anterior con python


```python
from sympy import *
import matplotlib.pyplot as plt
import numpy as np

x = Symbol("x")

'''
n : valor del grado del polinomio 2n + 1
xs : valores de x
ys : valores de y
dys : valores de la primera derivada
'''

def hermite(n, xs, ys, dys):
    h = []
    hatH = []

    for i in range(0, (n+1)//2):
        l = lagrangeFactor(n, xs, i)
        d = diff(l)
        f = (1-2*(x-xs[i])*d.subs(x, xs[i]))*l**2
        hatF = (x-xs[i])*l**2
        h.append(f)
        hatH.append(hatF)

    p = 0

    for i in range(0, (n+1)//2):
        p += ys[i]*h[i]

    for i in range(0, (n+1)//2):
        p += dys[i]*hatH[i]

    return p


'''
n : valor del grado del polinomio 2n + 1
xs : valores de x
k : valor iterativo
'''

def lagrangeFactor(n, xs, k):
    L = 1
    for i in range(0, (n+1)//2):
        if (i != k):
            L *= (x - xs[i])/(xs[k] - xs[i])
    return L


xs = [1.3, 1.6, 1.9]
ys = [0.6200860, 0.4554022, 0.2818186]
dys = [-0.5220232, -0.5698959, -0.5811571]

pol = hermite(5, xs, ys, dys)
pol.expand()

```




$\displaystyle - 0.00277469135824404 x^{5} + 0.024031790125548 x^{4} - 0.0145560802536693 x^{3} - 0.235216169740852 x^{2} - 0.00822922346583255 x + 1.00194406469399$



Por lo tanto, al sustituír $H_{2n + 1}(1.5)$ obtenemos:


```python
pol.subs(x, 1.5)

```




$\displaystyle 0.511827701728394$



Graficando los puntos y el polinomio obtenemos:


```python
# Datos
a = np.min(xs[0]-1)
b = np.max(xs[len(xs)-1]+1)
hx = np.linspace(a,b,200)
py = lambdify(x,pol)
hy = py(hx)

# Gráfica
plt.plot(xs, ys, 'o', label='Puntos')
plt.plot(hx,hy,label='Polinomio')
plt.legend()
plt.xlabel('xi')
plt.ylabel('fi')
plt.title('Lagrange')
plt.show()
```

## INTERPOLACIÓN DE HERMITE CON DIFERENCIAS DIVIDIDAS

Las diferencias divididas generalizadas se construyen de igual manera que las _Diferencias Divididas de Newton_, con la única diferencia que ahora se necesita replicar nuestras muestras $x_i$ tantas veces como las derivadas que poseamos, en este caso se estudiara únicamente cuando se conoce la primera derivada. 

De igual manera que en la interpolación de Lagrange la interpolación de Hermite con el grado $2n + 1$ se escribirá inmediatamente calculadas las _Diferencias Divididas_.

$$H_{2n+1}(x) = f[x_0] + f[x_0,x_0](x-x_0)+...+f[x_0,x_0,...,x_n,x_n](x-x_0)^2(x-x_{n-1})^2(x-x_n)$$ 

Aparentemente se nota que $f[x_i,x_i]$ no estan definida puesto que

$$f[x_i, x_i] = \frac{f[x_i]-f[x_i]}{x_i-x_i} = \frac{0}{0}$$

Sin embargo, podemos tomar un paso infinitisimal $h$ para el termino resultando en

$$f[x_i+h, x_i] = \frac{f[x_i+h]-f[x_i]}{x_i+h-x_i} = \frac{f[x_i+h]-f[x_i]}{h}$$

Si se toma el limite cuando $h \rightarrow 0$ se tendrá

$$f[x_i, x_i] = f'(x_i)$$

Con lo anterior, es posible concluir que la nueva tabla de diferencias divididas es la siguiente:

| $z$      | $f(z)$            | $1^{ra} Diferencia Dividida$                 |$2^{da} Diferencia Dividida$                          |
|----------|-------------------|----------------------------------------------|------------------------------------------------------|
|$z_0=x_0$ |$ f[z_0) = f(x_0)$ |                                              |                                                      |
|          |                   |$f[z_0,z_1] = f'(x_0)$                        |                                                      |
|$z_1=x_0$ |$ f[z_1] = f(x_0)$ |                                              |$f[z_0,z_1,z_2]=\frac{f[z_1,z_2]-f[z_0,z_1]}{z_2-z_0}$|
|          |                   |$f[z_1,z_2] = \frac{f[z_2]-f[z_1]}{z_2-z_1}$  |                                                      |
|$z_2=x_1$ |$ f[z_2] = f(x_1)$ |                                              |$f[z_1,z_2,z_3]=\frac{f[z_2,z_3]-f[z_1,z_2]}{z_3-z_1}$|
|          |                   |$f[z_2,z_3] = f'(x_1)$                        |                                                      |
|$z_3=x_1$ |$ f[z_3] = f(x_1)$ |                                              |$f[z_2,z_3,z_4]=\frac{f[z_3,z_4]-f[z_2,z_3]}{z_4-z_2}$|
|          |                   |$f[z_3,z_4] = \frac{f[z_4]-f[z_3]}{z_4 - z_5}$|                                                      |
|$z_4=x_2$ |$ f[z_4] = f(x_2)$ |                                              |$f[z_3,z_4,z_5]=\frac{f[z_4,z_5]-f[z_3,z_4]}{z_5-z_3}$|
|          |                   |$f[z_4,z_5] = f'(x_2)$                        |                                                      |
|$z_5=x_2$ |$ f[z_5] = f(x_2)$ |                                              |                                                      |

- ### Ejercicio 2: Realizar el ejercicio 1 utilizando Interpolación de Hermite con Diferencias Divididas

Usando los datos que se proporcionan en la tabla y el método de diferencias divididas de Newton, determine la aproximación polinomial de Hermite en $x=1.5$.

|$k$|$x_k$|$f(x_k)$   |$f'(x_k)$   |
|---|-----|-----------|------------|
| 0 | 1.3 | 0.6200860 | −0.5220232 |
| 1 | 1.6 | 0.4554022 | −0.5698959 |
| 2 | 1.9 | 0.2818186 | −0.5811571 |

**Solución:** Primero calcularemos las diferencias divididas:

| $z$                 | $f(z)$                    |$1^{ra}$                    |$2^{da}$     |$3^{ra}$    |$4^{ta}$    |$5^{ta}$     |
|---------------------|---------------------------|----------------------------|-------------|------------|------------|-------------|
|${\color{orange}{1.3}}$|${\color{orange}{0.6200860}}$|                            |             |            |            |             |
|                     |                           |${\color{orange}{-0.5220232}}$|             |            |            |             |
|${\color{orange}{1.3}}$|${\color{orange}{0.6200860}}$|                            |$-0.0897427$ |            |            |             |
|                     |                           |$-0.5489460$                |             |$0.0663657$ |            |             |
|${\color{orange}{1.6}}$|${\color{orange}{0.4554022}}$|                            |$-0.0698330$ |            |$0.0026663$ |             |
|                     |                           |${\color{orange}{−0.5698959}}$|             |$0.0679655$ |            |$-0.0027738$ |
|${\color{orange}{1.6}}$|${\color{orange}{0.4554022}}$|                            |$-0.0290537$ |            |$0.0010020$ |             |
|                     |                           |$-0.5786120$                |             |$0.0685667$ |            |             |
|${\color{orange}{1.9}}$|${\color{orange}{0.2818186}}$|                            |$-0.0084837$ |            |            |             |
|                     |                           |${\color{orange}{−0.5811571}}$|             |            |            |             |
|${\color{orange}{1.9}}$|${\color{orange}{0.2818186}}$|                            |             |            |            |             |


Las entradas en color naranja en las primeras tres columnas de la tabla son los datos que se proporcionaron por el ejercicio. Las entradas restantes en esta tabla se generan con la fórmula de diferencias divididas estándar. Por ejemplo, para la segunda entrada en la tercera columna usamos la segunda entrada 1.3 en la segunda columna y la primera entrada 1.6 en esa columna para obtener:

$$ \frac{0.4554022 − 0.6200860}{1.6-1.3} = −0.5489460 $$

Para la primera entrada en la cuarta columna, usamos la primera entrada 1.3 en la tercera columna y la primera entrada 1.6 en esa columna para obtener:

$$ \frac{−0.5489460 − (−0.5220232)}{1.6 − 1.3} = −0.0897427 $$

El valor del polinomio de Hermite en 1.5 es:

$$H_5(1.5) = f[1.3]+f'(1.3)(1.5 − 1.3) + f[1.3, 1.3, 1.6](1.5 − 1.3)^2+f[1.3, 1.3, 1.6, 1.6](1.5 − 1.3)^2(1.5 − 1.6)$$
$$\ \ \ \ \ \ \ \ \ +f[1.3, 1.3, 1.6, 1.6, 1.9](1.5 − 1.3)^2(1.5 − 1.6)^2+f[1.3, 1.3, 1.6, 1.6, 1.9, 1.9](1.5 − 1.3)^2(1.5 − 1.6)^2(1.5 − 1.9)$$

$$H_5(1.5) =0.6200860 + (−0.5220232)(0.2) + (−0.0897427)(0.2)^2+ 0.0663657(0.2)^2(−0.1) + 0.0026663(0.2)^2(−0.1)^2+ (−0.0027738)(0.2)^2(−0.1)^2(−0.4)$$
$$H_5(1.5) = {\color{green}{0.5118277}}$$

- ### Ejercicio 2.1: Realizar el ejercicio 2 utilizando Interpolación de Hermite con Diferencias Dividas 


```python
def graphic(pol, xi, fi, x):
    # polinomio para evaluacion numérica
    px = lambdify(x,pol)

    # Puntos para la gráfica
    samples = 200
    a = np.min(xi-1)
    b = np.max(xi+1)
    pxi = np.linspace(a,b,samples)
    pfi = px(pxi)

    np.set_printoptions(precision = 4)

    # Gráfica
    plt.plot(xi,fi,'o', label = 'Puntos')
    plt.plot(pxi,pfi, label = 'Polinomio')
    plt.legend()
    plt.xlabel('xi')
    plt.ylabel('fi')
    plt.title('Diferencias Divididas Simple Generalizada')
    plt.show()

def getSimplePolynomial(factors, fi, xi, n, x ):
    pol = fi[0]
    for j in range(1,n,1):
        factor = factors[j-1]
        term = 1
        for k in range(0,j,1):
            term = term*(x-xi[k])
        pol = pol + term*factor

    return pol.expand()

def fillTable(table, n, m, xi, dfi):
    d = n-1
    j = 3

    tmp_table = table
    # Calcula tabla, inicia en columna 3
    while (j < m):

        # cada fila de columna
        i = 0
        step = j-2 # inicia en 1
        derivate_iterator = 0
        while (i < d):
            denominador = (xi[i+step]-xi[i])
            numerador = tmp_table[i+1,j-1]-tmp_table[i,j-1]

            if denominador == 0 and numerador == 0:
                tmp_table[i, j] = dfi[derivate_iterator]
                derivate_iterator = derivate_iterator + 1
            else :
                tmp_table[i,j] = numerador/denominador
            i = i+1
        d = d - 1
        j = j+1

    return tmp_table

def duplicateArray(arr):
    duplicates_values = np.array([])
    for number in arr:
        duplicates_values = np.append(duplicates_values, np.repeat(number, 2))

    return duplicates_values

def newtonHermite(xi, fi, dfi) :
    duplicate_xi = duplicateArray(xi)
    duplicate_fi = duplicateArray(fi)
    array_length = len(duplicate_xi)

    ki = np.arange(0,array_length,1)
    table = np.concatenate(([ki],[duplicate_xi],[duplicate_fi]),axis=0)
    table = np.transpose(table)

    dfinita = np.zeros(shape=(array_length,array_length),dtype=float)
    table = np.concatenate((table,dfinita), axis=1)
    [array_length,m] = np.shape(table)

    table = fillTable(table, array_length, m, duplicate_xi, dfi)

    newton_factors = table[0,3:]
    array_length = len(dfinita)
    x = Symbol('x')

    polynomial = getSimplePolynomial(newton_factors,  duplicate_fi, duplicate_xi, array_length, x)
    graphic(polynomial, duplicate_xi, duplicate_fi, x)

    polynomial

    return polynomial

hPol = newtonHermite(np.array([1.3,1.6, 1.9]), np.array([  0.6200860, 0.4554022, 0.2818186]),np.array([ -0.5220232, -0.5698959, -0.5811571]))
```


```python
hPol
```




$\displaystyle - 0.00277469135798944 x^{5} + 0.0240317901231809 x^{4} - 0.0145560802460553 x^{3} - 0.235216169754413 x^{2} - 0.00822922345577151 x + 1.00194406469105$



Por lo tanto, al sustituír $H_{2n + 1}(1.5)$ obtenemos:


```python
hPol.subs(x,1.5)
```




$\displaystyle 0.511827701728395$



- ### Ejercicio 3: 

Use la interpolación de Hermite en en python que concuerda con los datos listados en la tabla para encontrar una aproximación de $f(1.2)$.


|$k$|$x_k$| $f(x_k)$  | $f'(x_k)$  |
|---|-----|-----------|------------|
| 0 | -1  |    -2     |     18     |
| 1 |  0  |     2     |     -1     |
| 2 |  1  |     6     |     18     |

- #### Usando la función propuesta en el ejercicio 1.1


```python
xs = [-1, 0, 1]
ys = [-2,2,6]
dys = [18,-1,18]

pol = hermite(5, xs, ys, dys)
pol.expand()

```




$\displaystyle 2 x^{5} + 3 x^{3} - x + 2$



Por lo tanto, al sustituír $H_{2n + 1}(0.5)$ obtenemos:


```python
pol.subs(x,0.5)
```




$\displaystyle 1.9375$



Graficando los puntos y el polinomio obtenemos:


```python
# Datos
a = np.min(xs[0]-1)
b = np.max(xs[len(xs)-1]+1)
hx = np.linspace(a,b,101)
py = lambdify(x,pol)
hy = py(hx)

# Gráfica
plt.plot(xs, ys, 'o', label='Puntos')
plt.plot(hx,hy,label='Polinomio')
plt.legend()
plt.xlabel('xi')
plt.ylabel('fi')
plt.title('Lagrange')
plt.show()
```

- #### Usando la función del ejercicio 2.1


```python
hPol = newtonHermite(np.array([-1,0, 1]), np.array([  -2, 2, 6]),np.array([ 18, -1, 18]))
```


```python
hPol
```




$\displaystyle 2.0 x^{5} + 3.0 x^{3} - 1.0 x + 2.0$



Por lo tanto, al sustituír $H_{2n + 1}(0.5)$ obtenemos:


```python
hPol.subs(x,0.5)
```




$\displaystyle 1.9375$



## COTA DEL ERROR:

Sea $f$ una función continua sobre $[a,b]$, tal que las derivadas de $f$ de orden $\leqslant 2n + 2$ existen y son continuas en $[a,b]$. Si $p_{2n+1} \in P_{2n+1}$ es el polinomio que interpola a la función $f$ en los $n +1$ valores distintos $x_0,x_1,...,x_n \in [a,b]$, entonces para todo $x \in [a,b]$, existe $\xi = \xi(x) \in \ ]a,b[$, tal que:

$$f(x) = P_{2n+1}(x) + \frac{f^{(2n+2)}(\xi)}{(2n + 2)!}[\pi_{n+1}(x)]^2$$

Donde:

$$\pi_{n+1}(x) = \prod_{j=0}^{n} (x-x_j) = (x-x_0)(x-x_1)...(x-x_n)$$

Ademas, para $M_{2n+2} = \max_{z \in [a,b]}|f^{(2n+2)}(z)|$, se cumple que:

$$|f(x)- P_{2n+1}(x)| \leqslant \frac{M_{2n+2}}{(2n+2)!}[\pi_{n+1}(x)]^2  \ \ \ \ \ \ \ \ \  \forall x \in [a,b].$$

- ### Ejemplo

Considerando $f(x) = ln(x)$ y $p_3 \in P_3$ el polinomio de interporlación de Hermite para los nodos $x_0 = 1$ y $x_1 = 2$. 
Determine una cota de error del polinomio $p_3$.

La cota del error del polinomio de interporlación de Hermite está dado por:

Al tener dos nodos, $n=1$, por lo tanto:

$$|f(x) - p_3 (x)| \leqslant \frac{M_4}{4!}[\pi_4 (x)]^2 = \frac{M_4}{24}(x-1)^2(x-2)^2$$

Observe que:

$$f'(x) = \frac{1}{x}$$
$$f''(x) = \frac{-1}{x^2}$$
$$f'''(x) = \frac{2}{x^3}$$
$$f^{(4)}(x) = \frac{-6}{x^4}$$

Buscando el maximo:

$$M_4 = \max_{x \in [1,2]}|f^{(4)}(x) | = \max_{x \in [1,2]}\{\frac{6}{x^4}\} = \frac{6}{1^4} = 6 $$

Mientras que:

$$[\pi_4(x)]^2 = (x^2-2x+1)(x^2-4x+4)$$
$$[\pi_4(x)]^2 = x^4-6x^3+13x^2-12x+4$$

Por otro lado:

$$0 = [[\pi_4(x)]^2]'$$
$$0 = 4x^3 - 18x^2 + 26x - 12$$
$$0 = 2(x-1)(2x-3)(x-2)$$

Lo que nos permite conocer los puntos criticos que son: $x =1$, $x = \frac{3}{2}$, $ x = 2$

Evaluamos en los extremos y en los puntos críticos:
- _Observar que el valor máximo siempre será positivo porque está elevado al cuadrado_

$$[\pi_4(1)]^2 = 0$$
$$[\pi_4(1.5)]^2 = \frac{1}{16}$$
$$[\pi_4(2)]^2 = 0$$

Se deduce que:

$$[\pi_4(x)]^2 \leqslant \frac{1}{16} \ \ \ \ \ \ \ \ \  \forall x \in [1,2].$$

Por lo tanto se obtiene el valor de la cota:

$$|f(x) - p_3(x)| \leqslant \frac{6}{24} . \frac{1}{16} = {\color{green}{\frac{1}{64}}} \ \ \ \ \ \ \ \ \  \forall x \in [1,2].$$

## REFERENCIAS:

_Burden, Richard & Faires, J. Douglas (2010). Hermite Interpolation en Numerical Analysis, novena edición (pp. 136-144). Cengage Learning._ <br/>
_Trejos, C. V. (2020, 12 octubre). 21. Polinomio de interpolación de Hermite [Vídeo]. YouTube. https://www.youtube.com/watch?v=H57JvLEu8TY&feature=youtu.be_ <br/>
_Süli, Endre & Mayers, David (2003). Hermite Interpolation en An Introduction to Numerical Analysis, primera edición (pp. 187-191). Cambridge University Pres_

b69c7ebdeaeb5704c8bcbc13e20eaea231c3db23
ipynb
Jupyter Notebook
PolinomioDeInterpolacionDeHermite.ipynb
HeyChobe/numerical-analysis
cb0fc1719f52564eac6b4896a0afb30b16ac87d7
MIT
2021-07-19T23:49:27.000Z
2021-07-19T23:49:27.000Z
PolinomioDeInterpolacionDeHermite.ipynb
HeyChobe/numerical-analysis
cb0fc1719f52564eac6b4896a0afb30b16ac87d7
MIT
PolinomioDeInterpolacionDeHermite.ipynb
HeyChobe/numerical-analysis
cb0fc1719f52564eac6b4896a0afb30b16ac87d7
MIT
2021-07-20T03:17:54.000Z
2021-07-20T03:17:54.000Z
Qwen/Qwen-72B
1. YES
2. YES