Vous êtes sur la page 1sur 21

IV Aproximarea funciilor.

Metode de interpolare

Metodele de aproximare a funciilor revin la determinarea unor forme aproximative ) ( ) un set de perechi de puncte. pe baza unor valori nodale cunoscute. Fie ( Problema este de a determina ( ) cu proprietatea (1) Funcia ( ) n nodurile { } .

cu proprietatea (1) se spune c interpoleaz setul { }

Dac este polinomial, metoda se numete interpolare polinomial; dac este funcie trigonometric, metoda se numete aproximare trigonometric, iar dac este local polinomial metoda se numete interpolare polinomial pe poriuni sau interpolare de tip spline.

4.1. Interpolare polinomial. Polinomul Lagrange. Forma Newton a polinomului Lagrange. , Fie ( ( ) ) ( ) perechi de puncte. Problema este de a gsi un polinom cu ( ) , .

Dac Lagrange).

este obinut urmtorul rezultat (polinomul de interpolare n forma ) cu ( ), unde . Exist un singur

) ( Teorem. Fie ( polinom, , cu proprietatea ( ) ( ) ( ) ( )

Teorem. Eroarea de aproximare. Fie puncte distincte din domeniul unei funcii f. Dac ( ), unde Ix este cel mai mic interval care conine i x i este polinomul de interpolare n forma Lagrange, atunci eroarea de aproximare a lui f prin n punctul x este
(

( ) unde i

( )

( )

)(

( )

( ) este polinomul modal de grad n+1.

Stabilitatea polinomului de interpolare Fie { ( )} perturbaii ale datelor { ( )} relativ la nodurile

{ } [ ]. Perturbaiile pot fi induse de msurarea experimental a este polinomul de interpolare corespunztor datelor sau pot fi erori de rotunjire. Dac { ( )} atunci ( )) ( )|

| ( ( )

( )|

( )

| ( )

Forma Newton a polinomului de interpolare Implementarea interpolrii polinomiale n forma (1) este ineficient din punct de vedere practic. O variant alternativ de calcul al polinomului (2) este urmtoarea (forma Newton). Fie {( grad n ) ( )}, cu ( ) pentru ( ) , polinomul de interpolare a lui f, de

este polinomul de interpolare a lui f, de grad n-1 ( ) Fie relaia de recuren ( ) unde ( ) e un polinom de grad n. ( ) ( ) rdcinile ( ( ( ) ) ( ( ) ( ) ( ) ) ( .) ( ) ( ) ( ) ) ( ) ( ) ( ) ( ( ) ) ) ( ) ( ) (polinom de gradul n cu ( ) ( ) ( )

Pe baza relaia (3) rezult, ( i ( ) cu ( ) ( ) ( ) ) ( ) ( ) ( ) ( )

definit de (4). Prin aplicarea relaiei (5) recursiv obinem: ( ) unde ( ) ( ) ( ) ( )

Relaia (6) este referit prin formula Newton. Algoritmul calculeaz valoarea polinomului de interpolare n punctul x, pe baza formulelor de recuren , ( ) ( cu ) ( ) ( ) ( ( ) ) . ) { ( ) . , ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )

n algoritm matricea L este definit astfel: ( ( ) n final, vectorul F: ( ) valoarea polinomului de interpolare rezultat n F(n).

, cu x punctul n care este calculat

Pentru implementarea formei Newton a polinomului de interpolare vom ine cont de posibilitatea de a defini recursiv valorile polinoamelor modale de ordin i, , n punctele modale, respectiv n punctul x n care dorim s aproximm funcia astfel. ( ) Pentru orice ( ) ( , ) ( ) i orice ( ) , are loc relaia de recuren,

Vom considera n continuare Omega, matrice cu n+1 linii i n+2 coloane, definit de ( ) ( )

(valorile corespunztoare parametrului k, k>i nu sunt utilizate) ( ) ( ) Obinem, ( ( ( ) ) ( ) ( ) ) ( ) ( )

Algoritmul, notat n continuare FormaNewton1, poate fi descris astfel: Date de intrare: {(


( )( )

)}, cu

pentru

,x

(elementele matricei L sunt valorile ( ) [ ]

(iniializarea primei linii a matricei L cu ( )

( )

(n ( ) vom avea n final valoarea polinomului n x) Omega, matrice cu n+1 linii i n+2 coloane, iniializat cu 1

pentru k=i..n ( ( () ( ( ) )

( ) )

) ( ( ( ( )

( ) ( ( )

) ( ( ))

( ))

)
( ) ( )

)
( ( ) )

Dat de ieire:

Observaie: pentru buna nelegere a surselor MATLAB prezentate n cele ce urmeaz, cititorul va ine cont de explicaiile prezentate n partea comentat i de faptul c indicii unui masiv MATLAB ncep de la 1. n sursa MATLAB date_interp_LNewton sunt calculate punctele de interpolare pentru aproximarea unei funcii f.
function [xd,y]=date_interp_LNewton(f,n,a,b) l=b-a; xd=zeros(n+1,1); xd(1)=a; for i=2:n+1 xd(i)=xd(i-1)+l/n;

end; y=zeros(n+1,1); for i=1:n+1 x=xd(i); y(i)=eval(f); end; end;

n sursa MATLAB interpolare_Lagrange este implementat polinomul de interpolare n form Lagrange.


function [val]=interpolare_Lagrange(xxx,a,b) %[xd,yd]=date_interp_LNewton('1+sin(3*x)',10,a,b); %lucram pe f(x)=1+sin(3x) pe intervalul [0 2] [xd,yd]=date_interp_LNewton('x-sin(2*x)^2',10,a,b); %lucram pe f(x)=x-sin(2*x)^2 pe intervalul [0 2] %lucram pe f=1/(1+x^2) pe intervalul [-5 5] - functia Runge %[xd,yd]=date_interp_LNewton('1/(1+x^2)',10,a,b); [n,m]=size(xd);%m=1 val=0; for i=1:n p=1; for j=1:n if(i~=j) p=p*(xxx-xd(j))/(xd(i)-xd(j)); end; end; val=val+p*yd(i); end; end; disp('Valoarea calculata'); disp(val); %disp(L); end;

n sursa MATLAB interpolare_LNewton_17 este implementat varianta Newton a polinomului de interpolare, cu calculul valorii polinomului de interpolare ntr-un singur punct.
function [val]=interpolare_LNewton_17(xxx,a,b) [xd,yd]=date_interp_LNewton('1+sin(3*x)',10,a,b); %lucram pe f(x)=1+sin(3x) pe intervalul [0 2] %[xd,yd]=date_interp_LNewton('x-sin(2*x)^2',10,a,b); %lucram pe f(x)=x-sin(2*x)^2 pe intervalul [0 2] %lucram pe f=1/(1+x^2) pe intervalul [-5 5] - functia Runge %[xd,yd]=date_interp_LNewton('1/(1+x^2)',10,a,b); %aici n este numarul de noduri, deci este n+1 din algoritm [n,m]=size(xd); L=zeros(n);F=zeros(1,n); L(1,:)=yd(1); F(1)=yd(1); omega=ones(n,n+1);

for i=1:n-1 omega(i+1,i+1:n)=((xd(i+1:n)-xd(i))'.*omega(i,i+1:n)); L(i+1,i+1:n)=L(i,i+1:n)+(yd(i+1)L(i,i+1))*omega(i+1,i+1:n)/omega(i+1,i+1); omega(i+1,n+1)=(xxx-xd(i))*omega(i,n+1); F(i+1)=F(i)+(yd(i+1)-L(i,i+1))*omega(i+1,n+1)/omega(i+1,i+1); end; disp('Valoarea calculata'); disp(F(n)); val=F(n); %disp(L); end;

Algoritmul FormaNewton1 permite generalizarea la calculul mai multor valori ale polinomului de interpolare simultan, innd cont de faptul c matricea L i matricea Omega din care este exclus ultima coloan nu depind de punctele n care este intenionat evaluarea ) ( )}, cu polinomului de interpolare, ci numai de punctele nodale {( pentru . Astfel, pentru calculul valorilor polinomului de interpolare n nrpuncte puncte, meninute n vectorul de intrare xxx, sunt necesare urmtoarele modificri 1. F este matrice cu nrpuncte linii i n+1 coloane, pentru fiecare , ( ) are semnificaia valorii lui ( ) din algoritmul FormaNewton1 pentru calculul valorii polinomului de interpolare n punctul xxx(k) Pentru fiecare punct xxx(k), , matricea Omega calculat de FormaNewton1(din care este exclus ultima coloan) este extins cu cte o coloan, ( ) ( )) ( , ( )) ( ), Rezultatele evalurilor sunt reprezentate de vectorul (

2.

3.

Este obinut urmtorul algoritm, FormaNewton2, ) ( )}, cu Date de intrare: {( pentru elemente, n care va fi evaluat polinomul de interpolare
( )( )

, xxx vector cu nrpuncte

(elementele matricei L sunt valorile ( ) [ ]

(iniializarea primei linii a matricei L cu ( ) (n (

( )

) vom avea n final valoarea polinomului n xxx(k))

Omega, matrice cu n+1 linii i n+1+nrpuncte coloane, iniializat cu 1

pentru k=i..n ( )

) (

( ) ) ) ( (

) ( ( ( ) (

( )) ) ))

)
( ) ( )

pentru k=0..nrpuncte-1 ( ( ) (

(
( ( ) )

Date de ieire:

( ))

),

n sursa MATLAB interpolare_LNewton_17bis este implementat varianta Newton a polinomului de interpolare cu calculul valorilor polinomului de interpolare in mai multe puncte (nrpuncte) simultan.
function [val]=interpolare_LNewton_17bis(xxx,a,b) %[xd,yd]=date_interp_LNewton('1+sin(3*x)',10,a,b); %lucram pe f(x)=1+sin(3x) pe intervalul [0 2] [xd,yd]=date_interp_LNewton('x-sin(2*x)^2',7,a,b); %lucram pe f(x)=x-sin(2*x)^2 pe intervalul [0 2] %lucram pe f=1/(1+x^2) pe intervalul [-5 5] - functia Runge %[xd,yd]=date_interp_LNewton('1/(1+x^2)',10,a,b); [nrpuncte,t]=size(xxx); %nrpuncte - numarul punctelor in care calculam valoarea polinomului de interpoloare %aici n este numarul de noduri, deci este n+1 din algoritm [n,m]=size(xd); L=zeros(n);F=zeros(nrpuncte,n); L(1,:)=yd(1); F(1:nrpuncte,1)=yd(1); omega=ones(n,n+nrpuncte); for i=1:n-1 omega(i+1,i+1:n)=((xd(i+1:n)-xd(i))'.*omega(i,i+1:n)); L(i+1,i+1:n)=L(i,i+1:n)+(yd(i+1)-L(i,i+1)) *omega(i+1,i+1:n)/omega(i+1,i+1); omega(i+1,n+1:n+nrpuncte)=(xxx(1:nrpuncte)-xd(i))'. *omega(i,n+1:n+nrpuncte); F(1:nrpuncte,i+1)=F(1:nrpuncte,i)+(yd(i+1)-L(i,i+1) *omega(i+1,n+1:n+nrpuncte)'./omega(i+1,i+1); end; val=F(1:nrpuncte,n); end

n sursa MATLAB interpolare_LNewton_grafice_18 sunt prezentate grafic rezultatele interpolrii n cazul mai multor funcii, date n comentarii
function []=interpolare_LNewton_grafice_18(nrp,a,b) %lucram pe f(x)=1+sin(3x) pe intervalul [0 2] %lucram pe f(x)=x-sin(2x)^2 pe intervalul [0 2]

%lucram pe f=1/(1+x^2) pe intervalul [-5 5] - functia Runge lung=b-a; val=zeros(nrp+1,1); xxx=zeros(nrp+1,1); for i=1:nrp+1 xxx(i)=a+(i-1)*lung/nrp; end; val=interpolare_LNewton_17bis(xxx,a,b); figure; x=0:0.0001:2; %plot(x,1+sin(3*x),'r'); fx=x.^1-sin(2*x).^2; %x=-5:0.0001:5; %fx=1./(1+x.^2); plot(x,fx,'r'); hold on; plot(xxx,val,'k'); axis square; end;

n urmtoarele grafice sunt prezentate rezultatele interpolrii prin noduri egal distanate (cu rou sunt funciile i cu negru polinoamele de interpolare) pentru funciile
f(x)=1+sin(3x) pe intervalul [0 2]

n=3

n=5

f(x)= x-sin(2x)^2 pe intervalul [0 2]

n=5

n=10

f=1/(1+x^2) pe intervalul [-5 5] - funcia Runge

n=10

4.2. interpolarea polinomial pe poriuni { }{ } { n cazul seturilor de puncte {{ } sunt egal deprtate, convergena polinomului Exemplu. Fie funcia Runge, }} cu proprietatea c nodurile ctre f nu este garantat.

( ) i interpolarea Lagrange pe noduri egal distanate. Se poate arta c exist x n intervalul de interpolare astfel nct | ( ) ( )| (vezi exemplul MATLAB

n particular interpolarea Lagrange diverge pentru | | pentru funcia Runge prezentate mai sus).

Pe de alt parte, dac este utilizat o secven de noduri egal distanate, un polinom de interpolare Lagrange de grad relativ mic aproximeaz suficient de bine funcia pe intervale de lungime mic. n consecin devine natural introducerea unei diviziuni a intervalului iniial [ ] n k subintervale [ ] [ ] utiliznd n+1 noduri { } cu n mic.

i aplicarea interpolrii Lagrange pe fiecare Pentru ( i [ ] , fie

polinomul de interpolare a lui f pe )

de gradul n. Fie

funcia de interpolare polinomial pe poriuni (local), (7) | , ( ) | | ( )| , i


( )

Teorem. Fie ( ) {

(
( )

) pentru ( | ( )| )

, unde . Exist o

} i

constant pozitiv C care nu depinde de h i astfel nct ( ) ( )


( )

( )

Observaie. Pentru implementarea metodei, [ ] este divizat n k intervale i este aplicat algoritmul prezentat la forma Newton pe fiecare subdiviziune. n sursa MATLAB interpolare_LNewton_portiuni_19 este implementat metoda prezentat mai sus.
function []=interpolare_LNewton_portiuni_19(nrp,a,b,K) %lucram pe f(x)=1+sin(3x) pe intervalul [0 2] %lucram pe f(x)=x-sin(2x)^2 pe intervalul [0 2] %lucram pe f=1/(1+x^2) pe intervalul [-5 5] - functia Runge lung=b-a; ai=zeros(K,1);

bi=zeros(K,1); val=zeros((nrp+1)*(K),1); xxx=zeros((nrp+1)*(K),1); for i=1:K ai(i)=a+(i-1)*lung/K; bi(i)=ai(i)+lung/K; for j=1:nrp+1 xxx((i-1)*(nrp+1)+j)=ai(i)+(j-1)*(bi(i)-ai(i))/nrp; %val((i-1)*(nrp+1)+j)=interpolare_LNewton_17(xxx((i-1)* %(nrp+1)+j),ai(i),bi(i)); end; val((i-1)*(nrp+1)+1:i*(nrp+1))=interpolare_LNewton_17bis(xxx((i1)*(nrp+1)+1:i*(nrp+1)),ai(i),bi(i)); end; figure; x=a:0.0001:b; %fx=1+sin(3*x); %fx=x.^1-sin(2*x).^2; fx=1./(1+x.^2); plot(x,fx,'r'); hold on; plot(xxx,val,'k'); axis square; end

n urmtoarele grafice sunt prezentate rezultatele interpolrii pe poriuni, prin noduri egal distanate (cu rou sunt funciile i cu negru polinoamele de interpolare) pentru funciile
f(x)=1+sin(3x) pe intervalul [0 2], 3 polinoame de gradul 3

f(x)= x-sin(2x)^2 pe intervalul [0 2], 3 polinoame de gradul 3

f=1/(1+x^2) pe intervalul [-5 5] - funcia Runge 3 polinoame de gradul 10

4.3. Interpolarea Hermite-Birkoff Interpolarea polinomial Lagrange poate fi extins la cazul n care, pentru nodurile , snt disponibile i valorile derivate ale funciei f. Fie i seturile (
( )

( )), )

date. Dac

se poate demonstra c nodurile { } snt distincte i exist un unic polinom 1, numit polinomul de interpolare Hermite, astfel nct dat de relaia ( ) unde
( ) ( )( ( )

de ordin N,

( )

( )

( )

( )

( )

) ( )
( )

( ) unde ( ) (

( )

( )

Eroarea de interpolare este dat de relaia,


( )

( )

( )

( )

4.4. Aproximarea prin funcii Spline Definiie. Fie . Funcia ( ) [ ( ( ) ) |[


]

n+1 noduri distincte din [ ], este funcie spline de grad k relativ la nodurile

dac

polinom de grad k ([ ])

}, Fie spaiul funciilor spline pe [ ] relativ la { . Evident, orice polinom de grad k pe [ ] este o funcie spline. n practic o funcie spline este reprezentat de cte un polinom pe fiecare subinterval [ ], motiv pentru care pot apare discontinuiti n punctele ; nodurile cu aceast proprietate fiind numite noduri active. Condiiile (11) i (12) nu caracterizeaz complet o funcie spline de ordin k. Fie |[ ] Pe baza relaiei (11) rezult, ( ) ( ) [ ]

dar cei (

coeficieni

trebuie determinai.

Din (12) rezult ( )


( )

( )

( )

( ),

, j=1..n

(funcii continue i derivabile de k-1 ori - nu exist puncte active). Chiar dac funciile spline sunt de interpolare, adic ( ) ( ) , } set dat, funciile spline nu sunt complet caracterizate. Pentru acest lucru, sunt cu { impuse condiii suplimentare; de exemplu: a) funciile spline periodice
( )

( )

( )

( ),

b) funcii spline naturale pentru


( )

( )

( )

Interpolare prin funcii spline cubice Funciile de interpolare spline cubice sunt astfel nct: 1) au gradul minim, ceea ce conduce la aproximri n ( ). 2) snt suficient de netede (smooth) n zone mici de curbur ale funciilor. ( ), Fie { } , i . Problema este de a determina o procedur eficient pentru construcia funciilor spline care interpoleaz ) valorile ( . Deoarece funciile spline sunt de ordinul 3, derivatele de ordinul 2 trebuie s fie continue ( ). Fie ( ), ( ), ( ), . Pentru |[ ( ) (14) ntr-adevr,
]

este de gradul 3 ( )

este liniar i, pentru ( ) , [ ]

( )

( )

( )

) ( ) ( )

( ) ( ) ( ( ) ( Obinem, ( ) ( . ) ( )

( (

) )

( )

( )(

) )

Prin integrarea lui (14) obinem ( ) i, integrnd din nou, rezult ( ) Dar ( rezult ( ( ) ) ) ( ) i ( ) ( ) ( ) ( ) ( ) ( ) ( )

( Obinem ( ( ) ( ) ( ( )

)) (

) , trebuie ca ) ( ) ( )

Pe baza continuitii primei derivate n punctul ( ) ( ) (

( ( )

) (

( ) ) ( ) ( ( )) ( )

( (

) )

Coeficienii , din (15) snt calculai pe baza formulei (16) i prin impunerea unor restricii de tip frontier. (16) revine la sistemul

unde, din (16), obinem ( )

( deci

( pentru i=0

pentru i=n

O alegere frecvent: n concluzie: f aproximat prin [ ] [

] ( )

|[

unde ( ) ( ) ( )

( cu i [

)) (

] soluie a sistemului

) [ i ( ]

n sursa MATLAB interpolare_spline_cubic_20 este implementat algoritmul de interpolare prin funcii spline cubice.
function [val]=interpolare_spline_cubic_20(f,n,a,b,x) %lucram pe f(x)=1+sin(3x) pe intervalul [0 2] %lucram pe f(x)=x-sin(2x)^2 pe intervalul [0 2] %lucram pe f=1/(1+x^2) pe intervalul [-5 5] - functia Runge [xd,yd]=date_interp_LNewton(f,n,a,b); A=zeros(n+1); d=zeros(1,n+1); for i=1:n+1 A(i,i)=2; end; h=zeros(n,1); for i=1:n h(i)=xd(i+1)-xd(i); end; fdif=zeros(n,1); for i=1:n fdif(i)=yd(i+1)-yd(i); end; miu=zeros(n,1); lambda=zeros(n,1); miu(n)=1;lambda(1)=1; for i=1:n-1 miu(i)=h(i)/(h(i)+h(i+1)); lambda(i+1)=h(i+1)/(h(i)+h(i+1)); end; for i=1:n-1 d(i+1)=(6/(h(i)+h(i+1)))*((fdif(i+1)/h(i+1))-fdif(i)/h(i)); end; d(n+1)=d(n);d(1)=d(2); for i=1:n a(i,i+1)=lambda(i); a(i+1,i)=miu(i); end; eps=0.00001; [M,pot_calcula]=s_GEM_4(A,d,eps);%aici se poate aplca o regula de %calcul mai simpla, datorita formei lui A %determina intervalul [xd(i-1)xd(i)] in care se afla x if(x==b) val=yd(n+1); else gata=1; i=2; while((gata==1)&&(i<=n+1)) if(x<xd(i)) disp(i); val=yd(i-1)-M(i-1)*(h(i-1)^2)/6;

val=val+(x-xd(i-1))*(fdif(i-1)/h(i-1)-(h(i-1)/6)*(M(i)-M(i1))); val=val+M(i-1)*((x-xd(i-1))^3)/(6*h(i-1))+M(i)*((xd(i)x)^3)/(6*h(i-1)); gata=0; else i=i+1; end; end; end; disp(val);

n sursa MATLAB interpolare_spline_cubic_grafice_21 sunt prezentate grafic rezultatele interpolrii n cazul mai multor funcii, date n comentarii
function []=interpolare_spline_cubic_grafice_21(f,n,a,b,nrp) %lucram pe f(x)=1+sin(3x) pe intervalul [0 2] %lucram pe f(x)=x-sin(2x)^2 pe intervalul [0 2] %lucram pe f=1/(1+x^2) pe intervalul [-5 5] - functia Runge lung=b-a; val=zeros(nrp+1,1); xxx=zeros(nrp+1,1); for i=1:nrp+1 xxx(i)=a+(i-1)*lung/nrp; val(i)=interpolare_spline_cubic_20(f,n,a,b,xxx(i)); end; figure; x=a:0.0001:b; %fx=1+sin(3*x); %fx=x.^1-sin(2*x).^2; fx=1./(1+x.^2); plot(x,fx,'r'); hold on; plot(xxx,val,'k'); axis square; end;

n urmtoarele grafice sunt prezentate rezultatele interpolrii spline de mai sus, prin noduri egal distanate (cu rou sunt funciile i cu negru polinoamele de interpolare) pentru funciile
f(x)=1+sin(3x) pe intervalul [0 2]

10 subintervale

30 subintervale

f(x)= x-sin(2x)^2 pe intervalul [0 2]

10 subintervale

30 subintervale

f=1/(1+x^2) pe intervalul [-5 5] - funcia Runge

10 subintervale

30 subintervale

Vous aimerez peut-être aussi