Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
COMPUTACIONAL
Algoritmo de Clculo da inversa de uma matriz do tipo n x n
Aluno: Rigel Procpio Fernandes
1 - INTRODUO
O presente relatrio visa demonstrar a utilizao de um algoritmo criado para calcular a inversa de
matrizes A do tipo n x n e analisar os resultados obtidos. Para alcanar esse objetivo foi criado um
algoritmo que realiza operaes elementares sobre matrizes para calcular a sua inversa A-1.
2 - DESCRIO DO ALGORITMO
De acordo com o escritor Thomas Brooks (16081680): O exemplo a mais poderosa
retrica. Portanto, o exemplo a seguir ser utilizado para facilitar a compreenso do algoritmo.
Dada uma Matriz A como entrada
Matriz A como entrada
- 10.
0.
1.
1.
1.
4. - 1.
111. 0.
Passo 1: O algoritmo verifica o nmero n de linhas; cria uma matriz identidade I(n, n) e concatena a
Matriz A com a matriz identidade I.
Matriz A concatenada com uma matriz indentidade I
- 10.
0.
1.
1.
1. 1. 0. 0.
4. - 1. 0. 1. 0.
111.
0. 0. 0. 1.
Passo 2: Percorrer todas as colunas da matriz. O primeiro elemento a ser verificado em cada coluna
ser o elemento pertencente diagonal. Aps o ajuste da diagonal os elementos restantes sero
ajustados, caso necessrio. Para o ajuste dos elementos do tringulo superior ou inferior diminui-se a
sua linha da linha da diagonal multiplicada pelo elemento a ser ajustado. Todas as linhas de cada
coluna sero percorridas depois do ajuste da diagonal, se necessrio.
Os elementos em negrito que foram selecionados em cada iterao para o ajuste esto
destacados em negrito; e
os elementos que foram ajustados esto formatados em negrito e cor vermelha.
- 10.
0.
1.
1.
1. 1. 0. 0.
4. - 1. 0. 1. 0.
111.
0. 0. 0. 1.
0. 0.
1. 0.
0. 1.
A(1,1) = 1 ajustado
A(3,1) = 1 selecionado para o ajuste
Elemento do Triangulo Inferior ajustado para zero
1. - 0.1
- 0.1 - 0.1 0. 0.
0. 4.
- 1.
0. 1. 0.
0. 111.1 0.1 0.1 0. 1.
Diagonal ajustada para 1
1. - 0.1
- 0.1
0. 1.
- 0.25
0. 111.1 0.1
- 0.1 0.
0.
0.25
0.1 0.
0.
0.
1.
0.
- 0.125 - 0.1 0.025 0.
1.
- 0.25
0.
0.25 0.
111.1 0.1
0.1 0.
1.
0.
0.
1. - 0.25
0. 27.875
0.
0.25
0.1 - 27.775
0.
1.
0.
0.
0.0358744
3 - EXPERINCIA
Para realizar experimentos foram utilizadas matrizes elaboradas manualmente e tambm a gerao
de matrizes aleatrias com o auxlio da funo rand(n,n).
Os experimentos com as matrizes elaboradas manualmente apresentou uma taxa de acerto prximo
de 100%.
Contudo, mais testes foram elaborados para se ter uma quantidade razovel de experimentos para
analisar o algoritmo criado. O teste foi realizado 100.000 vezes com matrizes aleatrias (rand(n,n)).
As experincias demonstraram que o algoritmo possui alto ndice de acerto em relao funo do
SciLab inv(A) se arrendondarmos os elementos da matriz para o inteiro mais prximo. Entretanto, os
resultados encontrados quando foi considerado mais de dez casas decimais foram insatisfatrios
quando comparados com a funo do SciLab. Principalmente devido ao arredondamento.
Quando comparado com matrizes quase singulares os resultados entre as funes so bem diferentes.
Essas diferenas poderiam ser o motivo para a elevada taxa de erro. Porm, tambm foram
calculados os determinantes das 100.000 matrizes aleatrias para cada teste da tabela abaixo e
constatou-se que a funo rand(n,n) no gera matrizes singulares.
Assumindo-se que os valores encontrados no SciLab esto corretos, a Tabela a seguir compara a taxa
de acerto do algoritmo com os resultados da funo inv do SciLab:
Elementos das matrizes arredondados para o inteiro mais prximo
Matriz
Taxa acerto
Taxa erro
2x2
~87%
~13%
3x3
~75%
~25
5x5
~56%
~44%
10x10
~28%
~72%
Comparao entre matrizes at com elementos com mais de dez casas decimais
Matriz
Taxa acerto
Taxa erro
2x2
~25%
~75%
3x3
<1%
>99%
5x5
~0%
~100%
10x10
~0%
~100%
4 - CONCLUSO
Depois de realizados milhares de experimentos com o algoritmo, de forma manual e automtica,
pde-se constatar que o programa criado apresentou uma taxa de acerto satisfatria para matrizes
inseridas manualmente, como por exemplo, a matriz da seo 2 desse relatrio.
ALGORITMO
clear
x=0
A = [-10 1 1; 0 4 -1; 1 111 0]
linha = 1
mj = 1
m1 = 0
function[x,y] = ff(A)
n = size(A,1) // descobre o tamanho n de linhas
D = eye(n,n) // cria matriz identidade de tamanho n
M = [A D] // concatena matriz identidade de tamanho n a matriz a ser invertida de tamanho n
disp(M(:,1:n), "Matriz de entrada")
disp(M, "Matriz Concatenada com uma Matriz Indentidade")
if det(M(:,1:n)) <> 0 then // testa se a matriz possui uma inversa
for j=1:n //percorre a matriz desde a coluna 1 ate a coluna n
for i=1:n // para cada coluna percorre cada linha para efetuar operacoes elementares
if M(j,j) <> 1 then // diagonal precisa ser ajustada
if M(j,j) == 0 then
m=1;
while mj == 0 & m < n // percorre a coluna ate achar um valor diferente de zero
if M(m,j) <> 0 then
mj = M(m,j) // a variavel mj recebe o valor nao nulo do elemento m,j encontrado
linha = m // linha recebe o numero da i da linha do elemento nao nulo
end
m = m+1
end
M(j,:) = (1/mj)*M(linha,:) + M(j,:) // a linha da diagonal com valor nulo somada a
linha do elemento no nulo multiplicado pelo inverso do elemento M(m,j)
else
M(j,:) = 1/M(j,j) * M(j,:) // se o elemento da diagonal no for nulo a linha ser
multiplicada pelo seu inverso
end
disp(M,"Diagonal ajustada para 1")
end // finaliza o ajuste da diagonal