WTFunc / function_generator.py
ldx967's picture
Upload 3 files
d79b285 verified
import sympy as sp
class FunctionGenerator:
def __init__(self):
self.x = sp.Symbol('x')
def generate(self, sequence):
"""生成函数表达式
参数:
sequence (list): 输入数列
返回:
tuple: (符号表达式, 一般数学表达式, LaTeX表达式)
"""
try:
sequence = [float(x) for x in sequence]
if len(sequence) < 2:
raise ValueError("至少需要两个数来生成函数")
# 生成符号表达式
symbol_expr = self._generate_symbolic_expression(sequence)
# 生成一般数学表达式
general_expr = self._generate_general_expression(symbol_expr)
# 生成LaTeX表达式
latex_expr = self._generate_latex_expression(symbol_expr)
return symbol_expr, general_expr, latex_expr
except Exception as e:
raise ValueError(f"生成函数时出错: {str(e)}")
def _generate_symbolic_expression(self, sequence):
"""生成符号表达式"""
# 使用拉格朗日插值
terms = []
for i in range(len(sequence)):
numerator = 1
denominator = 1
for j in range(len(sequence)):
if j != i:
numerator *= (self.x - (j + 1))
denominator *= ((i + 1) - (j + 1))
term = sp.Rational(sequence[i]) * numerator / denominator
terms.append(term)
return sp.simplify(sum(terms))
def _generate_general_expression(self, symbol_expr):
"""生成一般数学表达式"""
expr_str = str(symbol_expr)
# 仅替换非符号表达式中的 ** 为 ^
expr_str = expr_str.replace('**', '^')
return f"y = {expr_str}"
def _generate_latex_expression(self, symbol_expr):
"""生成LaTeX表达式"""
return f"y = {sp.latex(symbol_expr)}"
def _identify_pattern(self, sequence):
"""识别数列模式"""
# 检查指数增长
if len(sequence) > 1:
ratios = [sequence[i+1]/sequence[i] for i in range(len(sequence)-1)]
if all(abs(r - ratios[0]) < 1e-10 for r in ratios):
base = sp.Rational(sequence[1]) / sp.Rational(sequence[0])
return f"{base}**(x)"
# 检查线性增长
differences = [sequence[i+1] - sequence[i] for i in range(len(sequence)-1)]
if len(set(round(d, 10) for d in differences)) == 1:
diff = differences[0]
return f"{sp.Rational(sequence[0])} + {sp.Rational(diff)}*(x)"
return None
def test_function_generator(test_sequences=None):
"""测试函数生成器"""
generator = FunctionGenerator()
test_sequences = test_sequences or [
[1, 2, 4, 8, 16], # 指数增长
[1, 3, 5, 7, 9], # 线性增长
[1, 2, 4, 8, 16, 31] # 复杂序列
]
for seq in test_sequences:
print(f"\n测试序列: {seq}")
try:
symbol_expr, general_expr, latex_expr = generator.generate(seq)
print("符号表达式: y =", symbol_expr)
print("一般数学表达式:", general_expr)
print("LaTeX表达式:", latex_expr)
except Exception as e:
print(f"错误: {str(e)}")
if __name__ == "__main__":
test_function_generator()