Interpolazione di dati e funzioni. Il capitolo dell`interpolazione e` uno

Transcript

Interpolazione di dati e funzioni. Il capitolo dell`interpolazione e` uno
Interpolazione di dati e funzioni.
Il capitolo dell’interpolazione e’ uno dei più classici del Calcolo Numerico. I metodi
dell’interpolazione hanno una vasta applicazione, sia nell’ambito del Calcolo Numerico stesso, che
in altri contesti applicativi, come la ricostruzione di profili,l’elaborazione numerica di segnali, ecc.
Per esempio la trasformata di Fourier, in particolare la trasformata veloce di Fourier, ha
rappresentato una pietra miliare per la effettiva risolubilità di tanti problemi reali.
I primi lavori dei ricercatori sulle trasformate discrete di Fourier sono ancora oggi tra i più citati
negli articoli su riviste scientifiche di prestigio. In queste lezioni verrà trattata solo l’interpolazione
polinomiale insieme a qualche applicazione, inquadrando, prima, il problema più generale.
Siano assegnate n+1 coppie di punti del piano, (xi, yi), i = 0, …n, in cui, però, le ascisse xi, siano
tutte distinte tra loro. Cioè
i  j  xi  xj, i,j = 0, …n.
Può essere importante, allora, rappresentare questi punti su di una curva del piano, e, poiché le
ascisse sono tutte tra loro distinte, conviene che si tratti del grafico di una funzione definita in un
intervallo [a b], contenente tutte le ascisse. Allora
Definizione
Una funzione
f : [a b]  R
si dice interpolante gli n+1 punti (xi, yi), o che interpola gli n+1 punti (xi, yi), se risulta
f(xi) = yi, i = 0, …n
•
Spesso si dice anche che i punti (xi, yi) sono interpolati da f. Con riferimento alle applicazioni, i
punti (xi, yi), sono spesso chiamati dati, e l’interpolazione e’ uno dei vari modi di trattare dati
sperimentali.
Infine le ascisse di questi dati, sono dette anche nodi, e le richieste f(xi) = yi, sono spesso chiamate
le condizioni dell’interpolazione.
Il problema della scelta della funzione.
Evidentemente esistono infinite funzione che interpolano i dati assegnati, ma e’ ancora più
evidente, che, nelle applicazioni, si cercano funzioni con determinate caratteristiche, per esempio,
con grande regolarità ( continuità ed esistenza di numerose derivate) oppure funzioni non
eccessivamente oscillanti, ecc. In astratto si fissa una classe  di funzioni definite in un intervallo
contenenti i nodi e si cerca di risolvere il problema dell’interpolazione in questa classe.
Vale quindi la
Definizione
Il problema dell’interpolazione dei punti (xi, yi), i=0, …n ben posto nella classe  se esiste
una sola funzione f  , tale che soddisfi le condizioni dell’interpolazione.
•
Osserviamo che le condizioni dell’interpolazione sono n+1, e, in conseguenza, sembra naturale
pensare ad una classe di funzione , che possieda n+1 gradi di libertà.
Cioè , la classe oltre a essere formata da funzioni con gli
aspetti qualitativi desiderati nell’ambito della particolare applicazione, deve essere tale che ogni
funzione sia individuata da n +1 parametri reali.
In questo modo, si può sperare che il problema del’interpolazione sia ben posto in questa classe.
L’interpolazione polinomiale.
Una classe molto usata per l’interpolazione e’ quella dei polinomi . Si tratta di funzioni
derivabili quante volte si voglia, e quando l’ordine di derivazione supera il grado del polinomio, la
derivata e’ identicamente nulla. Il grande difetto sta nel fatto che al crescere del grado sono funzioni
eccessivamente oscillanti e, da ciò sono nate le interpolazioni con funzioni “spline”, cioè funzioni
polinomiali a tratti.
Noi ci limiteremo a trattare dell’interpolazione polinomiale, mostrando, con degli esempi, vantaggi
e svantaggi.
La classe dei polinomi di grado n sarà denotate con n, e un generico polinomio p di grado n sarà
scritto come
p(x) = a0 + a1x + a2x2 + …anxn
Se an = 0, il polinomio degenera in uno di grado inferiore, cioè n-1  n. In sostanza la precedente
scrittura sta a denotare un polinomio di grado al più n. Se an ≠ 0, si tratta di un polinomio di grado
esattamente n
Questa forma vuol dire e’ stata usata la base delle potenze
1, x, x2, ….xn
per rappresentare p, cioè ogni polinomio p n, è una combinazione lineare delle potenze. Si tratta
di una base, perché questa combinazione lineare è unica. Ma e’ evidente che p può anche
rappresentarsi mediante altre basi. Un esempio e’ una qualsiasi sequenza
p0, p1, ….pn,
dove p0 e’ una costante non nulla ( polinomio di grado esattamente zero), p1 e’ un polinomio di
grado esattamente uno, … pk e’ un polinomio di grado esattamente k , …, pn è un polinomio di
grado esattamente n. Se questa ( come lo è) è una base, vuol dire che ogni polinomio p di grado al
più n, si scrive in modo unico ( con unici coefficienti ci),
p(x) = c0p0(x) + c1p1(x) + …cnpn(x)
Una sequenza che incontreremo più avanti e’ costituita tutta da polinomi di grado esattamente n. La
classe n e’ una classe lineare a n+1 gradi di libertà ed è quindi candidata all’interpolazione di n+1
coppie con nodi distinti.
Vale il fondamentale
Teorema ( dell’interpolazione polinomiale).
Assegnati n+1 nodi distinti x0, …xn, per ogni scelta delle ordinate y0, …yn, esiste un solo
polinomio p  n tale che
p(xi) = yi, i = 0,…n.
•
La veridicità di questo teorema nasce dal fatto che n è uno spazio lineare a n+1 dimensioni ( come
Rn+1). D’altra parte quando si scrivono le condizioni di interpolazione si viene a formare un sistema
lineare di n+1 equazioni in n+1 incognite, che si dimostra essere non singolare.
Esempio.
Siano assegnate le ascisse -1, 0, 1 e si cerchi il polinomio di secondo grado interpolante
questi tre nodi, con ordinate rispettivamente 1, 1, -1.
Se p(x) = a+bx + cx2 è un generico polinomio di secondo grado, le condizioni di interpolazione si
scrivono
a –b + c = 1
a=1
a + b + c = -1
Risolvendo il sistema si trae
p(x) = 1 – x – x2
•
Se, si facesse riferimento a un modello non lineare , per esempio alla classe di funzioni a tre
parametri AeBx + C, si avrebbe il sistema non lineare
Ae-B + C = 1
A+C=1
AeB + C = -1
Si vede che questo sistema non ammette soluzione. Pertanto il problema di interpolazione non è
ben posto in questa classe.
Se si volesse risolvere il problema di interpolazione con i metodi Gaussiani, occorrerebbero come
e’ noto
O(2(n+1)3/3) flop
e questo e’ un costo troppo oneroso per un semplice problema di interpolazione. Inoltre per grandi
valori di n la matrice dei coefficienti è mal condizionata. Vale a dire che una piccola perturbazione
di qualche coefficiente, produce una grossa perturbazione sulla soluzione del sistema. In questo
caso anche i metodi gaussiani con la ricerca del pivot si mostrano inefficaci.
I polinomi fondamentali di Lagrange.
Un modo molto elegante e produttivo per costruire
l’interpolazione polinomiale passa attraverso i famosi polinomi fondamentali di Lagrange.
Assegnati n+1 nodi distinti xi, i =0, …n, il k-esimo polinomio fondamentale di Lagrange, e’ il
polinomio di grado n, Lk(x) che interpola le coppie (xi,yi), i = 0, …n, dove le ordinate sono
y0 = 0, …yk-1 = 0, yk = 1, yk+1 = 0, ….yn = 0.
Vale a dire
Lk(xi) = ik, i =0, …n, k = 0, …n
dove il simbolo di Kronecher ik e’ definito come
1 i  k
δik  
0 i  k
Quindi ogni Lk(x) e’ un polinomio di grado n tale che
Lk(xk) =1, Lk(xi) = 0, i  k.
Ogni Lk deve avere gli n zeri xi, i  k, ed essendo di grado n ha la forma
Lk(x)=Ak(x-x0)…(x-xk1)(x-xk+1)…(x-xn).
Se si impone
Lk(xk) = 1,
si trae
1
Ak 
(xk  x0 )...(xk  xk 1 )(xk  xk 1 )...(xk  xn )
In definitiva
(x  x0 )...(x  xk 1 )(x  xk 1 )...(x  xn )
Lk(x) 
,
(xk  x0 )...(xk  xk 1 )(xk  xk 1 )...(xk  xn )
k = 0, …n.
I polinomi fondamentali di Lagrange sono tanti, quanti sono i nodi, e sono tutti di grado esattamente
n in quanto il primo coefficiente è esattamente Ak  0. Il denominatore e’ un numero che è il
valore del numeratore in xk.
Per esempio, se n =1,
si ha
(x  x1 )
(x  x0 )
L0(x) 
, L1(x) 
(x0  x1 )
(x1  x0 )
entrambi di primo grado, e se n = 2,
(x  x1 )(x  x2 )
(x  x0 )(x  x2 )
L0(x) 
, L1(x) 
,
(x0  x1 )(x0  x2 )
(x1  x0 )(x1  x2 )
(x  x0 )(x  x1 )
(x2  x0 )(x2  x1 )
tutti e tre di secondo grado. Se n = 3,
𝑥 − 𝑥1
𝐿0 𝑥 =
𝑥0 − 𝑥1
𝑥 − 𝑥0
𝐿1 𝑥 =
𝑥1 − 𝑥0
L2(x) 
𝑥 − 𝑥2 (𝑥 − 𝑥3 )
𝑥0 − 𝑥2 (𝑥0 − 𝑥3 )
𝑥 − 𝑥2 (𝑥 − 𝑥3 )
𝑥1 − 𝑥2 (𝑥1 − 𝑥3 )
𝑥 − 𝑥0
𝑥2 − 𝑥0
𝑥 − 𝑥0
𝐿3 𝑥 =
𝑥3 − 𝑥0
𝐿2 𝑥 =
𝑥 − 𝑥1 (𝑥 − 𝑥3 )
𝑥2 − 𝑥1 (𝑥2 − 𝑥3 )
𝑥 − 𝑥1 (𝑥 − 𝑥2 )
𝑥3 − 𝑥1 (𝑥0 − 𝑥2 )
tutti di grado effettivo 3.
Vale il
Teorema
Assegnate le n+1 coppie (xi, yi) , i =0, …n, con ascisse distinte, l’unico polinomio di grado n
interpolante queste coppie é
p(x) = y0L0(x) + y1L1(x) +…ynLn(x)
dove gli Lk(x) sono i polinomi fondamentali di Lagrange associati alle ascisse.
Dim.
Il polinomio così costruito e’ intanto di grado n come ogni Lk(x). Poi
p(xi) = y0L0(xi) + …yi-1Li-1(xi)+yiLi(xi)+yi+1Li+1(xi) +…ynLn(x) = yi, i = 0,1,…n,
da cui la tesi.
•
In sostanza il polinomio interpolante si trova facendo una
combinazione lineare dei polinomi fondamentali di Lagrange, e i coefficienti di questa
combinazione sono proprio, nell’ordine, le ordinate yi, i = 0, …n.
Con due soli nodi si parla di interpolazione lineare (polinomi interpolanti di grado uno), con tre
nodi l’interpolazione e’ quadratica ( polinomio interpolante di grado 2), mentre con quattro nodi
l’interpolazione e’ cubica ( polinomi interpolanti di grado 3) , ecc.
Introduciamo, ora, la nozione di interpolazione di una funzione in nodi assegnati.
Supponiamo, cioè , di conoscere i valori di una funzione f in n+1 ascisse distinte tutte appartenenti
ad un intervallo [a b]. Se x0, x1, …xn sono tali ascisse ( nodi) vuol dire che si conoscono f(x0),
f(x1), …f(xn). Allora tali valori giuocano il ruolo delle ordinate yi , cioè come se fosse yi = f(xi), i
= 0, …n. In sostanza il polinomio interpolante si scrive
p(x) = f(x0)L0(x) + f(x1)L1(x) +…f(xn)Ln(x)
e prende il nome di polinomio interpolante la funzione f nei nodi xi, i =0, …n. Si dice anche ch f e’
interpolata da p(x) nei nodi xi, i =0, …n. Osserviamo che, se f  n il polinomio interpolante e f
stesso, per l’esistenza ed unicità del polinomio interpolante. Segue che ogni f  n si scrive in
modo unico come combinazione lineare dei polinomi fondamentali di Lagrange, usando come
coefficienti i valori della funzione nei nodi.
I polinomi fondamentali di Lagrange formano pertanto una base per n, comunque si scelgano i
nodi xi, i =0, …n tutti distinti tra loro. In particolare, allora
1 = L0(x) + L1(x) + …Ln(x)
xk  x0k L0(x)  x1k L1(x)  ....xnk Ln(x),k  0,...n.
L’interpolazione per approssimare funzioni.
L’interpolazione in genere e, in particolare quella polinomiale,ha svariate applicazioni,
nell’ambito del Calcolo Numerico ed in altri contesti.
Una di queste consiste nell’approssimare funzioni di cui si conoscano i valori in determinati punti
in un dato intervallo [a b] in cui sono definite.
Se di una certa funzione f si conoscono i valori f(xi), negli assegnati nodi xi, i = 0, …n, possiamo
costruire il suo polinomio interpolatore di grado n.
Se p(x) è tale polinomio risulta, quindi,
p(xi) = f(xi), i = 0, …n
e possiamo decidere di approssimare f(x) in x  xi ponendo f(x)  p(x) . Come valutare la bontà di
questa approssimazione? Occorre trovare una forma opportuna per l’errore di troncamento f(x)-
p(x),( in questi ambiti, di solito, si fa riferimento all’errore assoluto piuttosto che a quello relativo).
L’errore di troncamento viene detto resto e si scrive
R(x) = f(x) – p(x)
E’ evidente che il resto si annulla in tutti i nodi xi, i =0, …n, e conviene allora introdurre il classico
polinomio di grado esattamente n+1
(x) = (x – x0)(x – x1)…(x – xn)
che ha come zeri tutti i nodi xi, i =0, …n.
Risulta (x) = xn+1 + …, , cioè, (x) e’ un polinomio di grado n+1 monico, che significa con
coefficiente della potenza più elevata pari a 1.
Allora, diventa naturale porre
R(x) = (x)(x) ,  x  [a b],
cercando, successivamente, di rappresentare la funzione (x). Vale il
Teorema
Se f possiede n+1 derivate con derivata (n+1)-esima continua in [a b], allora per ogni x in [a
b], x  xi, i = 0, …n, esiste un x ( dipendente anche dai nodi) in [a b] tale che
f (n 1 )(ξ x )
λ(x) 
(n  1 )!
Senza fare riferimento esplicito alla funzione (x), tutti i risultati finora illustrati si riassumono nel
Teorema
Se f e’ definita in [ a b] e xi, i = 0,…n sono n+1 nodi distinti in [a b], esiste un solo
polinomio di grado al più n ( polinomio interpolante ) tale che
p(xi)) = f(xi), i =0, …n
e, se f C(n+1)[a b], per ogni x  [a b], esiste x  [a b],
tale che
f (n 1 )(ξ x )
f(x)  p(x)  ω(x)
(n  1 )!
dove
(x) = (x-x0)…(x-xn).
La formula scritta e’ spesso detta formula di interpolazione polinomiale, e l’espressione a destra
dopo p(x) viene detta formula del resto nell’interpolazione polinomiale. Non abbiamo scritto
l’espressione formale di p(x), perche l’unico polinomio interpolante, può essere messo anche in
forme diverse da quella che usa i polinomi fondamentali di Lagrange. Una di queste forme e’
quella che usa le classiche differenze divise che per brevità non trattiamo. Se, al posto di p(x) si
scrive la sua espressione con i polinomi fondamentali di Lagrange, la formula che si viene a
formare prende il nome di formula di interpolazione di Lagrange.
Da notare che se f è un polinomio di grado n, la derivata (n+1)-esima di f è identicamente nulla.
Allora dalla espressione del resto si ottiene che il polinomio interpolante è la f stessa, come già si
sapeva.
Maggiorazione del resto.
Si può usare la formula del resto per maggiorare l’errore di troncamento f(x)-p(x), quando si
vuole approssimare f(x) con p(x), per gli x non coincidenti con i nodi. Supponiamo di conoscere per
la derivata (n+1)-esima di f, una costante positiva Mn+1, tale che risulti
|f(n+1)(x) |  Mn+1,  x  [a b].
Tale costante prende il nome di maggiorazione della derivata (n+1)-esima, restando sottointeso che
maggiora il
valore assoluto della derivata in ogni x in [a b].
Allora, se p  n, interpola la funzione f in n+1 nodi distinti xi, i =0, …n, e Mn+1 e’ una
maggiorazione della derivata (n+1)-esima ( supposta esistente) in [a b], si ha
f(x)  p(x) 
|(x)|
M n1
(n  1 )!
dove, al solito,
(x) = (x-x0)…(x-xn).
Negli esempi ed esercizi che andiamo a proporre, metteremo come indice dei polinomi
fondamentali di Lagrange, direttamente il valore del nodo ( non x0, x1,..ecc), ricordando che questi
sono tanti quanti sono i nodi, e che la derivata eventuale da maggiorare ha ordine uguale al numero
dei nodi. Il grado del polinomio interpolante è inferiore di una unità al numero dei nodi, potendo
anche degenerare in un polinomio di grado più basso.
Esempi
Noto che f(x) = sinx, è tale che
f(0) = 0, f(/6) = ½.
Cerchiamo di approssimare la funzione f(x) in [0 /6] con in polinomio di primo grado
(interpolazione lineare).
Allora
π
x
6   6 x  1, L  x  0  6 x
L0 
π/ 6
π
π
π
0
0 π
6
6
Segue che
p(x) =0 L0(x) +1/2  L/6(x) = 3x/
Per esempio, allora,
sin.5 ≈ 3/2 = .4775…, sin1/3 ≈ 1/ = .3183…, ecc.
Per valutare la qualità di queste approssimazioni osserviamo che
|f”(x)|  1,
da cui
3
sin x  x 
π
(x  0 )(x 
2
π
π
)
(  x)x
π
6  6
, x  [0 ]
2
6
Allora
|sin1/2 - .4775| < .0059, |sin1/3 - .3183| < .0317, ecc.
In x =1/2, vengono sicuramente catturate due cifre decimali, mentre almeno una cifra e’ presa per x
= 1/3.
Queste maggiorazioni si ottengono, evidentemente, sostituendo ½ e 1/3 a destra della
disuguaglianza.
Osserviamo che i valori veri sono
sin1/2 = .4794…, e sin1/3 = .3272..
•
Se, invece, vogliamo una maggiorazione globale, che valga per ogni x in [0 /6] osserviamo che in
/12, e’ massima la funzione |x(x - /6)| in tale intervallo, da cui la maggiorazione e’
2/288 = .0343
Questa è una maggiorazione più grande, perché vale per ogni x in [0 π/6] avendo maggiorato | (x)
| con il suo massimo. Per valori più alti di n non è immediato trovare il massimo di | (x) | e una
eventuale maggiorazione non stretta rischia di maggiorare gli errori assoluti in modo eccessivo. Ma
la funzione | (x) | è calcolabile in quanti punti si voglia e, pertanto, negli esercizi proposti andremo
a maggiorare gli errori assoluti in specificati valori di x.
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Supponiamo, ora, che di una certa funzione f derivabile tre volte in [-1 1], si sappia che
f(-1) = 1, f(0) = 1, f(1) = 3,
e che si abbia l’ulteriore informazione
|f’’’(x)|  .1,  x  [-1 1].
Allora, con queste tre valori, possiamo costruire il polinomio di secondo grado interpolante la
funzione f ( interpolazione quadratica), ed utilizzare tale polinomio per approssimarla nei punti di [1 1].
Quindi
(x  0 )(x  1 )
x2  x
L1(x) 

,
(  1  0 )(  1  1 )
2
(x  (  1 ))(x  1 )
L0(x) 
 1  x2 ,
( 0  (  1 ))( 0  1 )
L1(x) 
(x  0 )(x  (  1 )) x 2  x

( 1  0 )( 1  (  1 ))
2
Pertanto
p(x) = 1  L-1(x) + 1  L0(x) + 3  L1(x) = x2 + x + 1
A posteriori verifichiamo che si tratti del polinomio interpolante osservando che le condizioni di
interpolazione sono soddisfatte ( grado secondo, p(0)=1, p(-1) = 1, p(1) = 3).
Allora, per esempio,
f(1/2) ≈ p(1/2) = 7/4, f(-1/2) ≈ p(-1/2) = ¾, ecc.
Per valutare queste approssimazioni, consideriamo la maggiorazione del resto in una formula di
interpolazione che, in questo caso, diventa,
|x(x  1 )(x  1 )
| x | ( 1  x2 )
|f(x)  p(x)| 
 .1 
3!
60
Si trova
|f(1/2) - 7/4| < 1/160 = .0063
|f(-1/2) – ¾ | < 1/160 = .0063
L’approssimazione è corretta ad almeno due cifre decimali.
Una certa funzione f sia tale che
f(-1) = 2, f(0) = 1, f(1) = 2, f(3) = 10.
Poiché le condizioni di interpolazione sono quattro, per valutare l’approssimazione eseguita con
tecniche interpolatorie, occorre conoscere una maggiorazione della derivata quarta di f. Per
esempio, sia noto che
| f(4)(x) | ≤ 1/4 ,  x  [-3 3].
Cominciamo col costruire il polinomio interpolante. Allora
𝑥−0 𝑥−1 (𝑥−3)
𝐿−1 𝑥 =
=−
(−1−3)
𝐿0 𝑥 =
𝐿1 𝑥 =
−1−0 −1−1
𝑥−(−1) 𝑥−1 (𝑥−3)
0−(−1) 0−1 (0−3)
𝑥−(−1) 𝑥−0 (𝑥−3)
=
3
=−
3−(−1) 3−0 (3−1)
8
𝑥 3 −3𝑥 2 −𝑥+3
1−(−1) 1−0 (1−3)
𝑥−(−1) 𝑥−0 (𝑥−1)
𝐿3 𝑥 =
𝑥 3 −4𝑥 2 +3𝑥
𝑥 3 −2𝑥 2 −3𝑥
=
4
𝑥 3 −𝑥
24
,
,
,
,
p(x) = 2L-1(x) + L0(x) + 2L1(x) +10L3(x) = x2 + 1
Il polinomio interpolante degenera in un polinomio di grado due. Dall’informazione sulla derivata
quarta si trae
|f(x) – p(x) | ≤ |(x-(-1))(x-0)(x-1)(x-3)|/(4!4) =
|x(x2-1)(x-3)|/48
Per esempio f(2) ≈ p(2) = 5, con errore f(2) - p(2) maggiorato da |f(2) - 5 | ≤ 1/8. Se vogliamo
riferirci all’errore relativo, non conoscendo f(2), mettiamo p(2) al denominatore, accettando la
maggiorazione
𝑓 2 −5
1
≤
= .025
5
40
cioè una cifra significativa almeno corretta. In realtà con maggior rigore avremmo dovuto mettere
f(2) al denominatore e la frazione andava maggiorata cercando di conoscere m ≤ |f(2)|, con m
abbastanza vicino a |f(2)|. La maggiorazione diventava 1/(8m).
Poiché la maggiorazione della derivata quarta vale nell’intervallo [-3 3 ], proviamo a calcolare il
polinomio interpolante in -2. Questo valore è esterno al più piccolo intervallo contenente i nodi e
spesso, in tale caso, si parla di estrapolazione e se si cerca di approssimare f, si dice che si estrapola
in -2. Risulta p(-2)= 5, con maggiorazione
| f(-2) – 5 | ≤ 30/48 = 5/8. L’errore relativo, diventa
𝑓 −2 − 5
1
≤ = .125
5
8
Generalmente parlando l’estrapolazione è meno accurata dell’interpolazione, ( come nell’esempio),
quando si vuole approssimare con polinomi interpolanti.
Infine sia
𝜋
𝑓 𝑥 = 4𝑠𝑖𝑛 2 𝑥
Si calcoli tale funzione in 0,1/3 e 1 e trovare il polinomio interpolante di grado due. Allora f(0)= 1,
f(1/3) = 2, f(1) = 4. I polinomi fondamentali di Lagrange sono
(x  1 / 3 )(x  1 ) x 2  4 x / 3  1 / 3
L0(x) 

,
( 0  1 / 3 )( 0  1 )
1/ 3
L1 / 3(x) 
(x  0 )(x  1 )
x2  x

,
( 1 / 3  0 )( 1 / 3  1 )
2/9
(x  0 )(x  1 / 3) x 2  x / 3

( 1  0 )( 1  1 / 3)
2/3
Pertanto p(x) = L0(x) + 2L1/3(x) + 4L1(x) = 3x + 1, cioè degenerato in grado. Per usare
l’interpolazione per approssimare la funzione occorre calcolare la derivata terza di f. Quindi
L1(x) 
𝑓′ 𝑥 =
𝜋
𝜋
𝜋
𝜋
𝜋
𝑙𝑜𝑔4 4𝑠𝑖𝑛 2 𝑥 𝑐𝑜𝑠 2 𝑥 =Af(x) 𝑐𝑜𝑠 2 𝑥, A=2 𝑙𝑜𝑔4
2
𝜋
𝜋
𝜋
𝑓 ′′ (𝑥) = 𝐴(𝑓 ′ 𝑥 𝑐𝑜𝑠 𝑥 − 𝑓 𝑥 𝑠𝑖𝑛 𝑥)
2
2
2
Sia
𝜋
𝜋
g(x)= 𝑓 ′ 𝑥 𝑐𝑜𝑠 2 𝑥, h(x) = 𝑓 𝑥 𝑠𝑖𝑛 2 𝑥,
𝜋
𝜋
𝜋
𝑔′ 𝑥 = 𝑓"(𝑥)𝑐𝑜𝑠 𝑥 − 𝑓′(𝑥)𝑠𝑖𝑛 𝑥
2
2
2
𝜋
𝜋
𝜋
′
′
𝑕 𝑥 = 𝑓 𝑥 𝑠𝑖𝑛 𝑥 + 𝑓(𝑥)𝑐𝑜𝑠 𝑥
2
2
2
𝜋
u(x) = 𝑔′ 𝑥 − 2 𝑕′ 𝑥
𝜋
𝜋
𝜋
𝜋
𝑢 = 𝑓"(𝑥)𝑐𝑜𝑠 2 𝑥 − 𝜋𝑓 ′ 𝑥 𝑠𝑖𝑛 2 𝑥 − 2 2 𝑓(𝑥)𝑐𝑜𝑠 2 𝑥
Ora, nell’intervallo [ 0 1],
𝜋
|u(x)| ≤ | 𝑓"(𝑥)| + 𝜋 𝑓 ′ 𝑥 + 2 2 |𝑓(𝑥)
|f(x)| ≤ 4,| 𝑓 ′ 𝑥 | ≤ 4A, | 𝑓"(𝑥)| ≤ A(4 A + 2 𝜋)
|u(x)| ≤ 112, |𝑓 ′′′ 𝑥 | ≤ 450
Questa è una maggiorazione forse grossolana, ma mette in luce le difficoltà nel manipolare derivate
anche di ordine basso. In definitiva sembrerebbe che l’interpolazione mediante questi nodi non sia
adatta ad approssimare la funzione.
4
3.5
3
2.5
2
1.5
1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Una proprietà importante
Il modo di costruire l’interpolazione non è unico. Il vantaggio di quella con i polinomi di
Lagrange consiste nel fatto che si costruiscono una volta per tutte questi polinomi e poi, qualunque
sia la funzione o i dati, si forma l’interpolazione. In sostanza si può costruire il polinomio
interpolante per ogni funzione di una certa classe assegnata, se le condizioni di interpolazione
hanno gli stessi nodi, utilizzando volta per volta i valori nei nodi.
Se, però, si dovesse aggiungere una nuova informazione, occorre ricalcolare tutti i polinomi di
Lagrange !
Un altro metodo di interpolazione è quello delle differenze divise. In questo metodo si calcola
nell’oordine l’interpolazione lineare, quella quadratica, quella cubica, ecc. Ogni volta che si
aggiunge una coppia (xi.f(xi)) si aggiunge un pezzo alla precedente interpolazione costruendo la
nuova. Ma questa formula mal si adatta se si deve interpolare una classe di funzioni in nodi fissati.
Il problema della derivata.
Quando si vuole usare l’interpolazione polinomiale per approssimare funzioni, possono
sorgere grosse difficoltà. Il fatto che nell’espressione del resto compare al denominatore (n+1)! non
deve far pensare che questo diventi rapidamente piccolo al crescere di n. Infatti funzioni molto
regolari possono essere tali che le derivate comincino a crescere notevolmente al crescere di n,
anche diventando dello stesso ordine di grandezza del fattoriale al denominatore. Questo fatto è
stato illustrato nell’ultimo esempio proposto, ma esistono dei casi ancora più critici che mettono
maggiormente in luce le insidie presenti in questi metodi di approssimare le funzioni.
L’approssimazione di funzioni elementari.
In molti ambienti software, ( Matlab incluso) si possono richiamare con semplici comandi
tutte le note funzioni elementari. Come queste vengono calcolate ?. Solitamente al loro posto viene
calcolata una funzione razionale
𝑝(𝑥)
𝑟 𝑥 =
𝑞(𝑥)
utilizzabile in un opportuno intervallo. I polinomi a numeratore e denominatore sono di grado
relativamente basso ( tipicamente uno, due o tre) e sono scelti in maniera tale che se f è la funzione
da approssimare
max| f(x) – r(x)| ≤ max(f(x) – R(x),
per ogni altra funzione razionale R(x) = P(x)/Q(x) dove P e Q sono dello stesso grado di p e q
rispettivamente. Naturalmente il massimo è preso nell’opportuno intervallo di cui prima. Ma come
si fa a trovare r(x) ?. Gli algoritmi sono piuttosto complessi ma sono statti eseguiti una volta per
tutte. Per trovare p e q occorre calcolare f in quanti punti lo si desideri e con un po’ di fatica questo
si può fare per mezzo della formula di Taylor e simili, troncando dopo parecchi termini ed avendo
cura di usare un’aritmetica con un numero molto elevato di cifre significative per eliminare la
propagazione dell’errore di arrotondamento. Alla fine si trovano i coefficienti di p al numeratore e i
coefficienti di q al denominatore. La funzione r(x) solitamente si dimostra essere interpolante f(x) in
assegnati nodi ( dipendenti da f). Una volta trovata r(x), cioè i coefficienti di p(x) e q(x), questa
diventa una built-in funzione Matlab e comunque una funzione già compilata in altri ambienti. Ogni
qualvolta si invoca la funzione elementare f(x), in realtà viene richiamata la funzione r(x) che
richiede pochi flop, quelli per il calcolo di p e quelli per calcolo di q e la divisione finale. Anzi,
molto spesso, si riduce ancora questo calcolo, trasformando la funzione razionale r(x) in modo da
ridurre il numero dei flop. Di solito r(x) viene detta funzione razionale di migliore approssimazione
nell’intervallo. Può darsi che per certe funzioni elementari si usi una procedura lievemente diversa,
magari imponendo a priori che r(x) e f(x) coincidano in qualche valore o che i coefficienti di p e q
verifichino qualche condizione per ridurre la propagazione dell’errore di arrotondamento, ecc. In
ogni caso si tratta di algoritmi molto sofisticati è alla fine si trova che
| f(x) – r(x) | ≤ 10-p
nel solito intervallo in questione. A seconda delle funzioni p = 20, 25, 30, cioè l’errore di
troncamento è così basso che l’unico errore per il calcolo della funzione f(x) ( leggi r(x)), è quello
di floating per il calcolo di r(x). In sostanza calcolare sin, cosx, logx porta ad un errore simile a
quello che si avrebbe calcolando due prodotti, tre somme ecc. Per esempio l’equipe che ha trovato
la r(x) sostitutiva di sinx, probabilmente ha operato in questo modo. Poiché sin(x) = sin(x +2kπ) si e
limitato a prendere in considerazione l’intervallo [-π π]. Per ogni argomento x si può trovare
l’argomento corrispondente in tale intervallo. Ma, poiché sin(-x) = sin(x) sicuramente ha preso in
considerazione l’intervallo [ 0 π]. Quindi ha individuato la r(x) sostitutiva. Forse c’à stato una
riduzione ulteriore dell’intervallo base. Per quanto riguarda exp(x), certamente si è tenuto conto del
fatto che exp(n) dove n è un intero si trova moltiplicando il numero di nepero e per se stesso n volte
e calcolando exp(x) nell’intervallo [ 0 1]. Per numeri negativi basta fare il reciproco. In ogni caso
per chi fosse interessato alla struttura di queste funzioni razionali, basta, ad esempio, il comando
doc sin o doc log o doc cos, ecc., in ambiente Matlab, perché dalla rete si trovi la documentazione
richiesta.