Documente Academic
Documente Profesional
Documente Cultură
7. Aproximarea functiilor
Polinoame de interpolare (I)
1. Polinomul LAGRANGE
Una dintre cele mai cunoscute formule de interpolare este construita de Lagrange sub
forma unui polinom de interpolare.
Sa presupunem ca in intervalul [a,b] sunt specificate n valori ale argumentului x1, x2, . . . ,
xn, si valorile corespunzatoare ale unei functii f(x)
f(xi)=yi, i=1,2,…,n
Se cere construirea unui polinom Lm(x) care ia in punctele specificate xi aceleasi valori ca si
functia f(x)
Deoarece polinomul cautat, pi(x), se anuleaza in cele (n-1) puncte x1, …, xi-1, xi+1, …, xn, el
are expresia
p i ( x ) = C i ( x − x 1 ) Κ ( x − x i −1 )( x − x i +1 ) Κ ( x − x n ) = C i ∏ i( x) unde Ci este un
coefficient constant, iar
∏i( x ) = ∏ ( x − x j )
j≠i
Luind x=xi si avand in vedere ca pi(xi)=1 obtinem C i = 1 / ∏ i( x i ) . Cu acestea, gasim
pentru polinomul pi(x) care satisface conditiile (2)
pi ( x ) =
∏i(x ) (3)
Revenind acum la
∏i problema initiala a construirii polinomului L (x) care
( x i )
m
satisface conditiile (1), acesta poate fi scris sub forma
n
Lm ( x ) = ∑ pi (x )yi (4)
i =1
1
METODE NUMERICE
Intr-adevar, deoarece polinoamele pi(x), sunt de ordinul (n-1), si Lm(x) este de ordinul (n-
1) si satisface conditiile (1)
n n
L n −1 ( x j ) = ∑ pi ( x j ) y i = ∑ δijyi = y j , j = 1,2,..., n
i =1 i =1
Inlocuind expresia (3) a polinoamelor pi(x) in (4) rezulta formula de interpolare a lui
Lagrange
∏ (x − x j )
n
∏i y = j ≠ i
(x ) n
L n −1 ( x ) = ∑ i ∑ yi
i =1 ∏ i i i =1 ∏ i
( x ) ( x − x j )
j≠i
Vom crea o fucntie numita Lagrange cu cinci parametri :
ni – numarul de punctelor de interpolare
xi si yi – tablouri care contin coordonatele punctelor de interpolare
x – argumentul pentru care se calculeaza valoarea polinomului Lagrange de interpolare
y – valoarea de iesire a functiei
/*
Polinomul de interpolare Lagrange
*/
#include<iostream.h>
float xi[20], yi[20], x, y;
int ni;
void main(void)
{
cout<<" n = ";cin>>ni;
cout<<" Vector x = "<<endl;
for(int i=1;i<=ni;i++)
{
cout<<"x["<<i<<"]= ";
2
METODE NUMERICE
cin>>xi[i];
}
cout<<" Vector y = "<<endl;
for(i=1;i<=ni;i++)
{
cout<<"y["<<i<<"]= ";
cin>>yi[i];
}
cout<<"Dati valoarea punctului pt. care se calculeaza polinomul =";
cin>>x;
y=lagrange(xi,yi,ni,x);
cout<<"Valoarea pentru "<<x<<" este "<<y<<endl;
}
Executia programului :
n=4
vector x = {-2, 1, 2, 4}
vector y = {25, -8, -15, -13}
valoarea punctului pt. care se calculeaza polinomul = 3
Valoarea pentru 3 este 17.22221
2. Polinomul AITKEN
Schema de interpolare Aitken porneste de la polinomul Lagrange in mai multe puncte : x0,
x1, x2, . . . , xn.
y0 x0 − x
Se considera expresia
y1 x1 − x
L 01 ( x ) =
x1 − x 0
y (x − x) − y1(x0 − x) x1 − x x − x0 x − x1 x − x0
L01(x) = 0 1 = y0 + y1 = y0 + y1.
x1 − x0 x1 − x0 x1 − x0 x0 − x1 x1 − x0
care este tocmai expresia polinomului Lagrange construit pe nodurile x0, x1.
L 01 ( x 0 ) = y 0 ; L 01 ( x1 ) = y1 ;
Deoarece polinomul de gradul intai in punctele x0 si x1 ; respectiv valorile y0 si y1 este unic,
3
METODE NUMERICE
acest lucru inseamna ca L01(x) rezolva problema interpolarii pentru nodurile x0, x1 (x0 < x1).
In mod analog se construiesc polinoamele de interpolare liniare :
y1 x1 − x y n −1 x n −1 − x
y2 x2 − x yn xn − x
L 12 ( x ) = L n −1,n ( x ) =
x 2 − x1 ;....; x n − x n −1
Putem considera acum
L 01 ( x ) x 0 − x
L 21 ( x ) x 2 − x
L 012 ( x ) =
x2 − x0
care este un polinom de gradul doi in x.
In general, avem :
L 01Κ n −1 ( x ) x 0 − x
L 21 Κ n( x ) x n − x
L 012Κ n ( x ) =
xn − x0
care va fi polinomul de interpolare Lagrange pentru nodurile x0 < x1 < . . . <xn, si care are
in aceste puncte valorile y0, y1, . . . , yn.
Se observa ca L012…n(x) se obtine din L012…n-1(x) si L12…n(x) la fel cum L01(x) s-a obtinut din
y0 si y1, dupa aceeasi schema.
4
METODE NUMERICE
Exemplu :
x -2 1 2 4
f 25 -8 -15 -13
L3(a)= . . . . = -17.22
Programul urmator prezinta implementarea in C++ a schemei Aitken intr-un punct dat x.
/*
Schema AITKEN
*/
#include<iostream.h>
float x[10], y[10], xa[10], d[10][20], a;
int n;
void citire(float z[])
{
for(int i=0;i<=n;i++) cin>>z[i];
return;
}
void tipar()
{
cout<<endl<<" Schema Aitken "<<endl;
cout<<"-------------------------------------------"<<endl;
cout<<" x x-a y I II III "<<endl;
cout<<"-------------------------------------------"<<endl;
int n1=n,j,i;
for(i=0;i<=n;i++)
{
cout<<x[i]<<" "<<xa[i]<<" ";
for(j=0;j<=n1;j++)
cout<<d[i][j]<<" ";
n1--;
cout<<endl;
}
return;
}
void aitken()
{
int i;
5
METODE NUMERICE
for(i=0;i<=n;i++) xa[i]=x[i]-a;
for(i=0;i<=n;i++) d[i][0]=y[i];
int n1,k=1,j;
for(j=1;j<=n;j++)
{
n1=n-j;
for(i=0;i<=n1;i++)
d[i][j]=(d[i][j-1] * xa[i+k] - d[i+1][j-1] * xa[i]) / (x[i+k]-x[i]);
k++;
}
return;
}
void main(void)
{
cout<<" n = ";cin>>n;
cout<<" a = ";cin>>a;
cout<<" vector x = ";
citire(x);
cout<<" vector y = ";
citire(y);
aitken();
tipar();
cout<<"valoarea pentru a este "<<d[0][n]<<endl;
}