martes, 25 de abril de 2017

Interpolación de Newton hacia adelante, en C

La interpolación es el proceso de encontrar los valores de $y$, correspondientes a cualquier valor de $x$ entre $x_0$ y $x_n$ de acuerdo a los valores dados por $y=f(x)$ para un conjunto de valores de $x$. De las muchas técnicas de interpolación existentes, los métodos de Newton 'hacia atrás' y 'hacia adelante' son de los más utilizados.
En esta ocasión veremos un programa en lenguaje C para calcular la interpolación de Newton hacia adelante.
Ambos métodos de Newton se basan el cálculo de diferencias finitas. Estas fórmulas se emplean comúnmente en ingeniería y otras ramas de las ciencias. Antes de realizar el programa, analicemos la fórmula de la interpolación y creemos las variables a usar en el programa en C.
La fórmula de Newton hacia adelante, contiene $y_0$ y las diferencias hacia adelante de $y_0$. Esta fórmula se usa para interpolar los valores de $y$ cerca del inicio del conjunto de valores de la tabla de valores dados y los valores de extrapolación de $y$ próximos a la izquierda de $y_0$. La fórmula es:

Comparado con la fórmula hacia adelante, la interpolación hacia atrás usa una fórmula que contiene a $y_n$ y las diferencias hacia atrás de $y_n$. Esta fórmula se usa para interpolar los valores de $y$ cerca del final de los valores de la tabla y para la extrapolación de los valores de $y$ próximos hacia adelante (hacia la derecha) de $y_n$.

Variables a usar:
  • MAXN – valor mínimo de $N$.
  • ORDER – el orden máximo en la tabla de diferencias.
  • $ax$ – arreglo que contiene los valores de $x$.
  • $ay$ – arreglo que contiene los valores de $y$.
  • $diff$ – arreglo de 2 dimensiones, 2D, que contiene la tabla de diferencias.
  • $h$ – espacio entre los valores de $x$.
  • $x$ – valor de $x$, para el cual se calculará el valor de $y$.
  • $y_p$ – valor calculado de $y$.
  • $nr$ – numerador de los términos en la expansión de $y_p$.
  • $dr$ – denominador de los términos en la expansión de $y_p$.

/* Interpolación de Newton hacia adelente, en C */
/* Por: Carlos Montoya */
/* Para YoAmoLasMatematicas */

#include <stdio.h>
#define MAXN 100
#define ORDEN 4

main()
{
float ax[MAXN+1], ay[MAXN+1], diff[MAXN+1][ORDEN+1]nr=1.0dr=1.0,x,p,h,yp;
int n,i,j,k;
printf("\n Introduce el valor de n:\n");
scanf("%d",&n);

printf("\n Introduce los valores en la forma x,y:\n");
for (i=0;i<=n;i++)
scanf("%f %f",&ax[i],&ay[i]);
printf("\n Introduce el valor de x para el cual se quiere calcular y: \n");
scanf("%f",&x);
h=ax[1]-ax[0];

//realizando la tabla de diferencias
//calculando las diferencias de primer ORDEN
for (i=0;i<=n-1;i++)
diff[i][1] = ay[i+1]-ay[i];

//se calculan las diferencias de ORDEN superior
for (j=2;j<=ORDEN;j++)
for(i=0;i<=n-j;i++)
diff[i][j] = diff[i+1][j-1] - diff[i][j-1];

//encontrando x0
i=0;
while (!(ax[i]>x))
i++;

//ahora ax[ies x0 y ay[ies y0
i--;
= (x-ax[i])/h;
yp = ay[i];

//ahora se lleva a cabo la interpolación
for (k=1;k<=ORDEN;k++)
{
nr *=p-k+1;
dr *=k;
yp +=(nr/dr)*diff[i][k];
}
printf("\n Cuando x = %6.1f, entonces y = %6.2f\n",x,yp);
}