Skip to content

Instantly share code, notes, and snippets.

@JuniorPolegato
Last active September 9, 2016 14:06
Show Gist options
  • Save JuniorPolegato/3e1cea4eb79400569dcdc3c7cd49bc91 to your computer and use it in GitHub Desktop.
Save JuniorPolegato/3e1cea4eb79400569dcdc3c7cd49bc91 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division, print_function
import numpy
import time
linhas = 20
colunas = 20
valor_borda = 10
valor_meio = 5
linha_ini_meio = 15
coluna_fim_meio = 5
def print_matriz(m):
for l in m:
print(end="| ")
for c in l:
if not isinstance(c, str):
c = "%.2f" % c
print("%+5s " % c, end="")
print("|")
inicio = time.time()
# Matriz com incógnitas
matriz = []
a = ord('a')
for linha in range(linhas):
matriz.append([])
letra_linha = chr(a + linha)
for coluna in range(colunas):
matriz[-1].append(letra_linha + chr(a + coluna))
# Preenchimento de borda na última linha e última coluna
for linha in matriz:
linha[-1] = valor_borda
matriz[-1] = [valor_borda] * colunas
# Preenchimento de meio da linha_ini_meio até coluna_fim_meio
for linha in range(linha_ini_meio - 1, linhas):
for coluna in range(coluna_fim_meio):
matriz[linha][coluna] = valor_meio
# Desenho da matriz
print_matriz(matriz)
# Lista de incógnitas
m = matriz
incognitas = []
for linha in range(linhas):
for coluna in range(colunas):
if isinstance(m[linha][coluna], str):
incognitas.append(m[linha][coluna])
print()
print(len(incognitas), 'incógnitas:', incognitas)
# Método de Cramer
# aa ab ac ad ae af ag ah ai 10
# ba bb bc bd be bf bg bh bi 10
# ca cb cc cd ce cf cg ch ci 10
# da db dc dd de df dg dh di 10
# 5 5 5 5 5 ef eg eh ei 10
# 5 5 5 5 5 ff fg fh fi 10
# 5 5 5 5 5 gf gg gh gi 10
# 5 5 5 5 5 hf hg hh hi 10
# 5 5 5 5 5 if ig ih ii 10
# 5 5 5 5 5 10 10 10 10 10
# Para cada equação no formato "if = (10 + 5 + ig + hf) / 4"
# faremos equivalência para "if -1/4.ig -1/4.hf = 25/4"
# "aa" será "aa = (ba + ab) / 2 => aa -1/2ba -1/2ab = 0"
# "ab" será "ab = (aa + bb + ac) / 3 => ab - 1/3aa - 1/3bb - 1/3ac = 0"
def coeficiente_ou_valor(elemento):
global coeficientes, incognitas, media, valor
if isinstance(elemento, str):
coeficientes[incognitas.index(elemento)] = -1/media
else:
valor += elemento / media
valores = []
cramer = []
for l in range(linhas):
for c in range(colunas):
# Se o elemento não for incógnita passa para o próximo
if not isinstance(m[l][c], str):
continue
# Divisor de média de acordo com a linha e a coluna
media = 4 - ((c == 0) + (l == 0) +
(c == colunas - 1) + (l == linhas - 1))
# Iniciando valor e coeficientes da equação em análise
valor = 0
coeficientes = [0] * len(incognitas)
# Coeficiente da incógnita atual é 1
coeficientes[incognitas.index(m[l][c])] = 1
# Calcular valor e coeficientes de acordo com a linha e a coluna
if c:
coeficiente_ou_valor(m[l][c-1])
if c < colunas - 1:
coeficiente_ou_valor(m[l][c+1])
if l:
coeficiente_ou_valor(m[l-1][c])
if l < linhas - 1:
coeficiente_ou_valor(m[l+1][c])
# Adicionar a linha do coeficiente na matriz de Cramer e valores
cramer.append(coeficientes)
valores.append(valor)
print()
print("----- Coeficientes -----")
print_matriz(cramer)
print()
print("----- Valores -----")
print_matriz(zip(valores))
# Determinante da matriz do coeficientes de Cramer
d = numpy.linalg.det(cramer)
print()
print('Determinante dos coeficientes:', d)
# Transpor a matriz dos coeficientes de Cramer
# facilitando a troca da coluna de coeficientes por valores
# para obter os resultados
cramer = zip(*cramer)
resultados = {}
print()
for i, incognita in enumerate(incognitas):
# Trocar a coluna do coeficiente atual pelos valores
cramer_i = zip(*(cramer[:i] + [valores] + cramer[i + 1:]))
resultados[incognita] = numpy.linalg.det(cramer_i) / d
print("%s = %.16f" % (incognita, resultados[incognita]))
# Apresentando a matriz final
print()
print_matriz(m)
for l in range(linhas):
for c in range(colunas):
if isinstance(m[l][c], str):
m[l][c] = resultados[m[l][c]]
print()
print_matriz(m)
# Tempo de cálculo
fim = time.time()
print()
print("Tempo:", fim - inicio)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment