ldx967 commited on
Commit
d79b285
·
verified ·
1 Parent(s): 710a94d

Upload 3 files

Browse files
Files changed (3) hide show
  1. app.py +66 -0
  2. function_generator.py +99 -0
  3. requirements.txt +2 -0
app.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from function_generator import FunctionGenerator
3
+
4
+ def generate_function(sequence_str):
5
+ try:
6
+ sequence = [float(x.strip()) for x in sequence_str.split(',')]
7
+ generator = FunctionGenerator()
8
+ symbol_expr, general_expr, latex_expr = generator.generate(sequence)
9
+
10
+ return (
11
+ f"y = {str(symbol_expr)}",
12
+ general_expr,
13
+ f"$$\\Large {latex_expr}$$"
14
+ )
15
+ except Exception as err:
16
+ return f"错误: {str(err)}", "", ""
17
+
18
+ # 创建Gradio界面
19
+ with gr.Blocks() as demo:
20
+ gr.Markdown("## 数学函数生成器")
21
+
22
+ with gr.Row():
23
+ with gr.Column():
24
+ # 使用文本框输入
25
+ sequence_input = gr.Textbox(
26
+ label="输入数列(用逗号分隔)",
27
+ placeholder="例如: 1, 2, 4, 8, 16",
28
+ lines=1
29
+ )
30
+
31
+ # 示例按钮
32
+ with gr.Row():
33
+ example_btn1 = gr.Button("示例1: 1, 2, 4, 8, 16")
34
+ example_btn2 = gr.Button("示例2: 1, 3, 5, 7, 9")
35
+ example_btn3 = gr.Button("示例3: 1, 4, 9, 16, 25")
36
+
37
+ # 示例按钮点击事件
38
+ example_btn1.click(lambda: "1,2,4,8,16", outputs=sequence_input)
39
+ example_btn2.click(lambda: "1,3,5,7,9", outputs=sequence_input)
40
+ example_btn3.click(lambda: "1,4,9,16,25", outputs=sequence_input)
41
+
42
+ with gr.Row():
43
+ generate_btn = gr.Button("生成函数", variant="primary")
44
+
45
+ with gr.Row():
46
+ with gr.Column():
47
+ symbol_expr_output = gr.Textbox(label="符号表达式", interactive=False)
48
+ general_expr_output = gr.Textbox(label="一般数学表达式", interactive=False)
49
+ latex_expr_output = gr.Markdown(label="渲染的数学公式")
50
+
51
+ # 实时更新
52
+ sequence_input.change(
53
+ fn=generate_function,
54
+ inputs=sequence_input,
55
+ outputs=[symbol_expr_output, general_expr_output, latex_expr_output]
56
+ )
57
+
58
+ # 生成按钮点击事件
59
+ generate_btn.click(
60
+ fn=generate_function,
61
+ inputs=sequence_input,
62
+ outputs=[symbol_expr_output, general_expr_output, latex_expr_output]
63
+ )
64
+
65
+ if __name__ == "__main__":
66
+ demo.launch()
function_generator.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy as sp
2
+
3
+ class FunctionGenerator:
4
+ def __init__(self):
5
+ self.x = sp.Symbol('x')
6
+
7
+ def generate(self, sequence):
8
+ """生成函数表达式
9
+
10
+ 参数:
11
+ sequence (list): 输入数列
12
+
13
+ 返回:
14
+ tuple: (符号表达式, 一般数学表达式, LaTeX表达式)
15
+ """
16
+ try:
17
+ sequence = [float(x) for x in sequence]
18
+ if len(sequence) < 2:
19
+ raise ValueError("至少需要两个数来生成函数")
20
+
21
+ # 生成符号表达式
22
+ symbol_expr = self._generate_symbolic_expression(sequence)
23
+
24
+ # 生成一般数学表达式
25
+ general_expr = self._generate_general_expression(symbol_expr)
26
+
27
+ # 生成LaTeX表达式
28
+ latex_expr = self._generate_latex_expression(symbol_expr)
29
+
30
+ return symbol_expr, general_expr, latex_expr
31
+
32
+ except Exception as e:
33
+ raise ValueError(f"生成函数时出错: {str(e)}")
34
+
35
+ def _generate_symbolic_expression(self, sequence):
36
+ """生成符号表达式"""
37
+ # 使用拉格朗日插值
38
+ terms = []
39
+ for i in range(len(sequence)):
40
+ numerator = 1
41
+ denominator = 1
42
+ for j in range(len(sequence)):
43
+ if j != i:
44
+ numerator *= (self.x - (j + 1))
45
+ denominator *= ((i + 1) - (j + 1))
46
+ term = sp.Rational(sequence[i]) * numerator / denominator
47
+ terms.append(term)
48
+
49
+ return sp.simplify(sum(terms))
50
+
51
+ def _generate_general_expression(self, symbol_expr):
52
+ """生成一般数学表达式"""
53
+ expr_str = str(symbol_expr)
54
+ # 仅替换非符号表达式中的 ** 为 ^
55
+ expr_str = expr_str.replace('**', '^')
56
+ return f"y = {expr_str}"
57
+
58
+ def _generate_latex_expression(self, symbol_expr):
59
+ """生成LaTeX表达式"""
60
+ return f"y = {sp.latex(symbol_expr)}"
61
+
62
+ def _identify_pattern(self, sequence):
63
+ """识别数列模式"""
64
+ # 检查指数增长
65
+ if len(sequence) > 1:
66
+ ratios = [sequence[i+1]/sequence[i] for i in range(len(sequence)-1)]
67
+ if all(abs(r - ratios[0]) < 1e-10 for r in ratios):
68
+ base = sp.Rational(sequence[1]) / sp.Rational(sequence[0])
69
+ return f"{base}**(x)"
70
+
71
+ # 检查线性增长
72
+ differences = [sequence[i+1] - sequence[i] for i in range(len(sequence)-1)]
73
+ if len(set(round(d, 10) for d in differences)) == 1:
74
+ diff = differences[0]
75
+ return f"{sp.Rational(sequence[0])} + {sp.Rational(diff)}*(x)"
76
+
77
+ return None
78
+
79
+ def test_function_generator(test_sequences=None):
80
+ """测试函数生成器"""
81
+ generator = FunctionGenerator()
82
+ test_sequences = test_sequences or [
83
+ [1, 2, 4, 8, 16], # 指数增长
84
+ [1, 3, 5, 7, 9], # 线性增长
85
+ [1, 2, 4, 8, 16, 31] # 复杂序列
86
+ ]
87
+
88
+ for seq in test_sequences:
89
+ print(f"\n测试序列: {seq}")
90
+ try:
91
+ symbol_expr, general_expr, latex_expr = generator.generate(seq)
92
+ print("符号表达式: y =", symbol_expr)
93
+ print("一般数学表达式:", general_expr)
94
+ print("LaTeX表达式:", latex_expr)
95
+ except Exception as e:
96
+ print(f"错误: {str(e)}")
97
+
98
+ if __name__ == "__main__":
99
+ test_function_generator()
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ sympy
2
+ gradio