Você está na página 1de 6

Algoritmo en MATLAB para la aproximacin lineal por el mtodo de los mnimos cuadrados.

Por: Carlos Armando De Castro P. El siguiente algoritmo recibe un nmero arbitrario de pares de datos en la forma de una matriz de 2*n, donde las abcisas se encuentran en la primera fila (o rengln) y las ordenadas en la segunda fila de la matriz, devolviendo la pendiente m y el intercepto b de la recta que interpola a los datos y adems entrega su grfica:

function [m,b]=mincuadlin(X) n=length(X(1,:)); A=0; B=0; C=0; D=0;

for i=1:n; A=A+X(1,i); B=B+X(2,i); C=C+(X(1,i))^2; D=D+X(1,i)*X(2,i); end

m=(n*D-A*B)/(n*C-A^2); b=(C*B-D*A)/(n*C-A^2);

for i=1:n; hold on; plot (X(1,i),X(2,i),'*','MarkerEdgeColor','r','LineWidth',1); end

x=X(1,1):1:X(1,n); y=m*x+b; plot(x,y,'b'); title('Aproximacin lineal por mnimos cuadrados.');

Por ejemplo, para los datos {(1,0),(2,3),(3,4),(4,-6),(5,2),(6,4),(7,0),(8,4),(9,3)}, se escribe en el Command Window:

>>X=[1 2 3 4 5 6 7 8 9; 0 3 4 -6 2 4 0 4 3]; >>[m,b]=mincuadlin(X) Y el programa entrega los resultados: m = 0.2833 b = 0.1389

Descripcin: Este cdigo realiza ajustes varios de regresin por mnimos cuadrados. Los ajustes son exponencial, de potencia, logartmico y polinomial. Al final, se visualiza en pantalla la ecuacin del modelo ajustado y su grfica correspondiente.

% Regresion minimos cuadrados % Ajustes varios % Realizado por Ing E.Porto % El programa realiza varios ajustes: exponencial, de potencias, % logartmico y polinomial

clc;clear; %Ingreso de datos. Es lo nico que tienes que digitar. x=[1 2 3 4];y=[0 0.5 2 4]; %Digita aqui los datos de las parejas X y Y

%Opciones de inicio del programa n=length(y); opcion=0;sg=1;ajuste=1;xn=x;yn=y;

%Men para escoger anlisis de regresin while opcion==0 k=menu('Escoja analisis regresion','A*exp(B*X)','A*B^X','A*X^B','A+B*Ln(X)','Polinomio'); if k==1 opcion=1; m=1; if any(y<0) ajuste=0; else yn=log(y); end elseif k==2 opcion=1; m=1;

if any(y<0) ajuste=0; else yn=log(y); end elseif k==3 opcion=1; m=1; if any(y<0)|any(x<0) ajuste=0; else yn=log(y); xn=log(x); end elseif k==4 opcion=1; m=1; if any(x<0) ajuste=0; else xn=log(x); end elseif k==5 opcion=1; m=input(' Grado del polinomio = '); if m>n ajuste=0; end end end

% Cuerpo del programa if ajuste==0 fprintf(' No se puede realizar el ajuste ');

else for i=1:m+1 for j=1:m+1 sx(i,j)=sum(xn.^(i+j-2)); end sy(i)=sum(yn.*xn.^(i-1)); end % Presentacion de resultados fprintf(' Matriz de sumatorias '); disp([sx sy']); c=sxsy'; xx=linspace(min(x),max(x)); fprintf(' Curva ajustada: '); if k==1 fprintf(' Y = %g * exp(%g * X) n',exp(c(1)),c(2)); yy=exp(c(1))*exp(c(2)*xx); ya=exp(c(1))*exp(c(2)*x); elseif k==2 fprintf(' Y = %g * %g ^ X n',exp(c(1)),exp(c(2))); yy=exp(c(1))*exp(c(2)).^xx; ya=exp(c(1))*exp(c(2)).^x; elseif k==3 fprintf(' Y = %g * X ^ %g n',exp(c(1)),c(2)); yy=exp(c(1))*xx.^c(2); ya=exp(c(1))*x.^c(2); elseif k==4 fprintf(' Y = %g + %g * LnX n',c(1),c(2)); yy=c(1)+c(2)*log(xx); ya=c(1)+c(2)*log(x); elseif k==5 for w=1:m+1 if c(w)<0 sg='-'; else

sg='+'; end fprintf('%s %g X^%g ',sg,abs(c(w)),w-1); end cn=flipud(c); ya=polyval(cn,x); yy=polyval(cn,xx); end

%Impresin en pantalla de resultados fprintf(' Presione cualquier tecla para ver la grafica del ajuste '); pause %Grfica del modelo ajustado y de los puntos originales plot(xx,yy,x,y,'.r'); pause

end

Você também pode gostar