Spaces:
Runtime error
Runtime error
feat: add Gradio interfaces for cubic and polynomial equation solving; update quadratic solver to use numpy
Browse files
maths/equations/equations_tab.py
CHANGED
@@ -1,10 +1,11 @@
|
|
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 |
)
|
|
|
1 |
import gradio as gr
|
2 |
from maths.equations.solve_quadratic import solve_quadratic_interface, quadratic_visualizer_interface
|
3 |
+
from maths.equations.solve_cubic import cubic_solver_interface
|
4 |
+
from maths.equations.solve_poly import poly_solver_interface
|
5 |
|
|
|
6 |
|
7 |
equations_tab = gr.TabbedInterface(
|
8 |
+
[solve_quadratic_interface, quadratic_visualizer_interface, cubic_solver_interface, poly_solver_interface],
|
9 |
+
["Quadratic Solver", "Quadratic Visualizer", "Cubic Solver", "Polynomial Solver"],
|
10 |
title="Equations"
|
11 |
)
|
maths/equations/solve_cubic.py
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import numpy as np
|
3 |
+
|
4 |
+
def solve_cubic(a, b, c, d):
|
5 |
+
"""
|
6 |
+
Solve cubic equation: a*x^3 + b*x^2 + c*x + d = 0
|
7 |
+
Returns a tuple of three roots (complex or real).
|
8 |
+
"""
|
9 |
+
if a == 0:
|
10 |
+
# Degenerates to quadratic
|
11 |
+
from .solve_quadratic import solve_quadratic
|
12 |
+
result = solve_quadratic(b, c, d, return_format="dict")
|
13 |
+
roots = result["roots"]
|
14 |
+
return (roots[0], roots[1], None)
|
15 |
+
# Use numpy.roots for cubic
|
16 |
+
roots = np.roots([a, b, c, d])
|
17 |
+
# Ensure three roots (may be complex)
|
18 |
+
if len(roots) < 3:
|
19 |
+
roots = tuple(list(roots) + [None]*(3-len(roots)))
|
20 |
+
else:
|
21 |
+
roots = tuple(roots)
|
22 |
+
return roots
|
23 |
+
|
24 |
+
def cubic_solver_wrapper(a, b, c, d):
|
25 |
+
roots = solve_cubic(a, b, c, d)
|
26 |
+
output = f"Equation: {a}x³ + {b}x² + {c}x + {d} = 0\n\n"
|
27 |
+
for i, root in enumerate(roots):
|
28 |
+
if root is not None:
|
29 |
+
if np.isreal(root):
|
30 |
+
output += f"Root {i+1}: {root.real}\n"
|
31 |
+
else:
|
32 |
+
output += f"Root {i+1}: {root}\n"
|
33 |
+
return output
|
34 |
+
|
35 |
+
cubic_solver_interface = gr.Interface(
|
36 |
+
fn=cubic_solver_wrapper,
|
37 |
+
inputs=[
|
38 |
+
gr.Number(label="a (coefficient of x³)"),
|
39 |
+
gr.Number(label="b (coefficient of x²)"),
|
40 |
+
gr.Number(label="c (coefficient of x)"),
|
41 |
+
gr.Number(label="d (constant)")
|
42 |
+
],
|
43 |
+
outputs="text",
|
44 |
+
title="Cubic Equation Solver",
|
45 |
+
description="Solve ax³ + bx² + cx + d = 0"
|
46 |
+
)
|
maths/equations/solve_poly.py
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
|
3 |
+
def solve_polynomial(coeffs):
|
4 |
+
"""
|
5 |
+
Find roots of a polynomial with given coefficients.
|
6 |
+
coeffs: list or array-like, highest degree first (e.g., [a, b, c, d, ...])
|
7 |
+
Returns a numpy array of roots (complex or real).
|
8 |
+
"""
|
9 |
+
if not coeffs or all(c == 0 for c in coeffs):
|
10 |
+
raise ValueError("Coefficient list must not be empty or all zeros.")
|
11 |
+
return np.roots(coeffs)
|
12 |
+
|
13 |
+
def polynomial_solver_interface(coeffs):
|
14 |
+
"""
|
15 |
+
Gradio wrapper for solving higher order polynomials.
|
16 |
+
coeffs: comma-separated string of coefficients, highest degree first.
|
17 |
+
"""
|
18 |
+
import numpy as np
|
19 |
+
try:
|
20 |
+
coeff_list = [float(c) for c in coeffs.split(",") if c.strip() != ""]
|
21 |
+
if not coeff_list:
|
22 |
+
return "Please enter at least one coefficient."
|
23 |
+
roots = solve_polynomial(coeff_list)
|
24 |
+
output = f"Polynomial coefficients: {coeff_list}\n\n"
|
25 |
+
for i, root in enumerate(roots):
|
26 |
+
if np.isreal(root):
|
27 |
+
output += f"Root {i+1}: {root.real}\n"
|
28 |
+
else:
|
29 |
+
output += f"Root {i+1}: {root}\n"
|
30 |
+
return output
|
31 |
+
except Exception as e:
|
32 |
+
return f"Error: {e}"
|
33 |
+
|
34 |
+
poly_solver_interface = gr.Interface(
|
35 |
+
fn=polynomial_solver_interface,
|
36 |
+
inputs=gr.Textbox(label="Coefficients (comma-separated, highest degree first)", placeholder="e.g. 1, 0, -2, -8"),
|
37 |
+
outputs="text",
|
38 |
+
title="Polynomial Equation Solver",
|
39 |
+
description="Find roots of any polynomial. Enter coefficients separated by commas (highest degree first)."
|
40 |
+
)
|
maths/equations/solve_quadratic.py
CHANGED
@@ -3,9 +3,9 @@ Solve the quadratic equation ax^2 + bx + c = 0.
|
|
3 |
"""
|
4 |
import cmath
|
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:
|
@@ -31,13 +31,21 @@ def solve_quadratic(a: float, b: float, c: float, return_format: str = "string")
|
|
31 |
"discriminant": delta
|
32 |
}
|
33 |
if return_format == "dict":
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
if
|
38 |
-
|
39 |
-
|
40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
if delta > 0:
|
42 |
x1 = (-b + delta**0.5) / (2*a)
|
43 |
x2 = (-b - delta**0.5) / (2*a)
|
|
|
3 |
"""
|
4 |
import cmath
|
5 |
from fractions import Fraction
|
|
|
6 |
import sympy as sp
|
7 |
import gradio as gr
|
8 |
+
import numpy as np
|
9 |
|
10 |
def solve_quadratic(a: float, b: float, c: float, return_format: str = "string"):
|
11 |
if a == 0:
|
|
|
31 |
"discriminant": delta
|
32 |
}
|
33 |
if return_format == "dict":
|
34 |
+
# Use numpy.roots for quadratic
|
35 |
+
roots = np.roots([a, b, c])
|
36 |
+
# Ensure two roots (may be complex)
|
37 |
+
if len(roots) == 1:
|
38 |
+
roots = (roots[0], None)
|
39 |
+
else:
|
40 |
+
roots = tuple(roots)
|
41 |
+
# Try to convert to Fraction if real
|
42 |
+
roots_fmt = []
|
43 |
+
for r in roots:
|
44 |
+
if r is not None and np.isreal(r):
|
45 |
+
roots_fmt.append(Fraction(r.real).limit_denominator())
|
46 |
+
else:
|
47 |
+
roots_fmt.append(r)
|
48 |
+
return {"roots": tuple(roots_fmt), "vertex": vertex}
|
49 |
if delta > 0:
|
50 |
x1 = (-b + delta**0.5) / (2*a)
|
51 |
x2 = (-b - delta**0.5) / (2*a)
|