Upload 3 files
Browse files- app.py +66 -0
- function_generator.py +99 -0
- 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
|