Documente Academic
Documente Profesional
Documente Cultură
Mtodos Numricos
Practica #15:
Polinomio aprximador
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
fprintf('Los resultados indican que el modelo de regresion lineal explico el %f %% de la incertidumbre original\n\n',r2*100);
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');
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
10
Resolviendo para b
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