2011-03-20 25 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)