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() 就可以了。
我不确定您在这里可以做的事情是否太多,除了:
- 编写您自己的解析器,将字符串作为输入并 returns 该形式的函数。尽管
eval
和 lambda
可以解决问题,但它并不安全并且会更慢。如果您只需要多项式,您可能想看看 NumPy Polynomial
模块 (link).
- 查看符号评估库,例如 SymPy
另外,看看已经问过的问题:Equation parsing in Python (SO)。
我正在使用 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() 就可以了。
我不确定您在这里可以做的事情是否太多,除了:
- 编写您自己的解析器,将字符串作为输入并 returns 该形式的函数。尽管
eval
和lambda
可以解决问题,但它并不安全并且会更慢。如果您只需要多项式,您可能想看看 NumPyPolynomial
模块 (link). - 查看符号评估库,例如 SymPy
另外,看看已经问过的问题:Equation parsing in Python (SO)。