我试图整合一些功能与vegas库,一个简单的工具,集成f(x) = lambda x: x ** 2.0
是
import vegas
f = lambda x: x ** 2.0
integrator = vegas.Integrator([[0.0, 1.0]])
result = integrator(f, nitn = 10, neval = 10000)
print result
这将打印[0.33333389(69)]
并且是正确的。但是,如果我希望能够更改函数f
的功率值,但添加如下输入参数
def f(x, p):
return x ** p
Integrator
方法会抱怨以下内容
SyntaxError: invalid syntax
使用global
变量传递p
会搞乱代码,因为在实践中,我有很多参数传递给f
。使用以下替代定义将涉及更改函数的实际定义,并且不是优选的解决方案
def f(x, p = 2.0):
return x ** p
那么我怎样才能将参数传递给f
方法中调用的Integrator
?提前致谢!
一种解决方案是拥有一个能够构建您的电源功能的功能:
def to_the_power(p):
return lambda x: x ** p
result = integrator(to_the_power(2), nitn = 10, neval = 10000)
这种技术通常被称为currying,这里我们讨论幂函数,因此我们可以一次一个地传递参数而不是一次传递参数。请注意,如果您需要使用多个参数执行此操作,或者如果您使用的功能无法控制,您可能会发现functools.partial
非常有用:
import functools
def f(p, x):
return x ** p
integrator(functools.partial(f, 2), nitn = 10, neval = 10000)