Python在函数中使用Lambda

时间:2011-03-20 23:23:48

标签: python scipy

我正在尝试创建一个名为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)需要在odeint之后立即传递给y, x: f函数,其中分号后面的f是来自{{1}的f }}

我无法弄清楚如何将calc(f,a,b)从calc函数输入传递到odeint里面。它说f没有声明,如果我把它放在字符串中......它可以工作

当我运行此功能时..它不起作用我收到此错误

f

我不知道如何将我的等式传递到odeint中

由于

4 个答案:

答案 0 :(得分: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

odeint模块中的scipy.integrate函数具有签名:

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参数基本上被忽略,因为你不需要将它用于一阶微分方程)。

答案 1 :(得分:1)

我认为odeint是传递lambda函数的函数。 odeint可能会调用lambda并需要将xy传递给它。答案是,如果您希望odeint调用该函数并将其传递给xy,那么您需要将xy传递给{ {1}} 作为参数,除了函数本身。

你到底想要做什么?有了更多细节和更多代码,我们可能会得到更好的答案。

答案 2 :(得分: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)

答案 3 :(得分:0)

我不完全确定,因为odeint()不是内置的Python函数,所以我对它不太了解,但是你在代码中传递它的第一个参数是 not 计算x^2的函数。执行此类操作的简单方法是将lambda函数传递给进行此类计算的calc。例如:

def calc(f, a, b):
    limits = [a, b]
    integral = odeint(f, 0, limits)

    return integral[1]

print calc(lambda x: x**2, 0, 1)