Polinomio di Lagrange

Vedi la discussione

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 L_k e il prodotto y_k \cdot L_k.

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 è \displaystyle p_5(x) = \frac{31}{120}\ x^5 - \frac{53}{12}\ x^4 + \frac{215}{8}\ x^3 -\frac{805}{12}\ x^2 + \frac{1601}{30}\ x + 6