-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
80 lines (58 loc) · 2.03 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Author: Samantha Bianco
import numpy as np
def validate(eq_str, eq_num):
if eq_str.count('=') != 1:
return False
left = eq_str.partition('=')[0].strip()
try:
right = float(eq_str.partition('=')[2].strip())
except SyntaxError:
return False
if not parse(left, eq_num):
return False
B[eq_num][0] = right
return True
# Add in support for:
# parentheses
# Multiple terms with same variable
# Variable terms on both sides of equation
def parse(left_side, eq_num):
token = ''
for ch in left_side:
if ch.isnumeric() or ch == '-' or ch == '.':
token += ch
elif ch in var_lst:
idx = var_lst.index(ch)
try:
A[eq_num][idx] = float(token)
except SyntaxError:
return False
token = ''
elif ch == ' ' or ch == '+':
continue
else:
return False
return True
if __name__ == '__main__':
print('\nWelcome to the Systems of Linear Equations (SOLE) Solver.\n')
num_vars = int(input('Enter the number of variables in the system: \n'))
A = np.zeros([num_vars, num_vars])
B = np.zeros([num_vars, 1])
var_lst = []
for i in range(num_vars):
var = input(f'Enter variable #{i + 1}: \n')
while len(var) != 1 or not var.isalpha():
var = input('Variable should be a single alphabetic character. Please enter a valid variable: \n')
var_lst.append(var)
for i in range(num_vars):
form = ''
for j in range(num_vars):
form += f'{chr(65 + j)}{var_lst[j]} '
form += '+ ' if j != num_vars - 1 else f'= {chr(66 + j)}'
equation = input(f'Enter equation #{i + 1} ({form}): \n')
while not validate(equation, i):
equation = input(f'Equation should be in the form {form}. Please enter a valid equation: \n')
solution = np.linalg.solve(A, B)
print('Solution:\n')
for i in range(num_vars):
print(f'{var_lst[i]} = {solution[i][0]}')