POLINOMIOS DE INTERPOLACIÓN DE LAGRANGE
El polinomio de interpolación de Lagrange, simplemente es una reformulación del polinomio de Newton que evita los cálculos de las diferencias divididas. Este se puede representar concretamente como:(21) |
(22) |
Por ejemplo, la versión lineal (n = 1) es:
(23) |
(24) |
(25) |
Por lo tanto, cada producto Li(X) f(Xi) toma un valor de f(Xi) en el punto Xi. Por consiguiente la sumatoria de todos los productos, dada por la ecuación (21) es el único polinomio de n-ésimo orden que pasa exactamente por los n+1 puntos.
Ejemplo 3.4
Úsese un polinomio de interpolación de Lagrange de primer y segundo orden para evaluar ln 2 en base a los datos:
i | X | f(X) |
0 | 1.0 | 0.000 0000 |
1 | 4.0 | 1.386 2944 |
2 | 6.0 | 1.791 7595 |
El polinomio de primer orden es:
En resumen, para los casos en donde el orden del polinomio se desconozca, el método de Newton tiene ventajas debido a que profundiza en el comportamiento de las diferentes fórmulas de orden superior. Ademas la aproximación del error dada por la ecuación (20), en general puede integrarse fácilmente en los cálculos de Newton ya que la aproximación usa una diferencia dividida. De esta forma, desde el punto de vista de cálculo, a menudo, se prefiere el método de Newton.
Cuando se va a llevar a cabo sólo una interpolación, ambos métodos, el de Newton y el de Lagrange requieren de un esfuerzo de calculo similar. Sin embargo, la versión de Lagrange es un poco más fácil de programar. T ambien existen casos en donde la forma de Newton es mas susceptible a los errores de redondeo. Debido a esto y a que no se requiere calcular y almacenar diferencias divididas, la forma de Lagrange se usa, a menudo, cuando el orden del polinomio se conoce a priori.
////////////////////programa de interoplacion de Lagrange
#include <iostream>//Libreria de comandos de entrada y salida de datos
#include <stdlib>
void lee (float X[],int N)
{
int i;
for (i=0;i<N;i++)
{
cout<<"Da el Dato X"<<i<<endl;
cin>> X[i];
}
}
void lee2 (float Y[],int N)
{
int i;
for (i=0;i<N;i++)
{
cout<<"Da el Dato Y"<<i<<endl;
cin>> Y[i];
}
}
void imprime (float X[], float Y[], int N)
{
int i;
system ("cls");
cout<<"\nValores de X"<<endl;
for (i=0;i<N;i++)
{
cout<<X[i]<<" ";
}
cout<<"\n\n";
cout<<"\nValores de F(X)"<<endl;
for (int j=0;j<N;j++)
{
cout<<Y[j]<<" ";
}
}
void calculalag(float x[],float y[],int n,float xf)
{
float aux1[100], aux2[100],ix=0;
for (int k=0; k<n;k++)
{
aux1[k]=1;
aux2[k]=1;
}
for(int i=0;i<n; i++)
{
for (int j=0;j<n;j++)
{
if(j!=i)
{
aux1[i]= aux1[i]*(xf-x[j]);
aux2[i] = aux2[i]*(x[i]-x[j]);
}
}
ix=ix+(y[i]*(aux1[i]/aux2[i]));
}
cout<<"\nEl resultado de la interpolación es: "<<ix;
}
int main ()
{
float x[100], y[100],xf;
int n;
cout<<"Cuantos datos se van a ingresar"<<endl;
cin>>n;
cout<<"Datos de X"<<endl;
lee (x,n);
cout<<"Datos de Y"<<endl;
lee2 (y,n);
cout<<"Los datos son"<<endl;
imprime (x,y,n);
cout<<"\nIngrese El valos a interpolar"<<endl;
cin>>xf;
calculalag(x,y,n,xf);
cin.get ();
cin.get ();
return 0;
}
No hay comentarios:
Publicar un comentario