CAPITULO 4:INTERPOLACIÓN
INTRODUCCIÓN
Con frecuencia se tienen que estimar valores intermedios entre valores
conocidos. El método mas común empleado para este propósito es la interpolación polinomial.
Recuerdese que la fórmula general de un polinomio de n-ésimo orden es:
(1) |
Para n + 1 puntos, existe uno y sólo un polinomio de n-ésimo orden o menor que pasa a través de todos los puntos. Por ejemplo, hay sólo una línea recta (es decir un
polinomio de primer orden) que conecta dos puntos. El polinomio de interpolación consiste en determinar el único polinomio de n-ésimo orden que se ajusta a los n + 1 puntos dados.
Este polinomio proporciona una fórmula para calcular los valores intermedios.
Aunque existe uno y sólo un polinomio de
n-ésimo orden que se ajusta a los n + 1
puntos, existen una gran variedad de fórmulas matemáticas mediante las
cuales se puede expresar este polinomio. En esta unidad se estudian dos
técnicas alternativas que están bien condicionadas para implementarse en
una computadora. Estos son los polinomios de Newton y de Lagrange.
POLINOMIOS DE INTERPOLACIÓN
CON
DIFERENCIAS DIVIDIDAS DE NEWTON
INTERPOLACIÓN LINEAL
La fórmula más simple de interpolación es la de conectar dos puntos con una linea recta. Este método, llamado Interpolación Lineal, se muestra en la figura 1.
Fig. 1
Usando triángulos semejantes, se tiene:
(2) |
Que se puede reordenar como:
(3) |
La cuál es la fórmula de interpolación lineal.
La notación f1(X) indica que se trata de
un polinomio de interpolación de primer orden. Nótese que además de
representar la pendiente de la línea que conecta los dos puntos, el término
[ f(X1) - f(X2) ] /
(X1 - X2) es una aproximación de
diferencias divididas finitas a la primera derivada. En general, entre mas
pequeño sea
el intervalo entre los puntos, más exacta será la aproximación.
EJEMPLO 3.1
Calcúlese el logaritmo natural de 2 (ln 2) usando interpolación
lineal.
Primero, llévese a cabo los cálculos interpolando entre
ln 1 = 0 y ln 6 = 1.7917595.
Después repítase el procedimiento, pero usando un intervalo más
pequeño desde ln 1 a
ln 4 = 1.3862944.
Nótese que el valor real de ln 2 = 0. 69314718
SOLUCIÓN:
Evaluando la fórmula de interpolación lineal (3) de
X = 1 a X = 6 da:
La cual representa un error porcentual de
e% = 48.3 %.
Usando el intervalo más pequeño desde X = 1
a X = 4 da:
Por lo contrario, usando el intervalo más pequeño reduce el error relativo
porcentual a e% = 33.3%.
////////EL SIGUIENTE PROGRAMA ES DE INTERPOLACION DE NEWTON
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <conio.h>
class InterPolNew
{
private:
double **D;
double *X;
double *Fx;
double p;
int n;
public:
InterPolNew ( );
~InterPolNew ( );
void Leer ( );
void Imprimir ( );
void Tama ( );
void Metodo ( );
};
InterPolNew :: InterPolNew ( )
{
Tama ( );
D = new double *[ n -1 ];
for ( int i = 0; i < n - 1 ; i ++ )
D [ i ] = new double [ n-1 ];
for ( int i = 0; i < n-1 ; i ++)
for ( int j = 0; j< n-1 ; j++)
D[i][j]= 0;
X = new double [ n ];
Fx = new double [ n ];
for ( int i = 0; i < n; i ++)
{
X [i]= 0;
Fx [i]= 0;
}
}
InterPolNew :: ~InterPolNew ( )
{
for ( int i = 0; i < n-1; i ++)
delete D [ i ];
delete [] D;
delete [] X;
delete [] Fx;
}
void InterPolNew :: Tama ( )
{
cout <<"METODO DE INTERPOLACION DE NEWTON "<< endl << endl;
cout <<"Ingresa el numero de puntos : ";
cin >> n;
cout << endl;
}
void InterPolNew :: Leer ( )
{
cout <<"Ingresa los valores de los puntos tabulados: "<< endl << endl;
for ( int i= 0; i < n; i ++)
{
cout <<" X"<< i <<" : ";
cin >> X [ i ];
}
cout << endl;
for ( int i= 0; i < n; i ++)
{
cout <<" F( X"<< i <<" ) : ";
cin >> Fx [ i ];
}
cout <<"\n\n Ingresa el punto a evaluar : ";
cin >> p;
cout << endl;
}
void InterPolNew ::Imprimir ( )
{
cout.precision ( 3 );
cout << "********************************************* "<< endl << endl;
cout << " [ X ] [ F(X) ]" << endl;
for ( int c = 0; c < n ; c++ )
{
printf( "%6.4lf", X[ c ] );
printf( " %6.4lf", Fx[ c ] );
cout << endl;
}
cout << endl << endl;
cout << "********************************************* "<< endl << endl;
}
void InterPolNew :: Metodo ( )
{
for ( int i = 0; i < n -1 ; i++ )
{
if ( i == 0 )
{
for ( int j = 0; j < n-(i+1) ; j++ )
{
D [ j ][ i ] = ( Fx[ j+1 ] - Fx[ j ] )/( X[ j+1 ] - X[ j ] );
}
}
else
{
for ( int p = 0; p < n-(i+1) ; p++ )
{
D [ p ][ i ] =( D [ p+1 ][ i-1 ] - ( D [ p ][ i-1 ] ) ) /( X[ p+(i+1) ] - X[ p] );
}
}
}
for ( int i = 0; i < n-1; i ++)
{
for ( int j = 0; j< n-1; j++)
{
printf("%6.4lf ", D[i][j] );
}
cout << endl<< endl;
}
double S = Fx[0];
for ( int i = 1; i < n ; i++ )
{
double P = 1;
for ( int j = 0; j < i ; j++ )
{
if( i!= j)
P = P * ( p - X[j] );
cout<<" ( "<< p <<" - "<< X[j]<<" )";
}
cout << D[0][i-1]<<endl;
getch();
cout<<endl;
S = S + ( D[ 0 ][ i-1 ] )*P;
}//fin del for()
cout << "La solucion es : " << S << endl << endl;
}//fin de Metodo()
int main ( )
{
clrscr();
InterPolNew A;
A.Leer ();
A.Imprimir();
A.Metodo();
getch();
return 0;
}//fin de main()
#include <math.h>
#include <stdio.h>
#include <conio.h>
class InterPolNew
{
private:
double **D;
double *X;
double *Fx;
double p;
int n;
public:
InterPolNew ( );
~InterPolNew ( );
void Leer ( );
void Imprimir ( );
void Tama ( );
void Metodo ( );
};
InterPolNew :: InterPolNew ( )
{
Tama ( );
D = new double *[ n -1 ];
for ( int i = 0; i < n - 1 ; i ++ )
D [ i ] = new double [ n-1 ];
for ( int i = 0; i < n-1 ; i ++)
for ( int j = 0; j< n-1 ; j++)
D[i][j]= 0;
X = new double [ n ];
Fx = new double [ n ];
for ( int i = 0; i < n; i ++)
{
X [i]= 0;
Fx [i]= 0;
}
}
InterPolNew :: ~InterPolNew ( )
{
for ( int i = 0; i < n-1; i ++)
delete D [ i ];
delete [] D;
delete [] X;
delete [] Fx;
}
void InterPolNew :: Tama ( )
{
cout <<"METODO DE INTERPOLACION DE NEWTON "<< endl << endl;
cout <<"Ingresa el numero de puntos : ";
cin >> n;
cout << endl;
}
void InterPolNew :: Leer ( )
{
cout <<"Ingresa los valores de los puntos tabulados: "<< endl << endl;
for ( int i= 0; i < n; i ++)
{
cout <<" X"<< i <<" : ";
cin >> X [ i ];
}
cout << endl;
for ( int i= 0; i < n; i ++)
{
cout <<" F( X"<< i <<" ) : ";
cin >> Fx [ i ];
}
cout <<"\n\n Ingresa el punto a evaluar : ";
cin >> p;
cout << endl;
}
void InterPolNew ::Imprimir ( )
{
cout.precision ( 3 );
cout << "********************************************* "<< endl << endl;
cout << " [ X ] [ F(X) ]" << endl;
for ( int c = 0; c < n ; c++ )
{
printf( "%6.4lf", X[ c ] );
printf( " %6.4lf", Fx[ c ] );
cout << endl;
}
cout << endl << endl;
cout << "********************************************* "<< endl << endl;
}
void InterPolNew :: Metodo ( )
{
for ( int i = 0; i < n -1 ; i++ )
{
if ( i == 0 )
{
for ( int j = 0; j < n-(i+1) ; j++ )
{
D [ j ][ i ] = ( Fx[ j+1 ] - Fx[ j ] )/( X[ j+1 ] - X[ j ] );
}
}
else
{
for ( int p = 0; p < n-(i+1) ; p++ )
{
D [ p ][ i ] =( D [ p+1 ][ i-1 ] - ( D [ p ][ i-1 ] ) ) /( X[ p+(i+1) ] - X[ p] );
}
}
}
for ( int i = 0; i < n-1; i ++)
{
for ( int j = 0; j< n-1; j++)
{
printf("%6.4lf ", D[i][j] );
}
cout << endl<< endl;
}
double S = Fx[0];
for ( int i = 1; i < n ; i++ )
{
double P = 1;
for ( int j = 0; j < i ; j++ )
{
if( i!= j)
P = P * ( p - X[j] );
cout<<" ( "<< p <<" - "<< X[j]<<" )";
}
cout << D[0][i-1]<<endl;
getch();
cout<<endl;
S = S + ( D[ 0 ][ i-1 ] )*P;
}//fin del for()
cout << "La solucion es : " << S << endl << endl;
}//fin de Metodo()
int main ( )
{
clrscr();
InterPolNew A;
A.Leer ();
A.Imprimir();
A.Metodo();
getch();
return 0;
}//fin de main()
No hay comentarios:
Publicar un comentario