我使用的是四叉方法的Scipy库,我想评估一个由用户输入的函数的数值积分。函数以字符串的形式存储。但是,quad方法除了字符串输入之外。那么,如何将这个字符串表达式转换为一个数值呢?
假设字符串表达式是: s1 =“5*x**2-4*x+ 2”,lower_bound =0,upper_bound =5 四(s1,lower_bound,upper_bound)
我尝试过将这个字符串分割成与算术符号有关的标记,然后调用quad方法,但是自变量(在本例中是x)仍然是字符串。
我该如何解决这个问题?
发布于 2017-11-26 21:56:29
您可以像这样使用eval():
>>> eval( "lambda x:x+1" )
<function <lambda> at 0x7f1b80d8ef28>如果您在表达式的开头添加了一个"lambda:“字符串,那么对结果使用eval()就会返回一个函数,它可以满足您的需要。然后,您可以将此函数传递给您的Scipy集成函数。
注意: eval将执行传递给它的任何代码,因此不要在会造成安全问题的上下文中使用它。如果这是一个在线应用程序,那么eval()是错误的选择。如果这是一个桌面应用程序,那么用户已经可以在计算机上做他们想做的任何事情了,在这个上下文中eval()是可以的。
发布于 2017-11-26 22:01:02
我不确定你在这里能做什么,除了:
eval和lambda可以完成这个任务,但是它是不安全的,而且速度会慢一些。如果您只期望多项式,您可能需要查看NumPy Polynomial模块(链接)。另外,看看已经被问到的问题:Python中的方程解析(SO)。
发布于 2017-11-26 21:53:16
scipy.integrate.quad()期望一个函数作为它的第一个参数(文档)。
在这里,可以使用函数或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。
https://stackoverflow.com/questions/47501343
复制相似问题