sábado, 24 de noviembre de 2012

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:
Polinomio de Orden N

(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.
Gráfica 1

Fig. 1
Usando triángulos semejantes, se tiene:
Triángulos Semejantes

(2)
Que se puede reordenar como:
Fórmula de Interpolación Lineal

(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:
primer resultado
La cual representa un error porcentual de e% = 48.3 %. Usando el intervalo más pequeño desde X = 1 a X = 4 da:
segundo resultado
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()
 



No hay comentarios:

Publicar un comentario