Marco teórico
A pesar de que el álgebra lineal es una ciencia nueva
referenciada hacia el cálculo o simplemente, respecto a
las matemáticas, tiene un gran peso en nuestros días,
puesto que permite solucionar situaciones o problemas
que constan de muchas variables (podría hablarse hasta
de millones de variables por sistema). Por estas razones
y por el uso de sistemas computarizados, el álgebra
lineal se convierte en una potente arma para resolver
complicados problemas y no es de asombrarse que se
utilicen en muchas ramas de la ingeniería. A lo largo del
informe utilizaremos éstos conocimientos adquiridos a lo largo de la carrera y el curso para
resolver problemas que consten de matrices de coeficientes de variables, y vectores soluciones
con el fin de encontrar resultados con ciertas condiciones. Para todos los métodos debemos
saber que son matrices no singulares.
En primer lugar, se tiene el Método de Gauss, que no es más que simples multiplicaciones y
sumas para lograr una matriz triangular superior o inferior y finalmente encontrar el valor de las
variables. Éste método cuenta con dos partes para realizar éste cometido: la eliminación
progresiva y la sustitución regresiva, los cuales consisten en ir despejando las incógnitas hasta
dejar de manera triangular superior a la matriz de coeficientes y luego, mediante el valor
obtenido de la incógnita final, irla sustituyendo hacia atrás, hasta obtener las soluciones de cada
variable. Para mejorar el método se usa la técnica del pivoteo que es solo un cambio entre filas
de la matriz.
Por otro lado, se tiene el Método de la matriz LU, que tiene el mismo funcionamiento de Gauss,
pero en vez de realizar una matriz triangular superior, obtiene dos matrices, una llamada L
(Lower) que es una matriz triangular inferior con su traza lii = 1, y otra llamada U (Upper) que no
deja de ser una matriz triangular superior. Para éste método es necesario calcular dos
ecuaciones matriciales:
Donde:
Por ésta razón, se resuelve a la matriz A en una matriz triangular superior que se llamará U, y en
el mismo proceso se irán obteniendo los valores de la matriz L, puesto que, al resolver cada
ecuación, los valores de L serán obtenidos, es decir:
Lo que significa que la matriz A se puede descomponer en dos matrices peculiares, en su matriz
inferior L y la traspuesta de ésta.
Códigos
Método de Gauss con Pivoteo
function [ x ] = GaussPiv( A, b )
[n,m]=size(A); %Obtiene la dimension del lado de la matriz
max=abs(A(2,2)); %es el maximo relativo para el cambio de filas en el
pivoteo
x=zeros(n,1); %crea el vector solucion
for k=1:n %Inicia el bucle de matrices
for i=k+1:n %Inicia el bucle de las filas
for r=k+1:n %Inicia el pivoteo por filas para encontrar el
valor
% mas grande que evite una singularidad
if abs(A(r,k+1))> max
mayor=r; %Guarda el numero de la fila y el maximo nuevo
max=abs(A(r,k));
end
end
aux=A(k,:); %realiza los cmabios de variables respectivos
A(k,:)= A(mayor,:);
A(mayor,:)=aux(:);
aux2=b(k);
b(k)=b(mayor);
b(mayor)=aux2;
l=A(i,k)/A(k,k); %Empieza a trabajr el algoritmo de Gauss con l
% como coeficiente de multiplicidad para
cada columna de la fila
for j=k+1:n %Inicia el bucle de columnas
A(i,j)=A(i,j)-l*A(k,j); %realiza el proceso de eliminacion
end
A(i,k)=0; %Deja un cero en la parte de abajo del pivote
b(i)=b(i)-l*b(k); %Trabaja el vector b para no afectar la
solucion
end
end
disp('La matriz triangular superior es: ')
disp(A);
disp('El vector b es: ')
disp(b);
for i=n:-1:1; %Inicia el proceso de sustitucion regresiva
aux=0;
for j=i+1:n
aux=aux+A(i,j)*x(j); %Despeja la variable y la guarda luego
end
x(i)=(b(i)-aux)/A(i,i);
end
Método de la factorización LU
function [ x ] = LUSol( A, b )
[LU, c]= LUgauss(A, b);
[n,m]=size(LU);
L=eye(n);
U=zeros(n,n);
for i=1:n %Seprocede a poner en matrices distintas a L y a U
for j=i:n
U(i,j)=LU(i,j);
end
end
for i=2:n
for j=1:i-1
L(i,j)=LU(i,j);
end
end
y=zeros(n,1);
for i=2:n %Inicia el proceso de sustitucion progresiva
aux=b(i);
for j=1:i-1
aux=aux-L(i,j)*b(j); %Despeja la variable y la guarda luego
end
b(i)=aux;
end
y(n)=(b(n)/L(n,n));
for i=n-1:-1:1;
aux=0;
for j=i+1:n
aux=aux+L(i,j)*y(j); %Despeja la variable y la guarda luego
end
y(i)=(b(i)-aux)/L(i,i);
end
disp('El vector y es: ');
disp(y);
x=zeros(n,1);
x(n)=(y(n)/U(n,n));
for i=n-1:-1:1; %Inicia el proceso de sustitucion regresiva
aux=0;
for j=i+1:n
aux=aux+U(i,j)*x(j); %Despeja la variable y la guarda luego
end
x(i)=(y(i)-aux)/U(i,i);
end
disp('El vector solucion del sistema es: ');
disp(x);
Método de Cholesky
function [ x ] = Cholesky(A, b)
[n, m]=size(A);
for i=1:n %Compara si es una matriz simetrica
for j=1:n
if A(i,j)~=A(j,i);
disp('No es una matriz simetrica');
x='NaN';
return
end
end
end
for k=1:n %Realiza el metodo de solucion de la matriz triangular
for i=1:k-1 %inferior
sum=0;
for j=1:i-1
sum=sum+A(i,j)*A(k,j);
end
A(k,i)=(A(k,i)-sum)/A(i,i);
end
sum=0;
for j=1:k-1
sum=sum + (A(k,j))^2;
end
A(k,k)=sqrt(A(k,k)-sum);
end
L=A; %Se obtienen L y U
U=A';
y=zeros(n,1);
for i=2:n %Inicia el proceso de sustitucion progresiva
aux=b(i);
for j=1:i-1
aux=aux-L(i,j)*b(j); %Despeja la variable y la guarda luego
end
b(i)=aux;
end
y(n)=(b(n)/L(n,n));
for i=n-1:-1:1;
aux=0;
for j=i+1:n
aux=aux+L(i,j)*y(j); %Despeja la variable y la guarda luego
end
y(i)=(b(i)-aux)/L(i,i);
end
disp('El vector y es: ');
disp(y);
x=zeros(n,1);
x(n)=(y(n)/U(n,n));
for i=n-1:-1:1; %Inicia el proceso de sustitucion regresiva
aux=0;
for j=i+1:n
aux=aux+U(i,j)*x(j); %Despeja la variable y la guarda luego
end
x(i)=(y(i)-aux)/U(i,i);
end
disp('El vector solucion del sistema es: ');
disp(x);
end
Ejemplos
Para esta sección, se presentaron ciertos problemas en los códigos del método LU y el método
de Cholesky que, a pesar del extenso tiempo invertido, no se logró encontrar la falla que daba
resultados distintos en ciertas ocasiones. El algoritmo de Gauss fue un éxito por lo que se
procederá con el siguiente sistema de ecuaciones lineales para resolver:
El sistema no posee soluciones según Matlab, y esto es debido a que alguna de las cuatro
ecuaciones es linealmente dependiente de alguna de las otras tres, por lo tanto, el sistema
queda indeterminado.
Conclusiones y Recomendaciones
A pesar de no haber tenido unos resultados muy fructíferos en el presente informe, se puede
observar que las diferencias en el manejo de cada código son muy pocas, puesto que el método
de descomposición LU y el método de Cholesky prácticamente los mismo, a diferencia de que la
una trabaja con todo tipo de matriz no singular y la otra con matrices simétricas y positivas. Unos
datos curiosos que se pueden obtener de este trabajo son la basta forma de obtener resultados
de sistemas de ecuaciones lineales, así como los métodos más precisos o más rápidos. En el caso
de los tres métodos, si es que no existe un debido control de las variables, fácilmente se puede
caer en el error o en indeterminaciones. Es por esta razón que introdujimos el concepto del
pivote en éstos modelos matemáticos y otras reglas para no entrar en dichas situaciones. Por
otro lado, se desearía entender mucho más el funcionamiento de dichos códigos para no caer
en errores como lo ocurrido en el presente informe.
Referencias
Chapra, S., & Canale, R. (2007). Métodos numéricos para ingenieros. México D.F.: McGraw-Hill.
QUARTERONI, A., & SALERI, F. (2006). Cálculo Científico con Matlab y Octave. Milán: Springer.