Está en la página 1de 6

Algoritmo en MATLAB para la aproximación lineal por el método de los mínimos cuadrados.

Por: Carlos Armando De Castro P.

El siguiente algoritmo recibe un número arbitrario de pares de datos en la forma de una matriz de
2*n, donde las abcisas se encuentran en la primera fila (o renglón) 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
además entrega su gráfica:

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('Aproximación lineal por mínimos 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
Descripción:
Este código realiza ajustes varios de regresión por mínimos cuadrados. Los ajustes son exponencial,
de potencia, logarítmico y polinomial. Al final, se visualiza en pantalla la ecuación del modelo
ajustado y su gráfica correspondiente.

% Regresion minimos cuadrados


% Ajustes varios
% Realizado por Ing E.Porto
% El programa realiza varios ajustes: exponencial, de potencias,
% logarítmico 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 análisis de regresión


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

%Impresión en pantalla de resultados


fprintf(' Presione cualquier tecla para ver la grafica del ajuste ');
pause
%Gráfica del modelo ajustado y de los puntos originales
plot(xx,yy,x,y,'.r');
pause

end

También podría gustarte