spagestic commited on
Commit
6560704
·
1 Parent(s): 0454409

feat: implement Gradio interfaces for quadratic equation solving and visualization; remove old interfaces

Browse files
maths/equations/equations_interface.py CHANGED
@@ -25,24 +25,6 @@ def quadratic_solver_wrapper(a, b, c, return_format):
25
  else:
26
  return result
27
 
28
- solve_quadratic_interface = gr.Interface(
29
- fn=quadratic_solver_wrapper,
30
- inputs=[
31
- gr.Number(label="a (coefficient of x²)"),
32
- gr.Number(label="b (coefficient of x)"),
33
- gr.Number(label="c (constant)"),
34
- gr.Radio(
35
- choices=["string", "dict", "surd"],
36
- value="dict",
37
- label="Output Format",
38
- info="'string' for text output, 'dict' for formatted output, 'surd' for exact roots"
39
- )
40
- ],
41
- outputs="text",
42
- title="Quadratic Equation Solver",
43
- description="Solve ax² + bx + c = 0 and find vertex"
44
- )
45
-
46
  def plot_quadratic(a, b, c):
47
  import numpy as np
48
  import matplotlib.pyplot as plt
@@ -104,23 +86,3 @@ def plot_quadratic(a, b, c):
104
  ax.set_title(f'Graph of f(x) = {c} (Constant)')
105
  ax.legend()
106
  return fig
107
-
108
- quadratic_visualizer_interface = gr.Interface(
109
- fn=plot_quadratic,
110
- inputs=[
111
- gr.Number(label="a (coefficient of x²)", value=1),
112
- gr.Number(label="b (coefficient of x)", value=0),
113
- gr.Number(label="c (constant)", value=0)
114
- ],
115
- outputs=gr.Plot(),
116
- title="Quadratic Function Visualizer",
117
- description="Visualize the graph of a quadratic function f(x) = ax² + bx + c with its vertex and roots"
118
- )
119
-
120
- equations_app = gr.TabbedInterface(
121
- [solve_quadratic_interface, quadratic_visualizer_interface],
122
- ["Quadratic Solver", "Quadratic Visualizer"]
123
- )
124
-
125
- if __name__ == "__main__":
126
- equations_app.launch()
 
25
  else:
26
  return result
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  def plot_quadratic(a, b, c):
29
  import numpy as np
30
  import matplotlib.pyplot as plt
 
86
  ax.set_title(f'Graph of f(x) = {c} (Constant)')
87
  ax.legend()
88
  return fig
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
maths/equations/equations_tab.py CHANGED
@@ -1,6 +1,10 @@
1
  import gradio as gr
2
- from maths.equations.equations_interface import equations_app, solve_quadratic_interface
3
- from maths.algebra.solve_linear_equation import solve_linear_equation_interface
4
- from maths.geometry.trigonometry_interface import solve_trig_equations_interface
5
 
6
- equations_tab = equations_app # Only include the composite equations_app in the equations tab to avoid duplicate Gradio blocks
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ from maths.equations.solve_quadratic import solve_quadratic_interface, quadratic_visualizer_interface
 
 
3
 
4
+ # You can add more equation-related interfaces here as needed
5
+
6
+ equations_tab = gr.TabbedInterface(
7
+ [solve_quadratic_interface, quadratic_visualizer_interface],
8
+ ["Quadratic Solver", "Quadratic Visualizer"],
9
+ title="Equations"
10
+ )
maths/equations/solve_quadratic.py CHANGED
@@ -5,6 +5,7 @@ import cmath
5
  from fractions import Fraction
6
  import math
7
  import sympy as sp
 
8
 
9
  def solve_quadratic(a: float, b: float, c: float, return_format: str = "string"):
10
  if a == 0:
@@ -56,4 +57,118 @@ def solve_quadratic(a: float, b: float, c: float, return_format: str = "string")
56
  else:
57
  real_part = -b / (2*a)
58
  imag_part = (-delta)**0.5 / (2*a)
59
- return f"Two complex roots: x1 = {real_part} + {imag_part}i, x2 = {real_part} - {imag_part}i\nVertex at: {vertex}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  from fractions import Fraction
6
  import math
7
  import sympy as sp
8
+ import gradio as gr
9
 
10
  def solve_quadratic(a: float, b: float, c: float, return_format: str = "string"):
11
  if a == 0:
 
57
  else:
58
  real_part = -b / (2*a)
59
  imag_part = (-delta)**0.5 / (2*a)
60
+ return f"Two complex roots: x1 = {real_part} + {imag_part}i, x2 = {real_part} - {imag_part}i\nVertex at: {vertex}"
61
+
62
+ def quadratic_solver_wrapper(a, b, c, return_format):
63
+ result = solve_quadratic(a, b, c, return_format=return_format)
64
+ if return_format == "dict":
65
+ if "error" in result:
66
+ return result["error"]
67
+ roots = result["roots"]
68
+ vertex = result["vertex"]
69
+ output = ""
70
+ sign_b = "+" if b >= 0 else ""
71
+ sign_c = "+" if c >= 0 else ""
72
+ output += f"Equation: {a}x² {sign_b} {b}x {sign_c} {c} = 0\n\n"
73
+ if roots[1] is None:
74
+ output += f"Root: {roots[0]}\n"
75
+ else:
76
+ output += f"Root 1: {roots[0]}\n"
77
+ output += f"Root 2: {roots[1]}\n"
78
+ if vertex:
79
+ output += f"\nVertex: ({vertex[0]}, {vertex[1]})"
80
+ return output
81
+ else:
82
+ return result
83
+
84
+ solve_quadratic_interface = gr.Interface(
85
+ fn=quadratic_solver_wrapper,
86
+ inputs=[
87
+ gr.Number(label="a (coefficient of x²)"),
88
+ gr.Number(label="b (coefficient of x)"),
89
+ gr.Number(label="c (constant)"),
90
+ gr.Radio(
91
+ choices=["string", "dict", "surd"],
92
+ value="dict",
93
+ label="Output Format",
94
+ info="'string' for text output, 'dict' for formatted output, 'surd' for exact roots"
95
+ )
96
+ ],
97
+ outputs="text",
98
+ title="Quadratic Equation Solver",
99
+ description="Solve ax² + bx + c = 0 and find vertex"
100
+ )
101
+
102
+ def plot_quadratic(a, b, c):
103
+ import numpy as np
104
+ import matplotlib.pyplot as plt
105
+ result = solve_quadratic(a, b, c, return_format="dict")
106
+ vertex_x = -b / (2*a) if a != 0 else 0
107
+ vertex_y = c - (b**2 / (4*a)) if a != 0 else 0
108
+ fig, ax = plt.subplots(figsize=(8, 6))
109
+ if a != 0:
110
+ if "roots" in result and result["roots"][0] is not None and result["roots"][1] is not None:
111
+ root1 = result["roots"][0].real if hasattr(result["roots"][0], "real") else float(result["roots"][0])
112
+ root2 = result["roots"][1].real if hasattr(result["roots"][1], "real") else float(result["roots"][1])
113
+ x_min = min(root1, root2, vertex_x) - 2
114
+ x_max = max(root1, root2, vertex_x) + 2
115
+ else:
116
+ x_min = vertex_x - 5
117
+ x_max = vertex_x + 5
118
+ x = np.linspace(x_min, x_max, 1000)
119
+ y = a * (x**2) + b * x + c
120
+ ax.plot(x, y, 'b-', label=f'f(x) = {a}x² + {b}x + {c}')
121
+ ax.plot(vertex_x, vertex_y, 'ro', label=f'Vertex: ({vertex_x:.2f}, {vertex_y:.2f})')
122
+ if "roots" in result:
123
+ roots = result["roots"]
124
+ if roots[0] is not None and (isinstance(roots[0], (int, float)) or (hasattr(roots[0], "imag") and roots[0].imag == 0)):
125
+ root1 = float(roots[0].real if hasattr(roots[0], "real") else roots[0])
126
+ ax.plot(root1, 0, 'go', label=f'Root 1: {root1:.2f}')
127
+ if roots[1] is not None and (isinstance(roots[1], (int, float)) or (hasattr(roots[1], "imag") and roots[1].imag == 0)):
128
+ root2 = float(roots[1].real if hasattr(roots[1], "real") else roots[1])
129
+ ax.plot(root2, 0, 'go', label=f'Root 2: {root2:.2f}')
130
+ ax.axhline(y=0, color='k', linestyle='-', alpha=0.3)
131
+ ax.axvline(x=0, color='k', linestyle='-', alpha=0.3)
132
+ ax.grid(True, alpha=0.3)
133
+ ax.set_xlabel('x')
134
+ ax.set_ylabel('f(x)')
135
+ ax.set_title(f'Graph of f(x) = {a}x² + {b}x + {c}')
136
+ ax.legend()
137
+ else:
138
+ if b != 0:
139
+ x = np.linspace(-5, 5, 100)
140
+ y = b * x + c
141
+ ax.plot(x, y, 'b-', label=f'f(x) = {b}x + {c} (Linear)')
142
+ root = -c/b
143
+ ax.plot(root, 0, 'go', label=f'Root: {root:.2f}')
144
+ ax.axhline(y=0, color='k', linestyle='-', alpha=0.3)
145
+ ax.axvline(x=0, color='k', linestyle='-', alpha=0.3)
146
+ ax.grid(True, alpha=0.3)
147
+ ax.set_xlabel('x')
148
+ ax.set_ylabel('f(x)')
149
+ ax.set_title(f'Graph of f(x) = {b}x + {c} (Linear)')
150
+ ax.legend()
151
+ else:
152
+ x = np.linspace(-5, 5, 100)
153
+ y = c * np.ones_like(x)
154
+ ax.plot(x, y, 'b-', label=f'f(x) = {c} (Constant)')
155
+ ax.axhline(y=0, color='k', linestyle='-', alpha=0.3)
156
+ ax.axvline(x=0, color='k', linestyle='-', alpha=0.3)
157
+ ax.grid(True, alpha=0.3)
158
+ ax.set_xlabel('x')
159
+ ax.set_ylabel('f(x)')
160
+ ax.set_title(f'Graph of f(x) = {c} (Constant)')
161
+ ax.legend()
162
+ return fig
163
+
164
+ quadratic_visualizer_interface = gr.Interface(
165
+ fn=plot_quadratic,
166
+ inputs=[
167
+ gr.Number(label="a (coefficient of x²)", value=1),
168
+ gr.Number(label="b (coefficient of x)", value=0),
169
+ gr.Number(label="c (constant)", value=0)
170
+ ],
171
+ outputs=gr.Plot(),
172
+ title="Quadratic Function Visualizer",
173
+ description="Visualize the graph of a quadratic function f(x) = ax² + bx + c with its vertex and roots"
174
+ )
ode_solution_plot.png ADDED