practica 15 polinomio aproximador
TRANSCRIPT
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
Índice
Objetivo 2
Introducción2
Desarrollo 2
Códigos 3
Diagrama 4
Ejemplos 4
Características 5
Conclusión 5
Objetivo:
1
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
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
%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
#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
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
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
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
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);
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
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