fork download
  1. # Autor - https://pt.stackoverflow.com/users/132
  2. def solucao_triangular_inferior(lista_1, lista_2):
  3. # Descobre a altura e a largura e verifica se as listas tem o tamanho certo.
  4. altura = len(lista_2)
  5. largura = altura + 1
  6. if altura * (altura + 1) / 2 != len(lista_1):
  7. raise IndexError("A segunda lista não tem a quantidade correta de termos.")
  8.  
  9. # Constrói a matriz a partir das listas. A última coluna serão os valores de lista_2.
  10. matriz = []
  11. n = 0
  12. for i in range(0, altura):
  13. linha = []
  14. for j in range(0, i + 1):
  15. linha.append(lista_1[n])
  16. n += 1
  17. for j in range(i + 1, altura):
  18. linha.append(0)
  19. matriz.append(linha)
  20. linha.append(lista_2[i])
  21.  
  22. # Cria uma segunda matriz como cópia da primeira, pois a primeira será destruída como parte do processo de eliminação de Gauss.
  23. copia = []
  24. for linha in matriz:
  25. copia.append(linha[:])
  26.  
  27. # Verifica se não há nenhum zero na diagonal principal.
  28. for i in range(0, altura):
  29. if matriz[i][i] == 0:
  30. raise IndexError("Zero na coluna principal.")
  31.  
  32. # Zera os coeficientes fora da diagonal principal.
  33. for i in range(0, altura):
  34. # Reduz o coeficiente da diagonal principal para 1 e todos os outros da mesma linha na mesma proporção.
  35. valor = 1 / matriz[i][i]
  36. for coluna in range(0, largura):
  37. matriz[i][coluna] *= valor
  38.  
  39. # Corrige as demais linhas abaixo.
  40. for j in range(i + 1, altura):
  41. # Conceitualmente, o certo seria percorrer todas as colunas da linha j.
  42. # No entanto, todas as colunas diferentes da coluna i e da última teriam seus valores inalterados,
  43. # e portanto só precisamos mexer nessas duas colunas.
  44. matriz[j][-1] -= matriz[i][-1] * matriz[j][i]
  45. matriz[j][i] = 0
  46.  
  47. # Monta o resultado final.
  48. ret = []
  49. for i in range(0, altura):
  50. ret.append(matriz[i][-1])
  51.  
  52. # Retorna a matriz original e o resultado.
  53. return copia, ret
  54.  
  55. def mostra_matriz(matriz):
  56. altura = len(matriz)
  57. largura = len(matriz[0])
  58. t = ""
  59. for i in range(0, altura):
  60. for j in range(0, largura):
  61. v = matriz[i][j]
  62. if j == largura - 1:
  63. t += f" = {v: >6.2f}"
  64. else:
  65. if j != 0: t += " "
  66. if v == 0:
  67. t += " " * (12 + len(str(j + 1)))
  68. else:
  69. s = "+" if v > 0 else "-"
  70. t += f"{s} {abs(v): >6.2f} * x{j + 1}"
  71. t += "\n"
  72. return t
  73.  
  74. def mostra_vetor(vetor):
  75. aux = ""
  76. for i in range(0, len(vetor)):
  77. aux += f"{vetor[i]} * x{i + 1}\n"
  78. return aux
  79.  
  80. matriz, resultado = solucao_triangular_inferior([-13, 13, 3, -5, -1, -1, 3, 0, 1, 1], [-13, 13, -7, 4])
  81. print(mostra_matriz(matriz))
  82. print(mostra_vetor(resultado))
Success #stdin #stdout 0.02s 9108KB
stdin
Standard input is empty
stdout
-  13.00 * x1                                           = -13.00
+  13.00 * x1 +   3.00 * x2                             =  13.00
-   5.00 * x1 -   1.00 * x2 -   1.00 * x3               =  -7.00
+   3.00 * x1               +   1.00 * x3 +   1.00 * x4 =   4.00

1.0 * x1
0.0 * x2
2.0 * x3
-1.0 * x4