将Math.js类表达式转换为可运行的Python代码

0 投票
2 回答
35 浏览
提问于 2025-04-12 04:37

我想把从 math.js 得到的一个字符串(比如 2*x^2+5x-1)转换成一个可以在 Python 中运行的函数,像这样:

def f(x):
   return 2*(x**2)+5*x-1

我尝试过使用 sympy 模块里的 sympify 方法:

from sympy import sympify, symbols

x = symbols("x")
expression = "x**2 + 3*x-1"
print(sympify(expression).subs(x, 2))

不过,这种方法在处理某些操作时,比如 ^,就不太管用了,只能返回结果。此外,我还试过用 eval() 函数,但也遇到了类似的问题。

2 个回答

-1

你可以把数学表达式的字符串转换成一个 SymPy 表达式,然后把 ^ 这个运算符换成 **(这是Python中表示幂运算的符号),接着用 lambdify 创建一个Python函数 f(x)

sympy 导入 sympifysymbolslambdify

x = symbols("x")
expression_str = "2*x^2 + 5*x - 1"
expression_sym = sympify(expression_str.replace("^", "**"))
f = lambdify(x, expression_sym, 'numpy')
print(f(2))  # Evaluate the function at x = 2

输出结果:

17
2

SymPy里有一个内置的解析器,可以把字符串转换成SymPy表达式。你可以用像subs或者lambdify这样的函数来进行计算。

你还可以通过transformations参数传递一些额外的解析规则,比如隐式乘法,也就是说像5x这样的表达式会被理解为5*x。完整的规则列表可以在这里找到。

from sympy import parse_expr
from sympy.parsing.sympy_parser import standard_transformations, implicit_multiplication_application

# tuple of transformations
transformations = (
    standard_transformations +
    (implicit_multiplication_application,))


s = '2*x^2 + 5x - 1'.replace('^', '**')
e = parse_expr(s, transformations=transformations)

# check object
print(e)
# 2*x**2 + 5*x - 1
print(type(e))
#<class 'sympy.core.add.Add'>

撰写回答