【问题标题】:Scipy Numerical IntegrationScipy 数值积分
【发布时间】:2018-05-10 03:00:57
【问题描述】:

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

假设,字符串表达式为:

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

四边形(s1,lower_bound,upper_bound)

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

我该如何解决这个问题?

【问题讨论】:

标签: python numpy scipy numerical-methods


【解决方案1】:

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

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

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

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

【讨论】:

  • 不客气 ;) 请注意此答案与其他答案之间的区别在于 eval() 仅使用一次(因为它很慢)并且它返回的函数将具有与任何其他函数相同的速度您在代码中输入的 python 函数...
【解决方案2】:

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

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

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

【讨论】:

  • 你知道任何可以解决这个问题的开源免费解析器吗?
  • @OnurErtugral 不是。简单的案例在过去或大学项目中相当有趣,所以我认为网络上应该有很多零散的代码,但没有一个我知道的扎实的基础。
【解决方案3】:

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。

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 2014-11-27
    • 2016-12-20
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多