2011-03-20 27 views
1

我想创建一个名为calc(f,a,b)的函数,其中x是一个包含变量f的方程,并且我希望将该代码放入函数中。在函数内使用lambda的Python

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什么,我无法弄清楚的是,我如何能够通过f从calc函数输入到odeint里面。它说使得f心不是宣称,如果我把它串内..这行的也工作

当我运行这个功能..它不工作我得到这个错误

NameError: name 'f' is not defined 

我不知道怎么打发我的方程里odeint集成

感谢

+1

莫尔细节。我已经读了三次这个问题,但我没有得到你的问题(尽管我累了可能会造成这种情况)。举例说明你想要做什么,并解释什么不起作用以及如何起作用。 – delnan 2011-03-20 23:33:25

+0

嗨。请现在检查 – Kartik 2011-03-20 23:45:48

+0

您能否接受您之前问题的答案? – mjbommar 2011-03-20 23:52:50

回答

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

1

我认为odeint是一些功能,你所传递的lambda函数。 odeint大概会称为拉姆达,并且需要将xy传递给它。因此,答案是,如果你想odeint调用的函数,并将它传递xy,那么你就需要通过xyodeint作为参数,除了函数本身。

你究竟想在这里做什么?随着更多的细节和更多的代码,我们可能会得到更好的答案。

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) 
+0

嗨。我试过,但为了让我调用函数calc(x ** 2,0),它说我需要首先定义x,如果我把它放在引号中,它不起作用 – Kartik 2011-03-20 23:48:17

0

我不能完全确定,因为odeint()不是内置的Python功能,所以我不很了解,但你传递给它的第一个参数在你的代码而不是函数计算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)