Sunteți pe pagina 1din 5

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra: Tehnologii Informationale

Lucrare de laborator Nr. 3


la Metode numerice

Tema: Interpolarea funciilor.

A efectuat:

st. gr TI 074
Resetnic Octavian
Lector asistent
Cucu L.

A verificat:

Chiinu 2008

Scopul lucrrii:
Pentru funcia f:[a,b]->R se cunosc valorile y f ( x ), i 0,1,2....n n punctele
distincte a x , x ,...., x b
1) S se construiasc polinomul Lagrange L (x) ce aproximeaz funcia dat.
2) S se calculeze valoarea funciei f(x) ntr-un punct x=E utiliznd polinomul
Lagrange L (x)
3) S se aproximeze valoarea funciei f(x) pentru x=E cu eroarea 10 4
4) S se compare i s se explice rezultatele obinute.
i

Consideraii teoretice:
Polinomul de interpolare Lagrange se utilizeaz pe larg atunci cnd discretizarea intervalului [a,b] de
interpolare n subdomenii elementare este neuniform, adic intervalele au o lungime diferit.
Polinomul de interpolare al lui Lagrange se calculeaza dup formula:
n

Ln ( x) yi
i 0
j 0
j i

x xj

xi x j

n multe cazuri concrete de interpolare a funciei f(x) nu enecesar determinarea formei analitice a
polinomului Lagrange, ci doar calculul valorii funciei ntr-un punct dat, diferit de nodurile de interpolare,
eroarea calculelor fiind cunoscut. n aa situaii importante pentru aplicaii se va utiliza schema lui Aitken.
Procedura de calcul const n faptul, c ncepnd cu 2 puncte de interpolare, treptat n calcule se includ noduri
noi pn se va obine precizia dorit.
Algoritmul schemei Aitken presupune efectuarea urmtorilor pai :
Pe intervalul [xi , xi+1] se aplic polinomul Lagrange de interpolare linear:
Li,i*1=yi

x xi 1
x xi
+ yi+1
, unde i=0,1,...,n.
xi 1 xi
xi xi 1

Li,i1,i 2,...,n1x0 x
Apoi Li,i+1,i+2,...,n=

Li 1,i 2,...,n1xn x

,j=2,3,,n-2

xi j x0
pn cnd |L0,1,2(x)-L0,1(x)|,,|L1,2,,m(x)-L0,1,m-1 (x)|< , unde >0 precizia dat i m<n.

Listingul programului:
#include <conio.h>
#include <math.h>
#define NR 7

double mat[2][NR] = {{0.125,0.243,0.367,0.498,0.597,0.701,0.867},


{3.4561,4.9845,5.1439,3.9301,1.7895,-1.234,-2.983}};
double x = 0.4563;
class interpolare
{
double x,eror;
double r[NR][NR];
public:
double *lagrange;
interpolare(void);
~interpolare(void){delete[]lagrange;}
void lagran(void);
void afisalagrange(void);
void yLi(double*,int);
void afisaaitken(void);
};
void interpolare::interpolare(void)
{
x = ::x;
eror = 0.0001;
lagrange = new double[NR];
}
void interpolare::yLi(double *x,int i)
{
double numar = 1.,xi = *(*mat + i);
*x = 1.;
for(register int j = 0,s = 0,f; j < NR; j++)
if(i != j)
{
numar *= (xi - *(*mat + j));
for(f = s; f > -1; f--)*(x + f + 1) = *(x + f);
*x = 0;
for(f = 0; f <= s; f++)*(x + f)+= (*(x + f + 1) * -*(*mat + j));
s++;
}
numar = *(*(mat + 1) + i) / numar;
for(j = 0; j < NR; j++)*(x + j)*=numar;
}
void interpolare::lagran(void)
{
double vec[NR];
for(register int i = 0; i < NR; i++)*(lagrange + i) = 0.;
for(i = 0; i < NR; i++)
{
yLi(vec,i);
for(register int j = 0; j < NR; j++)*(lagrange + j)+= *(vec + j);
}
}
void interpolare::afisalagrange(void)
{
double fx = 0,nnn;
lagran();

cprintf("Polinomul de interpolare Lagrange:\n\n\r");


for(register int i = NR-1,j; i > -1; i--)
{
int x,y;
cprintf("%26.14f * X^%d ",*(lagrange + i),i);
x = wherex();
y = wherey();
gotoxy(x,y+1);
if(i)cprintf("+");
cprintf("\n\r");
}
for(i = 0; i < NR; i++)
{
nnn = 1;
for(j = 0; j < i; j++)nnn*=this->x;
fx+=nnn * *(lagrange + i);
}
cprintf("L%d(%23.14f) = %0.14f\n\r",NR-1,this->x,fx);
}
**(r + i) = (*(*(mat + 1) + i)*(*(*mat + i + 1)-x) - *(*(mat + 1) + i + 1)*(*(*mat + i)-x))/(*(*mat + i + 1) *(*mat + i));
cprintf("%11.8f",**(r + i));
for(j = 1; j <= i; j++)
{
*(*(r + i) + j) = (*(*(r + i - 1) + j - 1)*(*(*mat + i + 1) - x) - *(*(r + i) + j - 1)*(*(*mat + i - j) - x))/
(*(*mat + i + 1) - *(*mat + i - j));
cprintf("%11.8f",*(*(r + i) + j));
}
cprintf("\n\r");
if(i && stop)
if((eror > fabs(*(*(r + i) + i) - *(*(r + i - 1) + i - 1))) || (eror > fabs(*(*(r + i) + i) - *(*(r + i) + i - 1))))
{
textcolor(10);
cprintf("\n\rAm atins eroarea dorita = ");
textcolor(4);
cprintf("%f\n\n\r",eror);
textcolor(14);
stop = 0;
}
}
}
void main(void)
{
textcolor(6);
interpolare a;
clrscr();
a.afisalagrange();
a.afisaaitken();
getch();
}

Concluzie: n aceast lucrare de laborator am realizat programul de construire a


polinomului de interpolare Lagrange Ln (x) i de calculare a valorii funciei f(x) ntr-un punct
dat utiliznd polinomul de interpolare Lagrange i de aproximare a funciei f(x) calculnd
polinomul de interpolare Lm (x), pentru m <n (dup schema lui Aitken).n rezultat am

constatat c n practic e mai efectiv aproximarea funciei f(x) calculnd polinomul de


interpolare Lm(x).