Sei sulla pagina 1di 7

RELATRIO DO TRABALHO 1 DE LGEBRA LINEAR

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.

A(1,1) = -10 selecionado para o ajuste


Diagonal ajustada para 1
1. - 0.1 - 0.1 - 0.1
0. 4.
- 1.
0.
1. 111. 0.
0.

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.

Elemento do Triangulo Superior ajustado para zero


1.
0.
0.

0.
- 0.125 - 0.1 0.025 0.
1.
- 0.25
0.
0.25 0.
111.1 0.1
0.1 0.
1.

Elemento do Triangulo Inferior ajustado para zero


1. 0. - 0.125 - 0.1
0.025 0.

0.
0.

1. - 0.25
0. 27.875

0.
0.25
0.1 - 27.775

0.
1.

Diagonal ajustada para 1


1. 0. - 0.125 - 0.1
0.025
0. 1. - 0.25
0.
0.25
0. 0. 1.
0.0035874 - 0.9964126

0.
0.
0.0358744

Elemento do Triangulo Superior ajustado para zero


1. 0. 0. - 0.0995516 - 0.0995516 0.0044843
0. 1. - 0.25 0.
0.25
0.
0. 0. 1.
0.0035874 - 0.9964126 0.0358744
Elemento do Triangulo Superior ajustado para zero
1. 0. 0. - 0.0995516 - 0.0995516 0.0044843
0. 1. 0. 0.0008969 0.0008969 0.0089686
0. 0. 1. 0.0035874 - 0.9964126 0.0358744
Matriz Identidade Resultante Esquerda e a Inversa da Matriz de Entrada direita (negrito)
1. 0. 0. - 0.0995516 - 0.0995516 0.0044843
0. 1. 0. 0.0008969 0.0008969 0.0089686
0. 0. 1. 0.0035874 - 0.9964126 0.0358744
Matriz Inversa de M
- 0.0995516 - 0.0995516 0.0044843
0.0008969 0.0008969 0.0089686
0.0035874 - 0.9964126 0.0358744
Matriz inversa computada pelo SciLab
- 0.0995516 - 0.0995516 0.0044843
0.0008969 0.0008969 0.0089686
0.0035874 - 0.9964126 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

if i <> j then // testa se elemento faz parte do triangulo inferior ou superior


if M(i,j) <> 0 & M(j,j) == 1 then // se o elemento for diferente de zero e a diagonal 1
M(i,:) = M(i,:) - M(i,j) * M(j,:) // a linha i (do elemento no-nulo) ser subtrada pela
linha da diagonal multiplicada pelo valor no nulo do elemento analisado
if i > j then
disp(M,"Elemento do Triangulo Inferior ajustado para zero")
else
disp(M,"Elemento do Triangulo Superior ajustado para zero")
end
end
end
end // final do for que percorre linhas
end // final do primeiro for que percorre as colunas
disp (M,"Matriz Identidade Resultante Esquerda e Inversa da Matriz de Entrada direita")
disp (M(:,n+1:2*n),"Matriz Inversa de M")
disp (inv(A),"Matriz inversa computada pelo SciLab")
else
disp ("Matriz no possui inversa!")
end
endfunction
ff(A)

Potrebbero piacerti anche