# Autor - https://pt.stackoverflow.com/users/132
def solucao_triangular_inferior(lista_1, lista_2):
# Descobre a altura e a largura e verifica se as listas tem o tamanho certo.
altura = len(lista_2)
largura = altura + 1
if altura * (altura + 1) / 2 != len(lista_1):
raise IndexError("A segunda lista não tem a quantidade correta de termos.")
# Constrói a matriz a partir das listas. A última coluna serão os valores de lista_2.
matriz = []
n = 0
for i in range(0, altura):
linha = []
for j in range(0, i + 1):
linha.append(lista_1[n])
n += 1
for j in range(i + 1, altura):
linha.append(0)
matriz.append(linha)
linha.append(lista_2[i])
# Cria uma segunda matriz como cópia da primeira, pois a primeira será destruída como parte do processo de eliminação de Gauss.
copia = []
for linha in matriz:
copia.append(linha[:])
# Verifica se não há nenhum zero na diagonal principal.
for i in range(0, altura):
if matriz[i][i] == 0:
raise IndexError("Zero na coluna principal.")
# Zera os coeficientes fora da diagonal principal.
for i in range(0, altura):
# Reduz o coeficiente da diagonal principal para 1 e todos os outros da mesma linha na mesma proporção.
valor = 1 / matriz[i][i]
for coluna in range(0, largura):
matriz[i][coluna] *= valor
# Corrige as demais linhas abaixo.
for j in range(i + 1, altura):
# Conceitualmente, o certo seria percorrer todas as colunas da linha j.
# No entanto, todas as colunas diferentes da coluna i e da última teriam seus valores inalterados,
# e portanto só precisamos mexer nessas duas colunas.
matriz[j][-1] -= matriz[i][-1] * matriz[j][i]
matriz[j][i] = 0
# Monta o resultado final.
ret = []
for i in range(0, altura):
ret.append(matriz[i][-1])
# Retorna a matriz original e o resultado.
return copia, ret
def mostra_matriz(matriz):
altura = len(matriz)
largura = len(matriz[0])
t = ""
for i in range(0, altura):
for j in range(0, largura):
v = matriz[i][j]
if j == 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
matriz, resultado = solucao_triangular_inferior([-13, 13, 3, -5, -1, -1, 3, 0, 1, 1], [-13, 13, -7, 4])
print(mostra_matriz(matriz))
print(mostra_vetor(resultado))
IyBBdXRvciAtIGh0dHBzOi8vcHQuc3RhY2tvdmVyZmxvdy5jb20vdXNlcnMvMTMyCmRlZiBzb2x1Y2FvX3RyaWFuZ3VsYXJfaW5mZXJpb3IobGlzdGFfMSwgbGlzdGFfMik6CiAgICAjIERlc2NvYnJlIGEgYWx0dXJhIGUgYSBsYXJndXJhIGUgdmVyaWZpY2Egc2UgYXMgbGlzdGFzIHRlbSBvIHRhbWFuaG8gY2VydG8uCiAgICBhbHR1cmEgPSBsZW4obGlzdGFfMikKICAgIGxhcmd1cmEgPSBhbHR1cmEgKyAxCiAgICBpZiBhbHR1cmEgKiAoYWx0dXJhICsgMSkgLyAyICE9IGxlbihsaXN0YV8xKToKICAgICAgICByYWlzZSBJbmRleEVycm9yKCJBIHNlZ3VuZGEgbGlzdGEgbsOjbyB0ZW0gYSBxdWFudGlkYWRlIGNvcnJldGEgZGUgdGVybW9zLiIpCgogICAgIyBDb25zdHLDs2kgYSBtYXRyaXogYSBwYXJ0aXIgZGFzIGxpc3Rhcy4gQSDDumx0aW1hIGNvbHVuYSBzZXLDo28gb3MgdmFsb3JlcyBkZSBsaXN0YV8yLgogICAgbWF0cml6ID0gW10KICAgIG4gPSAwCiAgICBmb3IgaSBpbiByYW5nZSgwLCBhbHR1cmEpOgogICAgICAgIGxpbmhhID0gW10KICAgICAgICBmb3IgaiBpbiByYW5nZSgwLCBpICsgMSk6CiAgICAgICAgICAgIGxpbmhhLmFwcGVuZChsaXN0YV8xW25dKQogICAgICAgICAgICBuICs9IDEKICAgICAgICBmb3IgaiBpbiByYW5nZShpICsgMSwgYWx0dXJhKToKICAgICAgICAgICAgbGluaGEuYXBwZW5kKDApCiAgICAgICAgbWF0cml6LmFwcGVuZChsaW5oYSkKICAgICAgICBsaW5oYS5hcHBlbmQobGlzdGFfMltpXSkKCiAgICAjIENyaWEgdW1hIHNlZ3VuZGEgbWF0cml6IGNvbW8gY8OzcGlhIGRhIHByaW1laXJhLCBwb2lzIGEgcHJpbWVpcmEgc2Vyw6EgZGVzdHJ1w61kYSBjb21vIHBhcnRlIGRvIHByb2Nlc3NvIGRlIGVsaW1pbmHDp8OjbyBkZSBHYXVzcy4KICAgIGNvcGlhID0gW10KICAgIGZvciBsaW5oYSBpbiBtYXRyaXo6CiAgICAgICAgY29waWEuYXBwZW5kKGxpbmhhWzpdKQoKICAgICMgVmVyaWZpY2Egc2UgbsOjbyBow6EgbmVuaHVtIHplcm8gbmEgZGlhZ29uYWwgcHJpbmNpcGFsLgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgYWx0dXJhKToKICAgICAgICBpZiBtYXRyaXpbaV1baV0gPT0gMDoKICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcigiWmVybyBuYSBjb2x1bmEgcHJpbmNpcGFsLiIpCgogICAgIyBaZXJhIG9zIGNvZWZpY2llbnRlcyBmb3JhIGRhIGRpYWdvbmFsIHByaW5jaXBhbC4KICAgIGZvciBpIGluIHJhbmdlKDAsIGFsdHVyYSk6CiAgICAgICAgIyBSZWR1eiBvIGNvZWZpY2llbnRlIGRhIGRpYWdvbmFsIHByaW5jaXBhbCBwYXJhIDEgZSB0b2RvcyBvcyBvdXRyb3MgZGEgbWVzbWEgbGluaGEgbmEgbWVzbWEgcHJvcG9yw6fDo28uCiAgICAgICAgdmFsb3IgPSAxIC8gbWF0cml6W2ldW2ldCiAgICAgICAgZm9yIGNvbHVuYSBpbiByYW5nZSgwLCBsYXJndXJhKToKICAgICAgICAgICAgbWF0cml6W2ldW2NvbHVuYV0gKj0gdmFsb3IKCiAgICAgICAgIyBDb3JyaWdlIGFzIGRlbWFpcyBsaW5oYXMgYWJhaXhvLgogICAgICAgIGZvciBqIGluIHJhbmdlKGkgKyAxLCBhbHR1cmEpOgogICAgICAgICAgICAjIENvbmNlaXR1YWxtZW50ZSwgbyBjZXJ0byBzZXJpYSBwZXJjb3JyZXIgdG9kYXMgYXMgY29sdW5hcyBkYSBsaW5oYSBqLgogICAgICAgICAgICAjIE5vIGVudGFudG8sIHRvZGFzIGFzIGNvbHVuYXMgZGlmZXJlbnRlcyBkYSBjb2x1bmEgaSBlIGRhIMO6bHRpbWEgdGVyaWFtIHNldXMgdmFsb3JlcyBpbmFsdGVyYWRvcywKICAgICAgICAgICAgIyBlIHBvcnRhbnRvIHPDsyBwcmVjaXNhbW9zIG1leGVyIG5lc3NhcyBkdWFzIGNvbHVuYXMuCiAgICAgICAgICAgIG1hdHJpeltqXVstMV0gLT0gbWF0cml6W2ldWy0xXSAqIG1hdHJpeltqXVtpXQogICAgICAgICAgICBtYXRyaXpbal1baV0gPSAwCgogICAgIyBNb250YSBvIHJlc3VsdGFkbyBmaW5hbC4KICAgIHJldCA9IFtdCiAgICBmb3IgaSBpbiByYW5nZSgwLCBhbHR1cmEpOgogICAgICAgIHJldC5hcHBlbmQobWF0cml6W2ldWy0xXSkKCiAgICAjIFJldG9ybmEgYSBtYXRyaXogb3JpZ2luYWwgZSBvIHJlc3VsdGFkby4KICAgIHJldHVybiBjb3BpYSwgcmV0CgpkZWYgbW9zdHJhX21hdHJpeihtYXRyaXopOgogICAgYWx0dXJhID0gbGVuKG1hdHJpeikKICAgIGxhcmd1cmEgPSBsZW4obWF0cml6WzBdKQogICAgdCA9ICIiCiAgICBmb3IgaSBpbiByYW5nZSgwLCBhbHR1cmEpOgogICAgICAgIGZvciBqIGluIHJhbmdlKDAsIGxhcmd1cmEpOgogICAgICAgICAgICB2ID0gbWF0cml6W2ldW2pdCiAgICAgICAgICAgIGlmIGogPT0gbGFyZ3VyYSAtIDE6CiAgICAgICAgICAgICAgICB0ICs9IGYiID0ge3Y6ID42LjJmfSIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGogIT0gMDogdCArPSAiICIKICAgICAgICAgICAgICAgIGlmIHYgPT0gMDoKICAgICAgICAgICAgICAgICAgICB0ICs9ICIgIiAqICgxMiArIGxlbihzdHIoaiArIDEpKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcyA9ICIrIiBpZiB2ID4gMCBlbHNlICItIgogICAgICAgICAgICAgICAgICAgIHQgKz0gZiJ7c30ge2Ficyh2KTogPjYuMmZ9ICogeHtqICsgMX0iCiAgICAgICAgdCArPSAiXG4iCiAgICByZXR1cm4gdAoKZGVmIG1vc3RyYV92ZXRvcih2ZXRvcik6CiAgICBhdXggPSAiIgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHZldG9yKSk6CiAgICAgICAgYXV4ICs9IGYie3ZldG9yW2ldfSAqIHh7aSArIDF9XG4iCiAgICByZXR1cm4gYXV4CgptYXRyaXosIHJlc3VsdGFkbyA9IHNvbHVjYW9fdHJpYW5ndWxhcl9pbmZlcmlvcihbLTEzLCAxMywgMywgLTUsIC0xLCAtMSwgMywgMCwgMSwgMV0sIFstMTMsIDEzLCAtNywgNF0pCnByaW50KG1vc3RyYV9tYXRyaXoobWF0cml6KSkKcHJpbnQobW9zdHJhX3ZldG9yKHJlc3VsdGFkbykp