Para a disciplina de Álgebra Linear e Matricial por Ronan Soares
$e_i$ somente a $i$-ésima coordenada é $1$ o resto $0$
É o mesmo que resolver
$n$ sistemas...
Mas $A$ é igual em todos...
Dá pra agilizar isso não?
$A$ é igual pra todos os sistemas...
O método da eliminação só depende de $A$...
Se fizermos a matriz mega aumentada $M = \begin{bmatrix}A \; I\end{bmatrix}$...
Terminamos com $M = \begin{bmatrix}A' \; I'\end{bmatrix}$...
Ainda vamos ter muito trabalho...
E se continuarmos mexendo em $M = \begin{bmatrix}A' \; I'\end{bmatrix}$...
Até termos $A'$ em forma canônica?
Como $A$ é quadrada vamos ter algo parecido com $\begin{bmatrix}I \; ?\end{bmatrix}$
def canoniza(M, m, n):
# Vamos lá...
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
for i in range(m):
for j in range(i, n):
pivo = M[i][j]
# O pivô pode ser zero?
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
for i in range(m):
for j in range(i, n):
pivo = M[i][j]
# O pivô pode ser zero? não!
if pivo == 0:
# Encontrar candidato bom
# Trocar linhas
# Se não encontrar passa para próxima coluna
else:
# Realizar a eliminação para baixo e para cima
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
for i in range(m):
for j in range(i, n):
pivo = M[i][j]
# O pivô pode ser zero? não!
if pivo == 0:
pivo_alternativo = encontra_pivo(M, i + 1, j)
if pivo_alternativo == 0:
continue # Essa coluna é uma variável livre.
else:
# Realizar a eliminação para baixo e para cima
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
for i in range(m):
for j in range(i, n):
pivo = M[i][j]
if pivo == 0:
# Faz o pivoteamento!
else:
# Realizar a eliminação para baixo e para cima
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
for i in range(m):
for j in range(i, n):
pivo = M[i][j]
if pivo == 0:
# Faz o pivoteamento!
# Realizar a eliminação para baixo e para cima
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
for i in range(m):
for j in range(i, n):
pivo = M[i][j]
if pivo == 0:
# Faz o pivoteamento!
# Realizar a eliminação para baixo e para cima
for k in range(m):
# Eliminar a[k][j]
def canoniza(M, m, n):
# Para cada candidato à pivô zerar abaixo e acima dele...
for i in range(m):
for j in range(i, n):
pivo = M[i][j]
if pivo == 0:
# Faz o pivoteamento!
# Realizar a eliminação para baixo e para cima
for k in range(m):
# Eliminar a[k][j]
if k != i:
# M[k] <- M[k] - M[k][k] / pivo * M[i]
elimina(M[k], M[i], pivo)
return M
Depois de canonizar $A$