Python 在函数中使用 Lambda

1 投票
4 回答
2919 浏览
提问于 2025-04-16 14:05

我正在尝试创建一个叫做 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 个回答

0

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)

是一样的。

1

我猜想 odeint 是一个函数,你把一个 lambda 函数传给它。odeint 可能会调用这个 lambda 函数,并且需要把 xy 传给它。所以,如果你希望 odeint 调用这个函数并把 xy 传过去,那你就需要把 xy 作为参数传给 odeint,除了函数本身之外。

你到底想要做什么呢?如果能提供更多的细节和代码,我们可能能给出更好的答案。

2

如果你想把函数 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 参数实际上是可以忽略的,因为在一阶微分方程中你不需要用到它)。

撰写回答