File size: 2,943 Bytes
2f94119
 
 
 
 
 
 
 
 
 
776f525
2f94119
776f525
2f94119
776f525
 
 
 
 
 
2f94119
 
 
776f525
2f94119
 
776f525
 
 
2f94119
776f525
 
 
 
2f94119
776f525
 
 
2f94119
 
 
776f525
2f94119
 
776f525
 
 
2f94119
 
776f525
2f94119
776f525
 
2f94119
776f525
 
2f94119
776f525
2f94119
 
776f525
 
 
2f94119
 
776f525
2f94119
 
776f525
 
2f94119
 
776f525
 
2f94119
 
 
 
 
776f525
 
 
2f94119
776f525
2f94119
 
776f525
2f94119
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
81
82
83
84
85
86
87
88
89
\
import gradio as gr
import sympy as sp

TITLE = "LanguageBridge — Math Fast Agent (SymPy)"

def solve_math(q: str):
    q = (q or "").strip()
    if not q:
        return "請輸入算式或方程,例如:2x+3=11;或:sin(x)**2 + cos(x)**2;或:factor(x**2-9)"

    try:
        # 情境 A:含 '=' → 視為(可能多條)方程,支援分號/換行分隔
        if "=" in q:
            # 將多行與分號斷開
            parts = []
            for seg in q.split(";"):
                parts += [s.strip() for s in seg.split("\n")]
            parts = [s for s in parts if s]

            eqs = []
            syms = set()
            for s in parts:
                if "=" not in s:
                    continue
                left, right = s.split("=", 1)
                L = sp.sympify(left)
                R = sp.sympify(right)
                eq = sp.Eq(L, R)
                eqs.append(eq)
                syms |= L.free_symbols | R.free_symbols

            if not eqs:
                return "沒有可解析的方程式。"
            if not syms:
                syms = {sp.symbols("x")}

            # 解聯立(回傳 dict 列表)
            sol = sp.solve(eqs, list(syms), dict=True)
            if not sol:
                return "無解或需要更多條件。"

            lines = []
            for i, s in enumerate(sol, 1):
                lines.append(
                    "解 {}: ".format(i) + ", ".join(f"{k} = {sp.simplify(v)}" for k, v in s.items())
                )
            return "\n".join(lines)

        # 情境 B:純表達式 → 嘗試簡化、因式、微分、積分
        expr = sp.sympify(q)
        out = []

        try:
            simp = sp.simplify(expr)
            out.append(f"簡化:{simp}")
        except Exception:
            pass

        try:
            fac = sp.factor(expr)
            if fac != expr:
                out.append(f"因式分解:{fac}")
        except Exception:
            pass

        try:
            x = list(expr.free_symbols)[0] if expr.free_symbols else sp.symbols("x")
            out.append(f"對 {x} 微分:{sp.diff(expr, x)}")
            out.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
        except Exception:
            pass

        return "\n".join(out) if out else f"結果:{expr}"

    except Exception as e:
        return f"解析失敗:{e}"

with gr.Blocks(title=TITLE) as demo:
    gr.Markdown(f"## {TITLE}\n- 貼上**算式/方程**(可多行;或用分號 `;` 分隔聯立)\n- 範例:`2x+3=11`、`x+y=3; x-y=1`、`sin(x)**2 + cos(x)**2`、`factor(x**2-9)`")
    q = gr.Textbox(lines=6, label="題目 / 算式(可含聯立方程)")
    out = gr.Textbox(lines=12, label="輸出")
    btn = gr.Button("送出 🚀")
    btn.click(solve_math, q, out)

if __name__ == "__main__":
    # 在 Colab 預覽:一定要 share=True 才會印出 public URL
    demo.launch(share=True)