sábado, 14 de noviembre de 2015

Método de Gauss-Jordan en MATLAB, solución de sistemas de ecuaciones lineales


Este código te permitirá resolver un sistema de ecuaciones lineales de cualquier tamaño, para comenzar, debes crear un Script en el cual debes vaciar el siguiente código.

%Programa principal, este es el único script que debes correr
A=[1,1,0,3;2,1,-1,1;3,-1,-1,2;-1,2,3,-1]; %Los datos que contiene representan una matriz de 4x4, debes sustituirlos por tus datos propios
B=[4,1,-3,4]'; %Los datos que contiene representan una matriz de 4x1, debes sustituirlos por tus datos propios
x=EliminacionGaussiana(A,B)

Importante: 
A: representa la parte "izquierda" del sistema de ecuaciones, es decir, solo debes añadir los valores que se encuentran antes del signo = para cada ecuación, recuerda que este sistema trabaja en forma matricial. B representa una matriz vertical la cual contiene los resultados de cada una de las ecuaciones, recuerda que el apostrofe que se encuentra despues del ultimo corchete en B, le indica a MATLAB que la matriz es vertical, por lo tanto es muy importante no removerlo.

Posteriormente debes crear un nuevo Script, en el cual se deberá vaciar el siguiente código.

function x=EliminacionGaussiana(A,B)
% A es una matriz de orden NxN
% B es una matriz de orden Nx1
% x es una matraz de orden Nx1 que contiene la solucion de Ax=B
%Scienceprocedures.blogspot.mx
[N N]=size(A);
x=zeros(N,1);
C=zeros (1,N+1);
Aug=[A B];
for q= 1:(N-1)
    [Y,j]=max(abs(Aug(q:N,q)));
    C=Aug(q,:);
    Aug(q,:)=Aug(j+q-1,:);
    Aug(j+q-1,:)=C;
    if Aug(q,q)==0
        'El valor de A es irregular. No hay solucion o no es unica';
        break
    end 
    for k=q+1:N
        m=Aug(k,q)/Aug(q,q);
        Aug(k,q:N+1)=Aug(k,q:N+1)-m*(Aug(q,q:N+1));
    end
    
end
x=resource(Aug(1:N,1:N),Aug(1:N,N+1));
end 

Para continuar, debes crear un tercer Script con el código que se muestra a continuación.

function x=resource(A,B)
n=length(B);
x=zeros(n,1); x(n)=B(n)/A(n,n);
for k=n-1:-1:1
    x(k)=(B(k)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end 


Consideraciones: Recuerda que debes guardar los tres script en la misma carpeta, de lo contrario no correrán adecuadamente.
El programa principal contiene los datos para resolver un sistema de 4 ecuaciones con cuatro incógnitas a manera de ejemplo para el usuario.





viernes, 13 de noviembre de 2015

Código en MATLAB para implementar el método de interpolación lineal.

Para implementar el método en MATLAB, se debe crear un script que contenga el siguiente código, este será el programa principal, en el cual se deben vaciar los valores de interés, este es el unico programa que se debe correr. El programa contiene los datos del problema que resolvimos en nuestra entrada "Métodos numéricos, ejemplo del método de aproximación lineal".

%Cienciaparacualquiera.blogspot.com
x=[1,4,5,7,9]
y=[2,4,6,7,10]
plot (x,y,'*r')
x0=0:0.1:10
P0=Metododeaproximacion(x,y,x0)
hold on
plot (x0,P0)
grid on
xlabel('x')
ylabel('y')

title('Plot using linear Interpolation method')

En un nuevo script, se debe vaciar el siguiente código, el cual contiene el método numérico, este programa no debe ser corrido, pero debes asegurarte de guardarlo en la misma carpeta que el script anterior.

function P0=Metododeaproximacion(x,y,x0)
s1=0;
s2=0;
s3=0;
p1=0;
p2=0;
p3=0;

for i=1:length(x)
    s1=(s1+(x(i))^2);
     s2=s2+(x(i));
     s3=s3+(x(i)*y(i));
end
s1=s1
s2=s2
s3=s3

for i=1:length(x)
    p1=p1+x(i);
    p2=(length(x));
    p3=p3+(y(i));
end
p1=p1;
p2=p2;
p3=p3;
a=(((p2*s3)-(p3*s2))/((p2*s1)-(s2*p1))) %"a" es el valor de la pendiente (a = slope value)
b=(((p1*s3)-(s1*p3))/((p1*s2)-(s1*p2)))
P0=((a.*x0)+(b))

PI=@(x0)(((a.*x0)+(b)))

Nota: El codigo aquí mostrado solo representa un esqueleto, si necesitas añadirle más funciones, eres libre de hacerlo.

Si quieres aprender más sobre el método, revisa la siguiente entrada
http://cienciaparacualquiera.blogspot.mx/2015/11/metodos-numericos-el-metodo-de.html




Métodos numéricos, ejemplo del método de interpolación lineal.


El problema consiste en encontrar la mejor recta que aproxime a un conjunto de puntos. A continuación se explicará el método y se realizará un ejemplo para mejorar la comprensión del tema.

Primeramente, debemos recordar la ecuación que describe la distancia entre 2 puntos en un plano.


 El método de aproximación hace uso de una variación de la ecuación anterior.

Para poder definir la ecuación de la recta que mejor aproxima a los puntos, debemos conocer los valores de las variables "m" y "b", que serán sustituidos en la siguiente ecuación (la ecuación general de una linea recta). 

Nota: Ambas ecuaciones son iguales, en el ejemplo que se desarrolla más adelante se utilizará la variable "a" en lugar de "m", debes tener muy claro que ambas variables representan la pendiente de la recta, lo único que se hace es cambiar el nombre de la variable. 



Para encontrar los valores desconocidos de "a" y "b", haremos uso de derivadas parciales, esto con el objetivo de obtener un sistema de 2 ecuaciones con 2 incógnitas, de otra manera sería imposible obtener el valor de dos variables desconocidas con una sola ecuación. El sistema se obtiene de la siguiente manera. 


Acomodando los términos, el sistema de ecuaciones queda de la siguiente manera. 


Nota: Te podrías estar preguntando ¿Que le pasó a ese número 2 que estaba en el sistema anterior? 
Observa que, si se despeja cada ecuación, el dos sería enviado al otro lado para dividir al cero, quedando 0/2, recuerda que el resultado de dividir cero entre cualquier otro número es siempre igual a cero. 

Despejando el anterior sistema de ecuaciones, es posible encontrar los valores de a y b. Seguramente hasta ahora no queda lo suficientemente claro el procedimiento, así que la mejor manera de hacer este procedimiento más fácil de entender, es a través de un ejemplo. 

Ejemplo

Propondremos los siguientes cinco puntos, para los cuales deberemos obtener la recta que mejor los describa, a continuación se muestran los puntos y una gráfica de los mismos. (Si quieres implementar el método en MATLAB, visita la siguiente entrada
http://scienceprocedures.blogspot.mx/2015/11/metodos-numericos-el-metodo-de.html)

X= [1,4,5,7,9]
Y=[2,4,6,7,10]




A partir de ahora, separaremos cada una de las ecuaciones anteriores para que la solución del problema sea más sencilla y didáctica. Comenzaremos con la primera ecuación, separandola en partes más pequeñas.

Al sustituir los valores de "x" y "y" para cada "s", las ecuaciones quedan como se muestra a continuación.

A continuación repetiremos el proceso anterior con la segunda ecuación.


Al sustituir los valores de "x" y "y" para cada "s", las ecuaciones quedan como se muestra a continuación.



Ahora, volveremos a escribir las ecuaciones 1 y 2 en los términos de "s" y "z" que acabamos de obtener.


Al sustituir cada valor, se obtiene el siguiente sistema de ecuaciones.

Ahora es posible encontrar los valores de "a" y "b" para completar la ecuación de la recta que mejor se acerca a nuestros puntos. A continuación se resolverá el sistema de ecuaciones 

Con la información recién obtenida, obtenemos que la ecuación que describe la recta que mejor se acerca a los puntos propuestos es:
Nota que el valor de 0.9837 corresponde a la pendiente de la recta.

A continuación se muestra la gráfica de nuestros puntos propuestos junto con la gráfica de la recta encontrada,

X= [1,4,5,7,9]
Y=[2,4,6,7,10]
y=0.9837x+0.6848
Si quieres implementar el método en MATLAB, visita la siguiente entrada
http://cienciaparacualquiera.blogspot.mx/2015/11/metodos-numericos-el-metodo-de.html