# Autor - https://pt.stackoverflow.com/users/132
class Matriz:
def __init__(self, largura, altura, valores):
if len(valores) != altura:
raise IndexError("O conjunto de valores não tem o tamanho correto.")
for linha in valores:
if len(linha) != largura:
raise IndexError("O conjunto de valores não tem o tamanho correto.")
self.__valores = valores
@property
def largura(self):
return len(self.__valores[0])
@property
def altura(self):
return len(self.__valores)
def valor(self, num_linha, num_coluna):
if num_linha < 0 or num_linha >= self.altura or num_coluna < 0 or num_coluna >= self.largura:
raise IndexError(f"Não há posição a_{num_linha}_{num_coluna}.")
return self.__valores[num_linha][num_coluna]
def definir(self, num_linha, num_coluna, valor):
if num_linha < 0 or num_linha >= self.altura or num_coluna < 0 or num_coluna >= self.largura:
raise IndexError(f"Não há posição a_{num_linha}_{num_coluna}.")
self.__valores[num_linha][num_coluna] = valor
def multiplicar_linha(self, num_linha, valor):
if num_linha < 0 or num_linha >= self.altura:
raise IndexError(f"Não há linha {num_linha}.")
for coluna in range(0, self.largura):
self.__valores[num_linha][coluna] *= valor
def somar_linha(self, num_linha, valores, multiplicador):
if num_linha < 0 or num_linha >= self.altura:
raise IndexError(f"Não há linha {num_linha}.")
if len(valores) != self.largura:
raise IndexError("O conjunto de valores não tem o tamanho correto.")
for coluna in range(0, self.largura):
self.__valores[num_linha][coluna] += valores[coluna] * multiplicador
def linha(self, num_linha):
if num_linha < 0 or num_linha >= self.altura:
raise IndexError(f"Não há linha {num_linha}.")
return self.__valores[num_linha]
@staticmethod
def triangular_inferior(lista_1, lista_2):
t = len(lista_2)
if t * (t + 1) / 2 != len(lista_1):
raise IndexError("A segunda lista não tem a quantidade correta de termos.")
matriz = []
n = 0
for i in range(0, t):
linha = []
for j in range(0, i + 1):
linha.append(lista_1[n])
n += 1
for j in range(i + 1, t):
linha.append(0)
matriz.append(linha)
linha.append(lista_2[i])
return Matriz(t + 1, t, matriz)
def eliminacao_gauss(self):
for i in range(0, self.altura):
if self.__valores[i][i] == 0:
raise IndexError("Zero na coluna principal.")
for i in range(0, self.altura):
self.multiplicar_linha(i, 1 / self.__valores[i][i])
for j in range(i + 1, self.altura):
self.somar_linha(j, self.__valores[i], -self.__valores[j][i])
ret = []
for i in range(0, self.altura):
ret.append(self.__valores[i][-1])
return ret
def __str__(self):
t = ""
for i in range(0, self.altura):
for j in range(0, self.largura):
v = self.__valores[i][j]
if j == self.largura - 1:
t += f" = {v: >6.2f}"
else:
if j != 0: t += " "
if v == 0:
t += " " * (12 + len(str(j + 1)))
else:
s = "+" if v > 0 else "-"
t += f"{s} {abs(v): >6.2f} * x{j + 1}"
t += "\n"
return t
def mostra_vetor(vetor):
aux = ""
for i in range(0, len(vetor)):
aux += f"{vetor[i]} * x{i + 1}\n"
return aux
m = Matriz.triangular_inferior([-13, 13, 3, -5, -1, -1, 3, 0, 1, 1], [-13, 13, -7, 4])
print(m)
resultado = m.eliminacao_gauss()
print(resultado)
print(mostra_vetor(resultado))