Scipy 数值积分

Scipy Numerical Integration

我正在使用 Scipy 库的 quad 方法,我想评估由一个用户。该函数存储为字符串。但是,quad 方法不排除字符串输入。那么,如何将这个字符串表达式转换成数值呢?

Assume that, the string expression is:

s1 = "5*x**2 - 4*x + 2" and lower_bound = 0 , upper_bound = 5

quad(s1, lower_bound, upper_bound)

我已经尝试将这个字符串拆分为与算术符号相关的标记,然后调用 quad 方法,但自变量(在本例中为 x)仍然保持为字符串。

我该如何解决这个问题?

scipy.integrate.quad() 需要一个函数作为它的第一个参数 (docs)。

在这里你可以使用函数或 lambda 表达式:

lower_bound = 0
upper_bound = 5

def s1(x):
    return 5*x**2 - 4*x + 2

quad(s1, lower_bound, upper_bound)
quad(lambda x: 5*x**2 - 4*x + 2, lower_bound, upper_bound)

如果你想从字符串中的符号表达式中解析,作为一种快速破解,你可以使用 eval():

s1 = "5*x**2 - 4*x + 2"
quad(lambda x: eval(s1), lower_bound, upper_bound)

如果您要进行大量符号数学运算,我建议您使用 SymPy。

您可以像这样使用 eval():

>>> eval( "lambda x:x+1" )
<function <lambda> at 0x7f1b80d8ef28>

如果您在表达式的开头添加一个 "lambda x:" 字符串,然后对结果使用 eval(),eval 将 return 一个执行您想要的操作的函数。然后您可以将此函数传递给您的 Scipy 集成函数。

注意:eval 将执行传递给它的任何代码,因此不要在会产生安全问题的上下文中使用它。如果这是在线应用程序,那么 eval() 是错误的选择。如果这是一个桌面应用程序,那么用户已经可以用计算机做任何他们想做的事情,在这种情况下 eval() 就可以了。

我不确定您在这里可以做的事情是否太多,除了:

  1. 编写您自己的解析器,将字符串作为输入并 returns 该形式的函数。尽管 evallambda 可以解决问题,但它并不安全并且会更慢。如果您只需要多项式,您可能想看看 NumPy Polynomial 模块 (link).
  2. 查看符号评估库,例如 SymPy

另外,看看已经问过的问题:Equation parsing in Python (SO)