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 n1 (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 L1(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.