PUNTI = [(2, -3), (1, 15), (5, 2),
(6, 1), (4, 0), (0, 6)]
La sequenza di punti
N = len(PUNTI)
X = []
Y = []
for xi, yi in PUNTI:
X.append(xi)
Y.append(yi)
Le variabili N, X, Y rendono più semplice l’elaborazione dei dati
x = sp.symbols('x')
p = 0
for k in range(N):
xk = X[k]
yk = Y[k]
Lk = 1
for i in range(N):
if(i != k):
xi = X[i]
Lk *= (x-xi)/(xk-xi)
p += yk*Lk
x è la variabile del polinomio.
p è il polinomio di Lagrange inizialmente nullo.
Il polinomio è dato dalla combinazione lineare delle basi.
Per ogni k calcola la base corrispondente e il prodotto
.
print(p.expand())
Visualizza il polinomio in forma leggibile.
XX = 3
YY = p.subs(x, XX)
X.append(XX)
Y.append(YY)
Aggiunge il nuovo punto a quelli già noti
(3, -7)
Xnew = np.linspace(min(X),
max(X),
endpoint=True)
Ynew = [p.subs(x, xi) for xi in Xnew]
plt.plot(Xnew, Ynew, c="blue")
Disegna il grafico del polinomio interpolatore.
Xnew contiene 50 ascisse ordinate.
Ynew è la lista delle ordinate corrispondenti calcolate con il polinomio di Lagrange.
Il programma completo
import matplotlib.pyplot as plt
import numpy as np # linspace()
import sympy as sp
#---------------------------------------------------------
PUNTI = [(2, -3), (1, 15), (5, 2), (6, 1), (4, 0), (0, 6)]
#---------------------------------------------------------
N = len(PUNTI)
X = []
Y = []
for xi,yi in PUNTI:
X.append(xi)
Y.append(yi)
x = sp.symbols('x')
p = 0
for k in range(N):
xk = X[k]
yk = Y[k]
Lk = 1
for i in range(N):
if(i != k):
xi = X[i]
Lk *= (x-xi)/(xk-xi)
p += yk*Lk
print(p.expand())
XX = 3
YY = p.subs(x, XX)
X.append(XX)
Y.append(YY)
Xnew = np.linspace(min(X), max(X), endpoint=True)
Ynew = [p.subs(x, xi) for xi in Xnew]
plt.scatter(X, Y, c="red")
plt.plot(Xnew, Ynew, c="blue")
plt.title("Polinomio di Lagrange")
plt.show()

Il polinomio di Lagrange è