Sunteți pe pagina 1din 6

METODE NUMERICE

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)

Lm(xi)=yi, i=1,2,…,n (1)

Pentru aceasta sa construim mai intai un polinom pi(x) pentru care

1, daca j = i (2)


pi ( x j ) = δij = 
0 , daca j ≠ i

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

Programul urmator prezinta implementarea in C++ a polinomului Lagrange intr-un punct


dat x.

/*
Polinomul de interpolare Lagrange
*/
#include<iostream.h>
float xi[20], yi[20], x, y;
int ni;

float lagrange(float xi[], float yi[], int ni, float x)


{
int i, j;
float p, y;
for(i=1;i<=ni;i++)
{
p=1;
for(j=1;j<=ni;j++)
if(j!=i)
p=p*(x-xi[j])/(xi[i]-xi[j]);
y=y+p*yi[i];
}
return y;
}

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

Acesta este un polinom de gradul intai in x.

Efectuand calculele, obtinem :

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 :

L12(x), L23(x), …,Ln-1,n(x)

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.

Se verifica imediat ca L012(x0)=y0 ; L012(x1)=y1 ; L012(x2)=y2 ;


si L012(x) este chiar polinomul de interpolare Lagrange construit pe nodurile x0 < x1 < x2, si care
are in aceste puncte valorile y0, y1, y2.

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.

Acesta schema este urmatoarea :

xi yi xi-x Li-1,i Li-2,i-1,i Li-3,i-2,i-1,i


x0 y0 x0-x
x1 y1 x1-x L01(x)
x2 y2 x2-x L12(x) L012(x)
x3 y3 x3-x L23(x) L123(x) L0123(x)
… … … … … …

Aceasta schema ramane utila si la adaugare de noi valori x si y :

xi xi-x yi Li-1,i Li-2,i-1,i Li-3,i-2,i-1,i


x0 x0-x y0 L01(x) L012(x) L0123(x)
x1 x1-x y1 L12(x) L123(x) …
x2 x2-x y2 L23(x) …
x3 x3-x y3 …
… … …

4
METODE NUMERICE

Exemplu :

x -2 1 2 4
f 25 -8 -15 -13

Se cere Ln(3) , deci a = 3.

xi xi-a yi Li-1,i Li-2,i-1,i Li-3,i-2,i-1,i


-2 -5 25 -30 -20 -17.22
1 -2 -8 -22 -16.67
2 -1 -15 -14
4 1 -13

Rezulta ca L3(3) = 17.22


Aceeasi valoare se obtine si calculand cu polinomul Lagrange :

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;
}

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