Last active
September 9, 2016 14:06
-
-
Save JuniorPolegato/3e1cea4eb79400569dcdc3c7cd49bc91 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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