Documente Academic
Documente Profesional
Documente Cultură
RAPORT
VARIANTA 13
A efectuat: st.gr.TI-192
Mereuță Ana
A verificat: Lector Universitar
Anatol Godonoagă
CHIŞINĂU – 2020
Tema: Interpolarea funcțiilor cu ajutorul polinomului Lagrange.
Scopul lucrării: Pentru funcţia f:[a, b]→R se cunosc valorile y0, y1, y2,…,yn în nodurile distincte x0, x1,
x2,…, xn, adică yi=f(xi), i=0,1,2,…,n.
2) Să se calculeze valoarea funcţiei f(x) într-un punct x=α utilizând polinomul de interpolare Lagrange Ln(x).
3) Să se aproximeze 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), unde m <n.
Se dă y=f ( x ) cu nodurile x 1 , x 2 , … , x n:
1.Să se construiască polinomul de interpolare Lagrange Ln (x) care aproximează funcția dată.
Listning-ul Programului:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <cmath>
int main()
{ int n,i,j,h,k;
float x[20],y[20],x1,a[20][20],ly[20],m,v[20],p[20];
cout<<"Dati numarul de noduri de interpolare: ";
cin>>n;
cout<<"Dati valorile tabelare"<<endl;
for(i=0;i<n;i++)
{ printf("x%d= ",i);
m1:cin>>x[i];
for(j=0;j<i;j++)
if(x[i]==x[j]){
cout<<"x"<<i<<"= ";
goto m1;
}
}
cout<<endl;
for(i=0;i<n;i++)
{
printf("y%d= ",i);
m2:cin>>y[i];
}
cout<<endl;
cout<<endl;
cout<<"Datele tabelare: \n"<<endl;
cout<<" x |";
for(i=0;i<n;i++)
cout<<"\t"<<x[i];
cout<<endl;
cout<<"-----";
for(i=0;i<n;i++)
cout<<"--------";
cout<<endl;
cout<<" y |";
for(i=0;i<n;i++)
cout<<"\t"<<y[i];
cout<<endl;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
a[i][j]=0;
for(i=0;i<n;i++)
a[i][n]=y[i];
for(i=0;i<n;i++)
{ly[i]=1;
for(j=0;j<n;j++)
if(i!=j)
ly[i]=ly[i]*(x[i]-x[j]);
}
int i_x;
for(i_x=0;i_x<n;i_x++)
{h=1;
for(i=0;i<n;i++)
if(i_x!=i)
{v[h]=x[i];
h++;}
v[0]=1;
for(i=1;i<=n-1;i++)
{
m=v[i];
v[i]=0;
for(k=i;k>=1;k--)
v[k]=v[k]-v[k-1]*m;
}
cout<<endl;
for(j=0;j<n;j++)
a[i_x][j]=(v[j]*y[i_x])/ly[i_x];
}
for(j=0;j<n;j++)
for(i=0;i<n;i++)
a[n][j]=a[n][j]+a[i][j];
for(i=0;i<n;i++)
p[i]=a[n][i];
cout<<endl;
cout<<endl;
cout<<"\tPolinomul Lagrange: \n\n";
cout<<"\t";
for(i=0;i<n;i++)
{
if(p[i]<0)
if(i==n-1)
printf("%.2f",p[i]);
else if(i==n-2)
printf("%.2fx ",p[i]);
else
printf("%.2fx^%d ",p[i],n-1-i);
if(p[i]>0)
if(i==0)
printf("%.2fx^%d ",p[i],n-1-i);
else if(i==n-1)
printf("+%.2f",p[i]);
else if(i==n-2)
printf("+%.2fx ",p[i]);
else
printf("+%.2fx^%d ",p[i],n-1-i);
}
cout<<"\n\n";
float x0;
m3:cout<<endl;
cout<<"Dati un argument pentru a afla valoarea lui : "<<endl;
cin>>x0;
float lx0=0;
for(i=0;i<n;i++)
{
lx0=lx0+(p[i]*pow(x0,n-1-i));
}
cout<<endl;
cout<<"L("<<x0<<")= "<<lx0;
cout<<endl<<endl;
cout<<"Doriti alt argument ?"<<endl;
cout<<"[1]-DA"<<endl;
cout<<"[2]-NU"<<endl;
int ord;
cin>>ord;
if(ord==1)
goto m3;
getch();
}
Rezultatul Programului:
Concluzia:
În urma efectuării lucrării de laborator am studiat polinomul de interpolare Lagrange. Am elaborat un
algoritm care construiește polinomul Lagrange pentru o funcție în baza unui șir de argumenți și valori
cunoscute. În concluzie pot afirma că acest algoritm poate fi pe larg aplicat în practică, căci cu ajotorul
polinomului Lagrange este posibil de determinat valoarea aproximativă a unei funcții nepolinomiale fără a
dispune de calculatoare performante.