Dada uma tabela $T=\{(x_0,y_0), \cdots , (x_k,y_k)\}$ tal que $x_i \neq x_{j}$, se $i \neq j$. O polinômio interpolador da tabela é o único polinômio $p_T(x)$ de grau menor ou igual a $k$ que satisfaz $$ p_T(x_i) = y_i $$ para todos os pontos $(x_i,y_i)$ da tabela.
import numpy as np
from numpy.polynomial import polynomial as P
# teste de interpolação
x=[0,1,2,3,4]
y=[-2,1,0,-5,1]
p=P.polyfit(x,y,4)
print(p)
[-2. 1.25 4.875 -3.75 0.625]
f= lambda x : P.polyval(x,p)
f(0)
-2.0000000000000018
%matplotlib inline
from matplotlib.pyplot import plot,grid
plot(x,y, "ro")
t=np.linspace(-.5, 4.5,100)
plot(t,f(t))
grid()
Definimos os polinômios de Lagrange $L_i(x)$ como $L_i(x)=\prod_{l\neq i} \frac{(x-x_l)}{(x_i-x_l)}$ e neste caso o polinômio interpolador da tabela $T$ é dado por $$ p_T(x)=\sum_{j=0}^{k}y_jL_j(x)$$.
def Lagrange(i,t,x):
'''Polinomios de Lagrange, t lista de pontos da tabela'''
produto=1
for l in range(len(t)):
if (l!=i) :
produto = produto*(x-t[l])/(t[i]-t[l])
return produto
x
[0, 1, 2, 3, 4]
Lagrange(0,x,2)
0.0
Lagrange(0,x,0)
1.0
g= lambda t : y[0]*Lagrange(0,x,t) + y[1]*Lagrange(1,x,t) + y[2]*Lagrange(2,x,t) + y[3]*Lagrange(3,x,t)
plot(t,g(t))
[<matplotlib.lines.Line2D at 0xb0a993ec>]
g1 = lambda t: sum([y[i]*Lagrange(i,x,t) for i in range(len(x))])
[g1(x[i])==y[i] for i in range(len(x))]
[True, True, True, True, True]