Está en la página 1de 11

ALGORITMO QUE HALLA LA MATRIZ

INVERSA DE UNA MATRIZ CUADRADA

FUNCIÓN PRINCIPAL
% FUNCION PRINCIPAL

function [retval] = inversa(matriz)

% verificacion de la dimension de la matriz


[m, n] = size(matriz);
if (m ~= n)
disp('No es posible operar, La matriz no es cuadrada');
retval = inf;
return
end

% verificacion de la no singularidad de la matriz


% (no singular = reversible)
det = determinante(matriz);

if (det == 0)
disp('La matriz no es inversible (Determinante = 0)');
retval = inf;
return
end

% despues de pasar los filtros, en adelante, la matriz


% tiene con toda seguridad una matriz inversa
matriz = auxInvertir(matriz);

retval = matriz;

end
FUNCIONES DEPENDIENTES

% FUNCION QUE HALLA EL DETERMINANTE:


% Esta funcion es recursiva, donde se hara una reduccion con
% operaciones de fila (gauss-jordan), capturando de ese modo
% el determinante.
%
% Parametros:
% matriz, matriz a trabajar
function [retval] = determinante(matriz)

len = length(matriz);

% si la matriz es de tamaño 1, o el determinante anterior es 0,


% su determinante vendrá a ser el único valor que posee multiplicado
% por el determinante anterior (caso base)
if (len == 1)
retval = matriz(1, 1);
return
end

% este intercambio obtiene una fila pivotal de mayor valor


matriz = intercambiarFila(matriz);

pivot = matriz(1, 1);

% verifica que el pivote no sea 0, de ser así, el determinante


% tambien seria cero
if (pivot == 0)
retval = 0;
return
end

% reduce la primera columna


matriz = reducir(matriz);

% llamada recursiva para la determinande de la matriz mas pequeña


retval = pivot*determinante(matriz(2:len, 2:len));

end
% FUNCION QUE INTERCAMBIA FILAS
% intercambia filas colocando la cifra de mayor valor en absoluto
% en la primera fila
function retval = intercambiarFila(matriz)

maxIndex = 1;
len = length(matriz);

% Buscamos la fila con mayor valor pivotal


for i = 2:len
if (abs(matriz(maxIndex, 1)) < abs(matriz(i, 1)))
maxIndex = i;
end
end

% una vez hallada, se le intercambia con la primera fila


if maxIndex ~= 1
aux = matriz(1, :);
matriz(1, :) = matriz(maxIndex, :);
matriz(maxIndex, :) = -1*aux;
end

% se retorna la misma matriz


retval = matriz;

end

% FUNCION REDUCIR
% reduce la primera columna, y devuelve dicha matriz ya operada
function [retval] = reducir(matriz)

pivot = matriz(1, 1);

% reducir la primera fila


matriz(1, :) = (1/pivot)*matriz(1, :);

len = length(matriz);

% reduccion mediante operaciones fila-elementales


for i = 2:len
matriz(i, :) = matriz(i, :) - matriz(i, 1)*matriz(1, :);
end

retval = matriz;

end
% FUNCION AUXILIAR PARA INVERTIR LA MATRIZ
% invierte la matriz mediante el metodo de reduccion de
% gauss-jordan, y devuelve dicha matriz ya invertida
function retval = auxInvertir(matriz)

len = length(matriz);

% matriz identidad con las mismas dimensiones


invMatriz = diag(ones(1, len));

% juntamos las matrices para las operaciones fila-elementales


matriz = [matriz invMatriz];

for i = 1:len

% INTERCAMBIAR FILA
% extraemos al mayor pivote en valor absoluto
maxIndex = i;
for j = (i+1):len
if (abs(matriz(maxIndex, i)) < abs(matriz(j, i)))
maxIndex = j;
end
end

% intercambiar unicamente siesque la fila es diferente


% a la fila pivotal
if (maxIndex ~= i)
aux = matriz(i, :);
matriz(i, :) = matriz(maxIndex, :);
matriz(maxIndex, :) = aux;
end
% ----- fin intercambiar fila -----

pivot = matriz(i, i);

matriz(i, :) = (1/pivot)*matriz(i, :);

% reduce complemtamente todas las filas de la matriz,


% para asi lograr tener la matriz identidad en el lado izquierdo
% de esta supermatriz que se formo
for j = 1:len
if (j ~= i)
matriz(j, :) = matriz(j, :) - (matriz(j, i))*matriz(i, :);
end
end

end

% retornamos dicha matriz


retval = matriz(:, (len+1):end);

end
CASOS DE PRUEBA
Con una matriz invertible estable de 10 incógnitas:
Generamos la matriz

Ponemos en marcha nuestro algoritmo


SOLO para verificar que nuestros resultados son correctos, usaremos la función inv de los
paquetes propios de Matlab

Y para terminar de corroborar la exactitud de nuestro resultado ejecutamos el siguiente comando

Lo cual se interpreta que todos los valores hallados son iguales al resultado de la función inv de
Matlab, considerando 4 valores decimales.
Con una matriz invertible inestable de 10 incógnitas:
Generamos la matriz

Ponemos de nuevo en marcha nuestro algoritmo


Ahora con la función inv de Matlab

Con una matriz no invertible de 10 incógnitas:


Generamos la matriz

Aplicamos nuestro algoritmo

Como se nos pidió en el enunciado, nos devuelve un valor inf al no ser la matriz invertible, y un
mensajito en pantalla para mejor retroalimentación.
Hacemos la prueba de la misma matriz con la función inv de Matlab

Lo cual también nos indica que la matriz es no invertible al ser singular (determinante = 0).
EFICACIA
Nos planteamos un ejercicio, donde tendremos que hallar el vector X, para ello se tiene la
siguiente forma:

AX = B, donde la solución seria X = inv(A) * B

Probemos nuestro algoritmo:

Para probar la correctitud de nuestros resultados, probemos los mismos datos con la función inv
de Matlab
Como notamos nuestro algoritmo es muy exacto en cuanto a resultados.

Su robustez le permite funcionar con cualquier tamaño de matrices, como se ve en la siguiente


imagen

Lo cual esta característica le hace mas confiable en cuanto a resultados erróneos.

También podría gustarte