如何在 python 中对字符串和变量进行数值积分?
How do I numerically integrate a string with variables in python?
免责声明:这里完全是菜鸟,请尽可能简单
我的计划是使用 scipy.integrate.quad()
和 eval()
(在我的情况下,代码安装不是问题)。当等式中的唯一变量是积分变量时,这很好用:
from scipy.integrate import quad
equation = '1+2*x'
result = quad(lambda x: eval(equation), 0, 1)
只要定义了附加变量,就可以添加这些变量:
from scipy.integrate import quad
equation = 'A+B*x'
A=1
B=2
result = quad(lambda x: eval(equation), 0, 1)
但是,如果我尝试像我应该的那样用字典给 eval()
那些额外的变量,它突然开始抱怨找不到 x:
from scipy.integrate import quad
equation = 'A+B*x'
paramsDict = {'A':1, 'B':2}
result = quad(lambda x: eval(equation, paramsDict), 0, 1)
>>> NameError: name 'x' is not defined
显然 eval()
可以 return 具有未定义变量的函数没有问题,除非我给它 一些 值来处理?我该如何解决这个问题?
如果你看一下 eval
的文档,你会发现第二个参数设置了 eval
函数可以看到的范围,特别是它提供了一组全局变量eval
可以利用。因此,在您的情况下,它将无法访问 x
。这可以通过多种方式解决,我的快速而肮脏的解决方案如下:
result = quad(lambda x: eval(equation, {**paramsDict, 'x':x}), 0, 1)
免责声明:这里完全是菜鸟,请尽可能简单
我的计划是使用 scipy.integrate.quad()
和 eval()
(在我的情况下,代码安装不是问题)。当等式中的唯一变量是积分变量时,这很好用:
from scipy.integrate import quad
equation = '1+2*x'
result = quad(lambda x: eval(equation), 0, 1)
只要定义了附加变量,就可以添加这些变量:
from scipy.integrate import quad
equation = 'A+B*x'
A=1
B=2
result = quad(lambda x: eval(equation), 0, 1)
但是,如果我尝试像我应该的那样用字典给 eval()
那些额外的变量,它突然开始抱怨找不到 x:
from scipy.integrate import quad
equation = 'A+B*x'
paramsDict = {'A':1, 'B':2}
result = quad(lambda x: eval(equation, paramsDict), 0, 1)
>>> NameError: name 'x' is not defined
显然 eval()
可以 return 具有未定义变量的函数没有问题,除非我给它 一些 值来处理?我该如何解决这个问题?
如果你看一下 eval
的文档,你会发现第二个参数设置了 eval
函数可以看到的范围,特别是它提供了一组全局变量eval
可以利用。因此,在您的情况下,它将无法访问 x
。这可以通过多种方式解决,我的快速而肮脏的解决方案如下:
result = quad(lambda x: eval(equation, {**paramsDict, 'x':x}), 0, 1)