Sunteți pe pagina 1din 4

Universitatea Tehnica a Moldovei

Catedra Automatică și Tehnologii Informaționale

Raport
despre lucrarea de laborator №.3

la disciplina Metode Numerice

Tema: Interpolarea Funcțiilor

A îndeplinit: st.gr.AI-151 Brăduleac Vadim

A verificat: conf.univ. Tutunaru Eleonora

Chișinău – 2016
Tema: Interpolarea funcțiilor.

Scopul lucrării:
Pentru funciția f:[a, b] → R se cunosc valorile yi = f(xi), i = 0, 1, ..., n în punctele distincte a = x0,
x1, ..., xn = b.
1. Să se construiască polinomul de interpolare Lagrange Ln(x) ce aproximează funcția dată.
2. Să se calculeaze valoarea funcției f(x) într-un punct x = ε utilizînd polinomul de interpolare
Lagrange Ln(x).
3. Să se apoximeze valoarea funcției f(x) pentru x = ε cu eroarea ε = 10-4 (sau cu cea mai bună
exactitate posibilă), calculînd polinomul de interpolare Lagrange Lm(x) pentru m < n.

Varianta propusa pentru rezolvare:


x 0.125 0.243 0.367 0.498 0.597 0.701 0.867
y 3.4561 4.9845 5.1439 3.9301 1.7895 -1.234 -2.983

Punctul x = ε este: a) 0.183; b) 0.3012; c) 0.4563; d) 0.6500

Date teoretice:
Pornind de la funcția f(x) definită tabelar, polinomul de interpolare Lagrange de grad n, notat
Ln(x) se definește ca o combinație liniară de polinoame k = 1, ..., n+1, care formează baza
de interpolare. Coeficienții combinației liniare sunt tocmai valorile funcției de aproximat în
nodurile de interpolare:

Expresiile polinoamelor se determină impunînd condiția că polinomul Lagrange astfel


definit să satisfacă condițiile de interpolare. În final, pentru polinomul Ln(x) se obține expresia:

Și în acest caz polinomul de aproximare calculat cu expresia de mai sus are gradul impus de
numărul nodurilor de interpolare care apar în tabelul de definiție al funcției de aproximat.
Pentru a evita apariția oscilațiilor între nodurile de interpolare - oscilații care apar în special
în cazul unui număr mare de noduri de interpolare - se poate folosi interpolarea cu polinoame
Lagrange de grad liber. Pentru un punct de calcul x* se folosesc numai o parte din nodurile din
tabelul de definiție a funcției f(x), și anume nodurile cele mai apropiate de punctul de calcul x*.
Polinomului de interpolare Lagrange i se poate asocia un tablou asemănător celui al
diferențelor divizate (vezi polinomul de interpolare Newton), format însă din polinoame
Lagrange calculate pe o mulțime de noduri de interpolare diferite de la un element la altul. În
continuare se folosesc notațiile:
L_1,n-1(x) - polinomul Lagrange de grad n-1 care trece prin primele n noduri de interpolare
(x_1 , f_1), (x_2 , f_2), ... , (x_n , f_n)
L_2,n-1(x) - polinomul Lagrange de grad n-1 care trece prin ultimele n noduri de interpolare
(x_2 , f_2), (x_3 , f_3), ... , (x_n+1 , f_n+1)
L_1,n(x) - polinomul Lagrange de grad n care trece prin toate cele n+1 noduri de interpolare.
Intre aceste polinoame exista relatia:
In general, se poate defini un polinom Lagrange generic L_i,j (x) de grad j care trece prin j+1
noduri de interpolare, incepand cu nodul i, adica prin punctele (x_i , f_i), (x_i+1 , f_i+1), ... ,
(x_i+j , f_i+j):

Exista un singur polinom de grad n (L_1,n (x)), doua polinoame de grad n-1 (L_1,n-1 (x) si
L_2,n-1 (x)) s.a.m.d. pana la n+1 polinoame de grad 0 (L_1,0 (x), L_2,0 (x), ... , L_n+1,0 (x))
identice cu valorile functiei in nodurile de interpolare. Aceste polinoame pot fi organizate intr-
un tablou de forma:

Dintre polinoamele L_i,j din acest tablou, cele care intereseaza sunt cele care folosesc succesiv 1,
2, ... , n+1 noduri de interpolare. Aceste polinoame sunt L_1,1 , L_1,2 , ... , L_1,n+1, adica prima
linie din tabloul de mai sus. Pentru a putea calcula insa polinomul L_1,n+1 este necesar calculul
in prealabil al tuturor celorlalte polinoame din tablou.

Listingul Programului:
#include<iostream>
#include<conio.h>
#include<math.h>
using namespace std;

float X[10],Y[10],A[10],x1,y;
int n,i;

void Lagrange(){
int i,j,k;
float C[10],B[10],r;
C[0]=1;
for(i=0; i<=n; i++){
C[i+1]=C[i];
for(j=i;j>=1;j--){
C[j]=C[j-1]-C[j]*X[i];
}
C[0]=-C[0]*X[i];
}
for(i=0;i<=n;i++){
A[i]=0;
}
B[n]=C[n+1];
for(i=0;i<=n;i++){
r=1;
for(j=0;j<=n;j++){
if(i!=j)
r=r*(X[i]-X[j]);
}
for(k=n-1;k>=0;k--){
B[k]=C[k+1]+X[i]*B[k+1];
}
for(k=0;k<=n;k++){
A[k]+=Y[i]*B[k]/r;
}
}
y=A[n];
for(i=1;i<=n;i++){
y=x1*y+A[n-i];
}
};

int main(void){
cout<<"\t\t\tInterpolarea Functiilor"<<endl<<endl;
cout<<"Introduceti numarul de noduri de interpolare: ";
cin>>n;
cout<<endl<<"Introduceti elementele tablourilor X si Y dub forma de tabel:"<<endl<<endl;
cout<<" [X]"<<endl;
for(i=0;i<n;i++){
cin>>X[i];
}
cout<<endl<<" [Y]"<<endl;
for(i=0;i<n;i++){
cin>>Y[i];
}
et:cout<<endl<<"Introduceti punctul de interpolare pentru calculul valorii functiei: ";
cin>>x1;
cout<<endl<<"Polinomul Lagrange construit este:"<<endl<<endl;
Lagrange();
for(i=0;i<=n;i++){
cout.precision(4);
if((A[i]>0)&&(i!=0))cout<<'+'<<A[i]<<"*X^"<<n-i;
else cout<<A[i]<<"*X^"<<n-i;
}
cout<<endl<<endl<<"Valoarea functiei in punctul "<<x1<<" este: "<<y<<endl;
cout<<"\nIntroduceti alt punct de interpolare;"<<endl;
goto et;
getch();
}
Rezultatele obținute:

Concluzie: În urma efectuării lucrării date de laborator am obținut experiența în domeniul


interpolării funcțiilor și de aceea putem afirma că interpolarea numerică și-a găsit o largă
utilizare nu numai în problemele în care se cere a calcula valorile funcției în punctele diferite de
nodurile de interpolare. În multe aplicații, mai ales în cele legate cu măsurările, este necesar a
verifica exactitatea tabelului obținut. Această problemă se poate de rezolvat cu ajutorul
interpolării, calculînd diferențele finite de diferit ordin și efectuînd o analiză a comportării lor.

S-ar putea să vă placă și