Approssimazione di una funzione continua mediante polinomi di Legendre
di Massimo Fantin (gennaio 2002)
L'insieme delle funzioni continue definite su un intervallo è uno spazio di Hilbert, che significa che si tratta di un'algebra ( spazio vettoriale con una operazione di moltiplicazione con le proprietà di anello e un prodotto interno ( prodotto scalare )
In sintesi lo spazio delle funzioni continue sull'intervallo [a,b] che indichiamo con C[a,b]è dotato delle operazioni di addizione +, moltiplicazione per scalare . , moltiplicazione *, prodotto scalare < , > e una norma || f ||. Per tali operazioni valgono le proprietà:
Per l'addizione + che viene definita punto per punto : (f + g)(x) = f(x)+g(x)
Proprietà
associativa (f + g) + h = g + (g+h)
commutativa f + g = g + h
esiste l'elemento neutro: la funzione o(x) = 0 tale che o + f = f +o = f per ogni f
ogni elemento ammette l'opposto (-f) (x) = - f(x).
Rispetto all'operazione + l'insieme C[a,b] è un gruppo commutativo
Per la moltiplicazione per scalare così definita (k . f)(x) = k f(x) dove k è un numero reale:
Proprietà
(k+h).f = k.f + h.f
k.(f+g) = k.f + h.g
1. f = f
Rispetto a queste due prime operazioni è uno spazio vettoriale
Per la moltiplicazione così definita (f * g)(x) = f(x)*g(x) valgono le proprietà:
Commutativa f*g = g*f
Associativa (f*g)*h=f*(g*h)
Esiste l'elemento neutro 1 così definito 1(x)=1 e tale che 1*f = f*1 =f
Per il prodotto scalare che viene definito <f,g> = Integrale su [a,b] di f * g
E per la norma || f || = < f,f >1/2
Valgono le seguenti proprietà:
|| f || > 0 per ogni f non nulla e || f || =0 solo per la funzione nulla
< f+g, h> = <f,h> + <g,h>
<k.f, g>= k< f , g> =<f, k.g ,h>
Una struttura di questo genere per le funzioni continue su in intervallo ha proprietà analoghe rispetto a quelle di Rn con la differenza che, nel caso delle funzioni lo spazio ha dimensione infinita.
Nel caso di Rn ogni vettore può essere espresso mediante una base ortonormale cioè formata da vettori linearmente indipendenti e perpendicolari tra loro ( il prodotto scalare tra due qualsiasi vettori è nullo) e di norma 1. Anche in questo caso si può cercare una base ortonormale tra il sottinsieme dei polinomi.
Si procede in questo modo:
si prendono come vettori indipendenti le funzioni polinomiali e0=1, e1= x, e2=x2, e3=x3, ….en xn,….
Evidentemente sono linearmente indipendenti in quanto nessuno di essi può essere espresso come combinazione degli altri.
Si procede poi alla ortonormalizzazione procedendo per induzione a partire da
b0 = e0/|| e0||,
supposto di aver ortonormalizzato l'n-1esimo si procede con l'n esimo:
………en - (< en,b0>. b0 + < en,b1>. b1+ < en,b2>. b2 +…..+ < en,bn-1>. bn-1 )
bn = ------------------------------------------------------------------------------
….. || en - (< en,b0>. b0 + < en,b1>. b1+ < en,b2>. b2 +…..+ < en,bn-1>. bn-1 ) ||
Si ottiene una famiglia di polinomi ortonormali. ( è facile provarlo) che chiamiamo polinomi di Legendre.
Per approssimare una funzione continua data si proietta tale funzione nelle direzione dei vettori della base ortonormale trovata (bi)
pi = <f(x),bi>
limitandosi naturalmente ai primi n , trovandone le componenti, dopo di che si ricostruisce il polinomio approssimando
Af = p0. b0 + p1 .b1+ p2 .b2 + …… + pn .bn
Per entrare nel concreto i polinomi si rappresentano con la successione de coefficienti, successione di numeri nulli da un certo momento in poi,
per esempio la successione (1,3, -2 ,0, 5,0,0,0,0,0,0,0,0,…… ,0, …..) rappresenta il polinomio 1+3x-2x2 +5x4
Con questa rappresentazione si possono definire tutte le operazioni indicate sopra:
La somma e la moltiplicazione per scalare si fanno evidentemente componente per componente e sono facili da costruire mentre la moltiplicazione viene così definita:
(a0,a1,a2,a3,a4,a5,a6,a7….. )*(b0,b1,b2.b3,b4,b5,b6……)= (a0b0, a0b1+a1b0, a0b2+a1b1+a2b0, a0b3+a1b2+a2b1+a3b0,…)
che poi è la solita moltiplicazione tra polinomi.
Per quanto riguarda il prodotto scalare tra due vettori si deve prima costruire il polinomio prodotto (come sopra ) poi si calcola la primitiva spostando i coefficienti di un posto e dividendoli per la posizione in cui vengono scritti
Primitiva(a0,a1,a2,a3,a4,a5,a6,a7….. ) = (0, a0 , a1 /2 , a2 /3 , a3/4 , a4/5, a5/6 , a6/7 .... )
Si calcola poi la differenza tra i valori della primitiva negli estremi dell'intervallo, per questo si usa l'algoritmo di Horner;
se P=(a0,a1,a2,a3,a4,a5,a6,a7….. ), e vogliamo calcolare il valore del polinomio in x
P(x) =((… (((xan+an-1)x+an-2)x+an-3 )x…….+a2)x+a1)x+a0
Questo algoritmo è semplice da formalizzare ed efficace.
Costruite tutte le operazioni si procede come si è detto inizialmente per costruire, una volta dato l'intervallo , i polinomi di Legendre e in base a questi il polinomio approssimante la funzione data.
L'uso del programma di simulazione è molto semplice e consente di visualizzare il grafico di una funzione lineare a tratti (spezzata) e della sua approssimazione mediante polinomi di Legendre, oppure consente di visualizzare l'andamento dei polinomi di Legendre che costituiscono la base ortonormale per quel dato intervallo considerato.
Per costruire la spezzata si trascinano i vartici con il mouse, il numero dei punti interni può essere aumentato o diminuito con i tasti appositi, viene contemporaneamente visualizzata la funzione approssimante e il suo grafico. Anche il grado del polinomio approssimante può essere modificato con gli appositi tasti.
I tasti a sinistra servono per modificare la finestra (zoom) mentre col tasto Legendre si passa dalla visualizzazione e rappresentazione del polinomio approssimante alla famiglia di polinomi ortonormali relativi a quel dato intervallo ( anche l'intervallo può essere modificato trascinando i pallini nelle estremità).