import re
import numpy as np
import time
import math
DEBUG_TEXT = False
TIME_DECIMAL_PLACES = 3
def parse_equation(equation):
pattern = r'([+-]?\d*)\s*([a-zA-Z]?)'
lhs, rhs = equation.split('=')
rhs = int(rhs.strip())
terms = re.findall(pattern, lhs)
if DEBUG_TEXT: print(terms)
coefficients = {}
for coeff, var in terms:
if not (coeff or var):
continue
if DEBUG_TEXT: print(coeff,var,sep=',',end='!')
if coeff in {'','+'}:
coefficients[var] = 1
elif coeff == '-':
coefficients[var] = -1
else:
coefficients[var] = int(coeff)
if DEBUG_TEXT: print(coeff, coefficients[var],sep=',',end="$")
return coefficients, rhs
def convert_to_matrix(equations):
variables = set()
for eq in equations:
eq = "".join(eq.split(" "))
coefficients, _ = parse_equation(eq)
variables.update(coefficients.keys())
variables = sorted(variables)
A = []
b = []
for eq in equations:
coefficients, rhs = parse_equation(eq)
row = [coefficients.get(var, 0) for var in variables]
A.append(row)
b.append(rhs)
return np.array(A), np.array(b), variables
equations = """2a - b + 3c + d - e + 2f - g + h + j = 5
-a + 4b - c + 2d + e - f + g + i - 2j = 3
3a + b - 2c + d + 4e - f + 2g + h - i + j = 10
a - b + c + 3d - e + f - 2g + h + i + 2j = 0
-2a + 3b + c - d + e + f + g - 3h + i - j = -4
a + b - c + d + e + f - g + h - i + j = 7
4a - b + c + d + e - f + g + 2h - i + j = 12
-a + b + c - 2d + e + f + 3g - h + i - j = 1
a + 2b - 3c + d + e - f + g + h - 2i + j = 6
a - b + c + d - e + f - g + h + i + j = 2"""
list_eq = equations.split("\n")
print("\n".join(list_eq))
print()
start = time.time()
A, b, v = convert_to_matrix(list_eq)
s = np.linalg.solve(A,b)
if DEBUG_TEXT:
print(A, b, v, s,sep="")
print()
end = time.time()
for var,val in zip(v,s):
print(var,'=',val)
time_elapsed = end-start
if time_elapsed < 1:
dec_places = math.floor(math.log(time_elapsed, 10))
rounded_time = round(time_elapsed, -dec_places-np.sign(dec_places)*(TIME_DECIMAL_PLACES-1))
else:
rounded_time = round(time_elapsed, TIME_DECIMAL_PLACES)
print(f"\nTime: {rounded_time} seconds")