Python 在函数中使用 Lambda
我正在尝试创建一个叫做 calc(f,a,b)
的函数,其中 x 是一个包含变量 f 的方程,我想把这段代码放在这个函数里。
def calc(f, a, b):
limits = [a, b]
integral = odeint(lambda y, x : f, 0, limits)
return integral[1]
这个函数使用内置的 odeint 函数来计算积分。这就是我想要做的事情。
print calc(x**2, 0, 1)
其中 x^2
是要进行积分的函数。我的问题是,这个函数(x**2
)需要在 y, x: f
后面传递给 odeint
函数,而在分号后面的 f 就是来自 calc(f,a,b)
的那个 f
。
我搞不明白的是,如何将 calc
函数输入的 f
传递给里面的 odeint
。它提示说 f 没有声明,如果我把它放在字符串里……也不行。
当我运行这个函数时,它不工作,我得到了这个错误。
NameError: name 'f' is not defined
我不确定如何将我的方程传递给 odeint 进行积分。
谢谢。
4 个回答
x 不能同时有两个值;所以如果你需要两个值,其中一个必须换个名字。给你的变量改个名吧。
编辑:
(拍额头):在 calc(x**2, 0, 1)
中,x**2
不是一个函数——它是一个表达式,这个表达式会在传给 calc 之前被计算出来——所以它会抱怨说需要知道 x 是什么(为了计算 x**2)。
试试
calc(lambda x: x**2, a, b)
代替。这个和
def unnamedfunction(x):
return x**2
calc(unnamedfunction, a, b)
是一样的。
我猜想 odeint
是一个函数,你把一个 lambda 函数传给它。odeint
可能会调用这个 lambda 函数,并且需要把 x
和 y
传给它。所以,如果你希望 odeint
调用这个函数并把 x
和 y
传过去,那你就需要把 x
和 y
作为参数传给 odeint
,除了函数本身之外。
你到底想要做什么呢?如果能提供更多的细节和代码,我们可能能给出更好的答案。
如果你想把函数 calc
改写成下面这样:
def calc(f, a, b):
limits = [a, b]
integral = odeint(lambda y, x: f(x), 0, limits)
return integral[1][0]
那么你可以这样使用这个函数:
>>> calc(lambda x: x ** 2, 0, 1) # Integrate x ** 2 over the interval [0, 1] (expected answer: 0.333...)
0.33333335809177234
>>> calc(lambda x: x, 0, 1) # Integrate x over the interval [0, 1] (expected answer: 0.5)
0.50000001490120016
>>> calc(lambda x: 1, 0, 1) # Integrate 1 over the interval [0, 1] (expected answer: 1.0)
1.0
来自 scipy.integrate
模块的 odeint
函数的用法是:
odeint(func, y0, t, ...)
这里面:func
是一个可以调用的东西,它接受参数 y, t0, ...
,并在给定的点返回 dy/dt;y0
是一个表示 y 的初始条件的序列;t
是一个表示要计算 y 的时间区间的序列(t0 是这个序列中的第一个值)。
看起来你是在解决一个一阶微分方程,形式是 dy/dx = f(x),在区间 [a, b] 上,其中 y0 = 0。在这种情况下,当你把 f(它只接受一个参数)传给 odeint 函数时,你需要用一个 lambda 表达式把它包裹起来,这样传入的函数就能接受两个参数(y 和 x——y 参数实际上是可以忽略的,因为在一阶微分方程中你不需要用到它)。