Página web del curso

Dados los puntos:

$$ \begin{array}{|c|ccccc|} \hline k & 0 & 1 & 2 & 3 & 4 \\ \hline x & 1 & 2 & 3 & 4 & 5 \\ y & 1 & 2 & 4 & 3 & 5 \\ \hline \end{array} $$
  1. Crea la matriz de Vandermonde para los nodos $x$ y plantea el sistema que resuelve el problema de interpolación de estos puntos con dicha matriz y utilizando el comando de python, numpy.linalg.solve, resuélvelo.
  2. Modifica algún elemento de la matriz de Vandermonde y vuelve a resolver el sistema.
  3. Calcula el número de condición de la matriz de Vandermonde utilizando numpy.linalg.cond. Explica por qué era de esperar este resultado.
In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

Condicionamiento de matrices

Crea la matriz de Vandermonde y resuelve el sistema

Como vimos en el tema de interpolación, el sistema a resolver para calcular el polinomio de interpolación que pasa por 5 puntos sería

$$ \left(\begin{array}{ccccc} 1 & x_{0} & x_{0}^{2} & x_{0}^{3} & x_{0}^{4}\\ 1 & x_{1} & x_{1}^{2} & x_{1}^{3} & x_{1}^{4}\\ 1 & x_{2} & x_{2}^{2} & x_{2}^{3} & x_{2}^{4}\\ 1 & x_{3} & x_{3}^{2} & x_{3}^{3} & x_{3}^{4}\\ 1 & x_{4} & x_{4}^{2} & x_{4}^{3} & x_{4}^{4} \end{array}\right)\left(\begin{array}{c} a_{0}\\ a_{1}\\ a_{2}\\ a_{3}\\ a_{4} \end{array}\right)=\left(\begin{array}{c} y_{0}\\ y_{1}\\ y_{2}\\ y_{3}\\ y_{4} \end{array}\right) $$

Y la matriz de coeficientes es la matriz de Vandermonde. Con los puntos dados, el sistema es

$$ \left(\begin{array}{ccccc} 1 & 1 & 1 & 1 & 1\\ 1 & 2 & 4 & 8 & 16\\ 1 & 3 & 9 & 27 & 81\\ 1 & 4 & 16 & 64 & 256\\ 1 & 5 & 25 & 125 & 625 \end{array}\right)\left(\begin{array}{c} a_{0}\\ a_{1}\\ a_{2}\\ a_{3}\\ a_{4} \end{array}\right)=\left(\begin{array}{c} 1\\ 2\\ 4\\ 3\\ 5 \end{array}\right) $$

Y resolviendo con python

In [2]:
A = np.array([[1.,1,1,1,1],
              [1,2,4,8,16],
              [1,3,9,27,81],
              [1,4,16,64,256],
              [1,5,25,125,625]])
b = np.array([1,2,4,3,5])
P = np.linalg.solve(A,b)
print('a = ', P)
a =  [ 15.         -28.66666667  19.08333333  -4.83333333   0.41666667]

Modifica algún elemento y vuelve a resolver el sistema.

Si modificamos algún elemento

$$ \left(\begin{array}{ccccc} 1 & 1 & 1 & 1 & 1\\ 1 & 2 & 4 & 8 & {\color{red}{15}}\\ 1 & 3 & 9 & 27 & 81\\ 1 & 4 & 16 & 64 & 256\\ 1 & 5 & {\color{red}{24}} & 125 & 625 \end{array}\right)\left(\begin{array}{c} a_{0}\\ a_{1}\\ a_{2}\\ a_{3}\\ a_{4} \end{array}\right)=\left(\begin{array}{c} 1\\ 2\\ 4\\ 3\\ 5 \end{array}\right) $$

ahora la solución es

In [3]:
A1 = np.array([[1,1,1,1,1],
              [1,2,4,8,15],
              [1,3,9,27,81],
              [1,4,16,64,256],
              [1,5,24,125,625]])
b1 = np.array([1,2,4,3,5])
P1 = np.linalg.solve(A1,b1)
print('a = ', P1)
a =  [ -82.          187.91666667 -145.33333333   45.25         -4.83333333]

que, como vemos, es muy distinta de la solución anterior.

In [4]:
print('a = ', P)
a =  [ 15.         -28.66666667  19.08333333  -4.83333333   0.41666667]

Estamos resolviendo el problema de interpolación, es decir, estamos calculando el polinomio que pasa por los puntos. Gráficamente, las soluciones son

In [5]:
%run T5_Ej4_dibu

Número de condición

¿Cómo se evalua el buen o mal condicionamiento de la matriz de coeficientes? Con el número de condición

$$ \mathrm{cond}(A)=\|A\|\,\|A^{-1}\| $$

El número de condición es siempre mayor que uno, pero cuanto más próximo a uno, mejor condicionada está la matriz y viceversa. En este ejemplo el número de condición de la matriz de Vandermonde es

In [6]:
print(np.linalg.cond(A))
26169.68797063433

que es muy grande y por lo tanto la matriz de coeficientes del sistema está mal condicionada.

Dijimos que la matriz de Vandermonde está mal condicionada y que pequeños errores en los datos podían producir grandes errores en los resultados. Y, efectivamente, así es, como lo hemos comprobado.