practica 15 polinomio aproximador

15
Instituto Politécnico Nacional Escuela Superior de Ingeniería Mecánica y Eléctrica Unidad Zacatenco Métodos Numéricos Laboratorio de Métodos Numéricos Practica #15: Polinomio aprximador Escamilla Prado Abraham 2SV2

Upload: steve-hazuky

Post on 24-Oct-2014

120 views

Category:

Documents


3 download

TRANSCRIPT

Page 2: practica 15 polinomio aproximador

Índice

Objetivo 2

Introducción2

Desarrollo 2

Códigos 3

Diagrama 4

Ejemplos 4

Características 5

Conclusión 5

Objetivo:

1

Page 3: practica 15 polinomio aproximador

En esta practica tenemos como objetivo, comprender el uso del polinomio aproximador, que es una variación de el método de minimos cuadrados.

Introducción:

Supongamos que hemos medido un conjunto de pares de datos (xi, yi) en una experiencia, por ejemplo, la posición de un móvil en ciertos instantes de tiempo.

Queremos obtener una función y=f(x) que se ajuste lo mejor posible a los valores experimentales. Se pueden ensayar muchas funciones, rectas, polinomios, funciones potenciales o logarítmicas.

Una vez establecido la función a ajustar se determinan sus parámetros, en el caso de un polinomio, serán los coeficientes del polinomio de modo que los datos experimentales se desvíen lo menos posible de la fórmula empírica.

La función más sencilla es la función lineal y=ax+b. El procedimiento de ajustar los datos experimentales a una línea recta se denomina regresión lineal

Desarrollo:

CODIGO EN MATLAB:

2

Page 4: practica 15 polinomio aproximador

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 estimadosyx=0;%coeficiente de determinacion y coeficiente de correlacion r^2r=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;endA=[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;endsyx=(sr/(n -2))^0.5;r2=(st - sr)/st;r=sqrt(r2);Sy=(st/n-1)^0.5;clcfprintf('\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');endfprintf('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;yg = a(2,1)*x + a(1,1);plot(x,yg,'b');Ec=['Y = ',num2str(a(2,1)),' X + ( ',num2str(a(1,1)),' )'];

3

Page 5: practica 15 polinomio aproximador

%Algoritmo para los miminoms cuadrados polinomialesm=5; %grado del polinomio de ajusteApol=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']);endhold off;title('Minimos cuadrados lineales');

CODIGO EN C:

#include<iostream.h>

4

Page 6: practica 15 polinomio aproximador

#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

5

Page 7: practica 15 polinomio aproximador

lnx+=log(x[m]);lnxy=log(x[m])*y[m];xy1+=lnxy;xx1+=log(x[m])*log(x[m]);//exponenciallny+=log(y[m]);lnyx=log(y[m])*x[m];xy2+=lnyx;lnyy+=log(y[m])*log(y[m]);//potenciallnxxyy+=log(y[m])*log(x[m]);

}//calculando A,B,r2 en lineal,logaritmica,exponencial,potencialvector[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=yif((vector[2]==1)||

(((vector[2]>vector[5])&&(vector[2]>vector[8])&&(vector[2]>vector[11]))&&((vector[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

6

Page 8: practica 15 polinomio aproximador

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;}elseif(((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]>vector[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");elsedo{

do{

printf("\n\n\tDesea proyectar X o Y ");tecla=getch();

}while(tecla<120&&tecla>121);//120=x,121=yif(tecla==120)//CALCULANDO X ESTIMADA{

printf("\n\n\tDigite el valor de Y ");scanf("%lf",&p);if(a==1)//LINEALxestimado=((p-vector[1])/vector[0]);

elseif(a==2)//LOGARITMICAxestimado=exp(((p-vector[4])/vector[3]));

elseif(a==3)//EXPONENCIAL

7

Page 9: practica 15 polinomio aproximador

xestimado=((log(p)-log(vector[7]))/vector[6]);elseif(a==4)//POTENCIAL

xestimado=exp((log(p)-log(vector[10]))/vector[9]);printf("\n\n\tX ESTIMADO= %lf ",xestimado);

}elseif(tecla==121)//CALCULANDO Y ESTIMADA{

printf("\n\n\tDigite el valor de X ");scanf("%lf",&r);if(a==1)//LINEALyestimado=vector[1]+vector[0]*r;

elseif(a==2)//LOGARITMICA

yestimado=vector[4]+vector[3]*log(r);elseif(a==3)//EXPONENCIAL

yestimado=vector[7]*exp(vector[6]*r);elseif(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=115system("PAUSE");

}

8

Page 10: practica 15 polinomio aproximador

Ejemplo

9

INICIO

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=[];

for i=1: 1: n

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

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

if(syx < Sy)

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

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);

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('Como Sxy < Sy el modelo de regresion lineal es adecuado.\n\n');

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

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

Page 11: practica 15 polinomio aproximador

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 solución:

• Resolviendo para “a”

• Resolviendo para “b”

10

Page 12: practica 15 polinomio aproximador

Finalmente, la ecuación de regresión queda así:

Características

La característica de este método, radica en que podemos conocer una aproximación a la solución, 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 aproximación mayor

Conclusiones

Este método, es fácil de aplicar y entrega resultados muy aproximado a la realidad, se puede construir un polinomio de cualquier grado, aunque entre mas muestras, será mas difícil armar el polinomio.

11