Está en la página 1de 12

Instituto Politcnico Nacional

Escuela Superior de Ingeniera Mecnica y Elctrica Unidad Zacatenco

Mtodos Numricos

Laboratorio de Mtodos Numricos

Practica #15:
Polinomio aprximador

Escamilla Prado Abraham

2SV2

ndice

Objetivo

Introduccin

Desarrollo

Cdigos

Diagrama

Ejemplos

Caractersticas

Conclusin

Objetivo: En esta practica tenemos como objetivo, comprender el uso del polinomio aproximador, que es una variacin de el mtodo de minimos cuadrados. Introduccin: Supongamos que hemos medido un conjunto de pares de datos (xi, yi) en una experiencia, por ejemplo, la posicin de un mvil en ciertos instantes de tiempo. Queremos obtener una funcin y=f(x) que se ajuste lo mejor posible a los valores experimentales. Se pueden ensayar muchas funciones, rectas, polinomios, funciones potenciales o logartmicas. Una vez establecido la funcin a ajustar se determinan sus parmetros, en el caso de un polinomio, sern los coeficientes del polinomio de modo que los datos experimentales se desven lo menos posible de la frmula emprica. La funcin ms sencilla es la funcin lineal y=ax+b. El procedimiento de ajustar los datos experimentales a una lnea recta se denomina regresin lineal Desarrollo:

CODIGO EN MATLAB:

x=[1 2 3 4 5 6 7]; y=[0.5 2.5 2.0 4.0 3.5 6.0 5.5]; n=length(x); %coeficientes %Error estandar del estimado syx=0; %coeficiente de determinacion y coeficiente de correlacion r^2 r=0; r2=0; sumx=0; sumxy=0; st=0; sumy=0; sumx2=0; sr=0; ygp=[]; for i=1: 1: n sumx=sumx+x(i); sumy=sumy+y(i); sumxy=sumxy+x(i)*y(i); sumx2=sumx2+x(i)^2; end A=[n sumx;sumx sumx2]; B=[sumy;sumxy]; a=inv(A)*B; ym=sumy/n; for i=1: 1: n st=st + (y(i) - ym)^2; sr=sr + (y(i) - a(1,1) - a(2,1)*x(i))^2; end syx=(sr/(n -2))^0.5; r2=(st - sr)/st; r=sqrt(r2); Sy=(st/n-1)^0.5; clc fprintf('\nLa ecuacion queda: Y = %f X + ( %f )\n\n',a(1,1),a(2,1)); fprintf('a0 = %f\ta1 = %f\tSyx = %f\tSr = %f\tSt = %f\tSy = %f\n\n',a(1,1),a(2,1),syx,sr,st,Sy); if(syx < Sy) fprintf('Como Sxy < Sy el modelo de regresion lineal es adecuado.\n\n'); else fprintf('Como Sxy > Sy el modelo de regresion lineal no es adecuado.\n\n'); end fprintf('Los resultados indican que el modelo de regresion lineal explico el %f %% de la incertidumbre original\n\n',r2*100); plot(x,y,'r*'); hold on; 3

yg = a(2,1)*x + a(1,1); plot(x,yg,'b'); Ec=['Y = ',num2str(a(2,1)),' X + ( ',num2str(a(1,1)),' )']; %Algoritmo para los miminoms cuadrados polinomiales m=5; %grado del polinomio de ajuste Apol=zeros(m+1); Bpol=zeros(m+1,1); if(n<(m+1)) fprintf('La regresion polinomial no es posible, debido a que el orden es mayor que el numero de puntos\n\n') legend('Datos','Lineal'); else for i=1:1:m+1 for j=1:1:i k=i + j - 2; sum=0; for l=1:1:n sum=sum+x(l)^k; end Apol(i,j) = sum; Apol(j,i) = sum; end sum=0; for l=1:1:n sum=sum + y(l)*x(l)^(i-1); end Bpol(i,1)=sum; end apol=inv(Apol)*Bpol; xgg=x(1):0.1:x(n); for i=1:1:length(xgg) ygp(i)=0; end for j=1:1:length(xgg) for i=m+1:-1:1 ygp(j)=ygp(j)+ apol(i,1)*xgg(j)^(i-1); end end plot(xgg,ygp,'r'); legend('Datos','Lineal','Polinomial'); Ec='Y( X ) = '; for i=m+1:-1:1 Ec=[Ec,'(',num2str(apol(i,1)),') X^',num2str((i-1)),' + ']; end fprintf('\nEl polinomio calculado queda:\n\n'); Ec=[Ec,' 0 ']; fprintf([Ec,'\n\n']); end hold off; title('Minimos cuadrados lineales'); 4

CODIGO EN C:
#include<iostream.h> #include<stdio.h> #include<math.h> #include<stdlib.h> #include<conio.h> void leervector(int *n,double x[],double y[]); void proceso( int n,double x[],double y[],double vector[]); void tabla(double vector[]); void extrapolar(int n,double x[],double y[],double vector[]); void main() { int n; double x[200],y[200],vector[11]; leervector(&n,x,y); proceso(n,x,y,vector); } void leervector( int *n,double x[],double y[]) { do { cout<<"\n\n\t""Digite la cantidad de las parejas cin>>*n; } while(*n<5); int a=0,m=0; for(m=0;m<=(*n-1);m++) { cout<<"\n\n\t""DIGITE X["<<m+1<<"] "; cin>>x[m]; cout<<"\n\t""DIGITE Y["<<m+1<<"] "; cin>>y[m]; } }

";

void proceso( int n,double x[],double y[],double vector[]) { system("CLS"); int m=0; double sumx=0,sumy=0,x2=0,y2=0,xy=0,lnx=0,lnxy=0; double lny=0,lnyx=0,lnyy=0,xy1=0,xx1=0,xy2=0,lnxxyy=0; for(m=0;m<=(n-1);m++) {//lineal sumx+=x[m];

sumy+=y[m]; xy+=x[m]*y[m]; x2+=pow(x[m],2); y2+=pow(y[m],2);//logaritmica lnx+=log(x[m]); lnxy=log(x[m])*y[m]; xy1+=lnxy; xx1+=log(x[m])*log(x[m]);//exponencial lny+=log(y[m]); lnyx=log(y[m])*x[m]; xy2+=lnyx; lnyy+=log(y[m])*log(y[m]);//potencial lnxxyy+=log(y[m])*log(x[m]); }//calculando A,B,r2 en lineal,logaritmica,exponencial,potencial vector[0]=((n*xy-sumx*sumy)/(n*x2-pow(sumx,2))); vector[1]=((sumy-vector[0]*sumx)/n); vector[2]=pow(((n*xy-sumx*sumy)/(sqrt((n*x2-pow(sumx,2))*(n*y2-pow(sumy,2))))),2); vector[3]=(((n*xy1)-(lnx*sumy))/((n*xx1)-pow(lnx,2))); vector[4]=((sumy-vector[3]*lnx)/n); vector[5]=pow(((n*xy1-lnx*sumy)/(sqrt((n*xx1-pow(lnx,2))*(n*y2-pow(sumy,2))))),2); vector[6]=(((n*xy2)-(sumx*lny))/((n*x2)-pow(sumx,2))); vector[7]=exp(((lny-vector[6]*sumx)/n)); vector[8]=pow(((n*xy2-sumx*lny)/(sqrt((n*x2-pow(sumx,2))*(n*lnyy-pow(lny,2))))),2); vector[9]=(((n*lnxxyy)-(lnx*lny))/((n*xx1)-pow(lnx,2))); vector[10]=exp(((lny-vector[9]*lnx)/n)); vector[11]=pow(((n*lnxxyy-lnx*lny)/(sqrt((n*xx1-pow(lnx,2))*(n*lnyy-pow(lny,2))))),2); tabla(vector); extrapolar(n,x,y,vector); } void tabla(double vector[]) { printf("\n\t CASO\t\t B\t\t A\t\t r2\t\t\n\n\t LINEAL \t%lf\t%lf\t%lf",vector[0],vector[1],vector[2]); printf("\n\t LOGARITMICO \t%lf\t%lf\t%lf\n\t EXPONENCIAL \t%lf\t%lf\t%lf",vector[3],vector[4],vector[5],vector[6],vector[7],vector[8]); printf("\n\t POTENCIAL \t%lf\t%lf\t%lf\n\n\n\t\t\t",vector[9],vector[10],vector[11]); system("PAUSE"); } void extrapolar(int n,double x[],double y[],double vector[]) { int tecla=0,a=0; double p=0,r=0,yestimado=0,xestimado=0;//donde p=x y r=y if((vector[2]==1)||(((vector[2]>vector[5])&&(vector[2]>vector[8])&&(vector[2]>vector[11]))&&((v ector[2]>=0.95)&&(vector[2]<=1)))) { printf("\n\n\t\t===>La mejor es la ===>LINEAL= %lf<===\n\t\t\t ===>A=%lf<===\n\t\t\t ===>B=%lf<===\n\n\t\t ",vector[2],vector[1],vector[0]); a=1; }

else if(((vector[5]==1)&&(vector[2]!=0))||(((vector[5]>vector[8])&&(vector[5]>vector[11])&&(vector[5] >vector[2]))&&((vector[5]>=0.95)&&(vector[5]<=1)))) { printf("\n\n\t\t===>La mejor es la ===>LOGARITMICA= %lf<===\n\t\t\t\t ===>A=%lf<===\n\t\t\t\t ===>B=%lf<===\n\n\t\t ",vector[5],vector[4],vector[3]); a=2; } else if(((vector[8]==1)&&(vector[5]!=0))||(((vector[8]>vector[11])&&(vector[8]>vector[2])&&(vector[8] >vector[5]))&&((vector[8]>=0.95)&&(vector[8]<=1)))) { printf("\n\n\t\t===>La mejor es la ===>EXPONENCIAL= %lf<===\n\t\t\t\t ===>A=%lf<===\n\t\t\t\t ===>B=%lf<===\n\n\t\t ",vector[8],vector[7],vector[6]); a=3;} Else if(((vector[11]==0)&&(vector[8]!=0))||(((vector[11]>vector[8])&&(vector[11]>vector[2])&&(vector[11]>vec tor[5]))&&((vector[11]>=0.95)&&(vector[11]<=1)))) { printf("\n\n\t\t===>La mejor es la ===>POTENCIAL= %lf<===\n\t\t\t\t ===>A=%lf<===\n\t\t\t\t ===>B=%lf<===\n\n\t\t ",vector[11],vector[10],vector[9]); a=4; } if(a==0) printf("\n\n\t\t\t===>NO SE APLICA NINGUN METODO<===\n\n\t\t\tNo se puede extrapolar X y Y\n\n\t\t\t"); else do { do { printf("\n\n\tDesea proyectar X o Y "); tecla=getch(); } while(tecla<120&&tecla>121);//120=x,121=y if(tecla==120)//CALCULANDO X ESTIMADA { printf("\n\n\tDigite el valor de Y "); scanf("%lf",&p); if(a==1)//LINEAL xestimado=((p-vector[1])/vector[0]); else if(a==2)//LOGARITMICA xestimado=exp(((p-vector[4])/vector[3])); else if(a==3)//EXPONENCIAL xestimado=((log(p)-log(vector[7]))/vector[6]); else

if(a==4)//POTENCIAL xestimado=exp((log(p)-log(vector[10]))/vector[9]); printf("\n\n\tX ESTIMADO= %lf ",xestimado); } else if(tecla==121)//CALCULANDO Y ESTIMADA { printf("\n\n\tDigite el valor de X "); scanf("%lf",&r); if(a==1)//LINEAL yestimado=vector[1]+vector[0]*r; else if(a==2)//LOGARITMICA yestimado=vector[4]+vector[3]*log(r); else if(a==3)//EXPONENCIAL yestimado=vector[7]*exp(vector[6]*r); else if(a==4)//POTENCIAL yestimado=vector[10]*pow(r,vector[9]); printf("\n\n\tY ESTIMADO= %lf ",yestimado); } printf("\n\n\n\t\t\tDeseea seguir proyectando S/N\n\n\t\t"); tecla=getch(); } while(tecla!=110);//donde 110=N,S=115 system("PAUSE"); }

x=[1 2 3 4 5 6 7]; y=[0.5 2.5 2.0 4.0 3.5 6.0 5.5]; n=length(x); syx=0;r=0;r2=0; sumx=0;sumxy=0; st=0;sumy=0; sumx2=0;sr=0; ygp=[];

INICIO

for i=1: 1: n

sumx=sumx+x(i); sumy=sumy+y(i); sumxy=sumxy+x(i)*y(i); sumx2=sumx2+x(i)^2;

fprintf('Los resultados indican que el modelo de regresion lineal explico el %f %% de la incertidumbre original\n\n',r2*100);

A=[n sumx;sumx sumx2]; B=[sumy;sumxy]; a=inv(A)*B; ym=sumy/n;

for i=1: 1: n

fprintf('Como Sxy > Sy el modelo de regresion lineal no es adecuado.\n\n'); fprintf('Como Sxy < Sy el modelo de regresion lineal es adecuado.\n\n');

st=st + (y(i) - ym)^2; sr=sr + (y(i) - a(1,1) a(2,1)*x(i))^2;

if(syx < Sy)

syx=(sr/(n -2))^0.5; r2=(st - sr)/st; r=sqrt(r2); Sy=(st/n-1)^0.5; clc

fprintf('\nLa ecuacion queda: Y = %f X + ( %f )\n\n',a(1,1),a(2,1)); fprintf('a0 = %f\ta1 = %f\tSyx = %f\tSr = %f\tSt = %f\tSy = %f\n\n',a(1,1),a(2,1),syx,sr,s t,Sy);

Ejemplo 1.- Se

quiere determinar la constante K (N/m) de un resorte, a partir de la ley de Hooke

Llenando la tabla con los datos requeridos:

Resolviendo las ecuaciones de solucin: Resolviendo para a

10

Resolviendo para b

Finalmente, la ecuacin de regresin queda as:

Caractersticas La caracterstica de este mtodo, radica en que podemos conocer una aproximacin a la solucin, independientemente de las muestras que tengamos, y a su vez, si llegamos a obtener una muestra falsa, no afectara mucho al resultado, ya que el polinomio provee una aproximacin mayor

Conclusiones Este mtodo, es fcil de aplicar y entrega resultados muy aproximado a la realidad, se puede construir un polinomio de cualquier grado, aunque entre mas muestras, ser mas difcil armar el polinomio.

11

También podría gustarte