Sei sulla pagina 1di 8

[1]

Laboratorio de programacin avanzada y mtodos numricos. Prctica nmero 7 Interpolacin numrica

Profesor: Ing. Lpez Garca Jorge Luis Grupo: 13 Equipo: E-5 Integrantes: Coquis Romero Christopher Escobedo Solares Ricardo David Guzmn Rojas Ricardo Tonatiuh Romero Romero No Martn

Fecha de realizacin: 10 octubre 2013

[2]

PRCTICA 7: INTERPOLACIN NUMRICA


Objetivo general: El alumno conocer, aplicar y comparar algunos mtodos de interpolacin numrica de funciones. Actividad: A partir del cdigo proporcionado lagrange_base.c realizar las siguientes actividades y entregar en un solo cdigo: 1. Modificar el cdigo para que lea del usuario el dato X que desea aproximar. 2. Disear una funcin para cargar desde un archivo de texto con formato la tabla de datos con los valores de x, un espacio y a continuacin la columna con los valores de f(x). 3. Disear una funcin que devuelva el nmero de renglones de la tabla del archivo de texto. 4. Sabiendo el nmero de renglones recibir los datos en arreglos de memoria dinmica. 5. Ejecutar el programa con las modificaciones anteriores para cargar desde un archivo de texto los valores para la siguiente tabla y comprobar el resultado a mano para X=3.

6. Ejecutar el programa para cargar desde un archivo de texto los valores para la siguiente tabla y comprobar el resultado a mano para X=2.

NOTA: la solucin en el ejemplo del pdf de la prctica de la red para el polinomio de tercer orden es incorrecta, para X=0.2 resulta f2(x)=2.6399987. Detalles de entrega por equipo: impreso con un solo cdigo fuente completo con todas las opciones, cada lnea comentada de las agregadas por el alumno y capturas de pantalla de ejecucin para la tabla original del ejemplo (para x=0.2) y para las otras dos tablas con los datos solicitados en la portada.

[3] #include <stdio.h> //libreria #include <stdlib.h> //libreria int cuenta_renglones(FILE *archi); //declaracion de funciones void cargar_archivo(FILE *archi, double *x, double *fx); //declaracion de funciones int main (int argc, char *argv[]) //funcion principal { int i=0; //delcaracion de variable // double x[4]={0.1, 0.4, 0.7, 1}; // double fx[4]={2.31, 3.36, 4.59, 6}; double x0=0,x1=0,x2=0,x3=0,f1=0,f2=0,f3=0; //delcaracion de variable double X; //delcaracion de variable printf("\tDame el valor de X que quieres interpolar\n"); //pide al usuario el valor a interpolar scanf("%lf",&X); //lo guarda en una variable FILE *archivo=NULL; //apuntador a un archivo double *x=NULL; //delcaracion de variable apuntadora double *fx=NULL; //delcaracion de variable apuntadora int renglones=0; //delcaracion de variable renglones=cuenta_renglones(archivo); //asignacion de valor a una funcion printf("%d", renglones); //imprime un mensaje en la pantalla x=(double *)calloc(renglones,sizeof(double)); //asignacion de memoria denamica fx=(double *)calloc(renglones,sizeof(double)); //asignacion de memoria denamica cargar_archivo(archivo, x, fx); //lamado a una funcion printf("Metodo de Lagrange para interpolacion numerica \n\n"); //imprime en la pantalla printf("\nLa tabla de datos es: \n\n"); //imprime en la pantalla printf("\n%10s %10s\n\n","x","f(x)"); //imprime en la pantalla for(i=0;i<4;i++) //ciclo for { printf("%10f %10f\n",x[i],fx[i]); //imprime en la pantalla } printf("\nLa formula del polinomio de 1er orden es: \n\n"); //imprime en la pantalla printf("\nf1(X)= (X-x1)/(x0-x1)*f(x0) + (X-x0)/(x1-x0)*f(x1)\n\n"); //imprime en la pantalla x0= x[0]; //asignacion de valor x1= x[1]; //asignacion de valor f1 = (X-x1)/(x0-x1)*fx[0] + (X-x0)/(x1-x0)*fx[1]; printf("\nValores usados: X= %f \t x0= %f \t x1= %f\n\n",X,x0,x1); //imprime en la pantalla printf("f1= %f\n\n",f1); //imprime en la pantalla

printf("\nLa formula del polinomio de 2do orden es: \n\n"); //imprime en la pantalla

[4] printf("\nf2(X)= (((X-x1)*(X-x2))/((x0-x1)*(x0-x2)))*f(x0) + (((X-x0)*(X-x2))/((x1-x0)*(x1x2)))*f(x1) + (((X-x0)*(X-x1))/((x2-x0)*(x2-x1)))*f(x2)\n\n"); //imprime en la pantalla x0= x[0]; //asignacion de valor x1= x[1]; //asignacion de valor x2= x[2]; //asignacion de valor f2 = (((X-x1)*(X-x2))/((x0-x1)*(x0-x2)))*fx[0] + (((X-x0)*(X-x2))/((x1-x0)*(x1-x2)))*fx[1] + (((X-x0)*(X-x1))/((x2-x0)*(x2-x1)))*fx[2]; printf("\nValores usados: X= %f \t x0= %f \t x1= %f \t x2= %f\n\n",X,x0,x1,x2); //imprime en la pantalla printf("f2= %f\n\n",f2); //imprime en la pantalla

printf("\nLa formula del polinomio de 3er orden es: \n\n"); //imprime en la pantalla printf("\nf3(X)= (((X-x1)*(X-x2)*(X-x3))/((x0-x1)*(x0-x2)*(x0-x3)))*f(x0) + (((X-x0)*(Xx2)*(X-x3))/((x1-x0)*(x1-x2)*(x1-x3)))*f(x1) + (((X-x0)*(X-x1)*(X-x3))/((x2-x0)*(x2-x1)*(x2x3)))*f(x2) + (((X-x0)*(X-x1)*(X-x2))/((x3-x0)*(x3-x1)*(x3-x2)))*f(x3) \n\n"); //imprime en la pantalla x0= x[0]; //asignacion de valor x1= x[1]; //asignacion de valor x2= x[2]; //asignacion de valor x3= x[3]; //asignacion de valor f3 = (((X-x1)*(X-x2)*(X-x3))/((x0-x1)*(x0-x2)*(x0-x3)))*fx[0] + (((X-x0)*(X-x2)*(X-x3))/((x1x0)*(x1-x2)*(x1-x3)))*fx[1] + (((X-x0)*(X-x1)*(X-x3))/((x2-x0)*(x2-x1)*(x2-x3)))*fx[2] + (((Xx0)*(X-x1)*(X-x2))/((x3-x0)*(x3-x1)*(x3-x2)))*fx[3]; printf("\nValores usados: X= %f x0= %f x1= %f x2= %f x3= %f\n\n",X,x0,x1,x2,x3); //imprime en la pantalla printf("f3= %f\n\n",f3); //imprime en la pantalla

getchar(); //congela la pantalla getchar(); //congela la pantalla return 0; //regresa un valor } int cuenta_renglones(FILE *archi) //funcion { char c='\0'; //delcaracion de variable int reng=0; //delcaracion de variable if(!(archi=fopen("tabla.txt","r"))) //validacion de archivo { printf("Error"); //imprime en la pantalla getchar(); //congela la pantalla exit(0); //Sale del prgrama } else { while(feof(archi)==0){ c=fgetc(archi); //asignacion de valor if (c=='\n')

[5] reng++; //variable contadora } } return reng+1; //regresa el numero de renglones mas uno } void cargar_archivo(FILE *archi, double *x, double *fx) //funcion { int cont=0; //delcaracion de variable if(!(archi=fopen("tabla.txt","r"))) //validacion de archivo { printf("ERROR"); //imprime en la pantalla getchar(); //congela la pantalla exit(0); //Sale del programa } else { while(feof(archi)==0) Validacion de fin de archivo { fscanf(archi, "%lf %lf", &x[cont], &fx[cont]); //guarda los valores del archivo cont++; //variable contadora } } }

[6]

[7]

[8]

Potrebbero piacerti anche