Dados los puntos:
numpy.linalg.solve
, resuélvelo.numpy.linalg.cond
. Explica por qué era de esperar este resultado.%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
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
Y la matriz de coeficientes es la matriz de Vandermonde. Con los puntos dados, el sistema es
Y resolviendo con python
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)
Si modificamos algún elemento
ahora la solución es
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)
que, como vemos, es muy distinta de la solución anterior.
print('a = ', P)
Estamos resolviendo el problema de interpolación, es decir, estamos calculando el polinomio que pasa por los puntos. Gráficamente, las soluciones son
%run T5_Ej4_dibu
¿Cómo se evalua el buen o mal condicionamiento de la matriz de coeficientes? Con el número de condición
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
print(np.linalg.cond(A))
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.