File size: 2,089 Bytes
4bd99f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import re
import sympy as sp
import random

class LinearSolverEngine:
    def __init__(self, lhs, rhs, n=3):
        self.lhs_raw = lhs
        self.rhs_raw = rhs
        self.n = n

    def _clean_string(self, text):
        text = text.lower().replace(" ", "")
        text = re.sub(r'(\d)([a-z])', r'\1*\2', text)
        return text

    def run(self):
        lhs_c = self._clean_string(self.lhs_raw)
        rhs_c = self._clean_string(self.rhs_raw)
        lhs_expr = sp.sympify(lhs_c)
        rhs_expr = sp.sympify(rhs_c)

        full_eq = sp.Eq(lhs_expr, rhs_expr)
        vars_found = sorted(list(full_eq.free_symbols), key=lambda x: x.name)

        if len(vars_found) < 2:
            return "Please enter an equation with 2 variables (e.g., x - v = 6)", [], "N/A"

        input_var = vars_found[0] 
        target_var = vars_found[1] 

        points = [1, 3, 5]
        random.shuffle(points)

        solutions_data = []
        steps = f"Given equation: {self.lhs_raw} = {self.rhs_raw}\n\n"

        for i, val in enumerate(points, 1):

            subbed_eq = full_eq.subs(input_var, val)
            
            plugged_in_str = re.sub(rf'\b{input_var}\b', f"({val})", lhs_c)
            

            target_value = sp.solve(subbed_eq, target_var)[0]
            
            isolated_rhs = sp.solve(subbed_eq, target_var, dict=True)[0][target_var]
            
            steps += f"Solution number {i}:\n"
            steps += f"Step A: Let's take {input_var} as {val}\n"
            steps += f"Step B: Plug it in: {plugged_in_str} = {rhs_c}\n"
            steps += f"Step C: Simplify and solve for {target_var}...\n"
            
            # The "Human-like" math breakdown
            steps += f"{target_var} = {isolated_rhs}\n" 
            steps += f"Result: When {input_var} = {val}, then {target_var} = {target_value}\n"
            steps += f"Point: ({val}, {target_value})\n\n"

            solutions_data.append((float(val), float(target_value)))

        return steps, solutions_data, input_var