2016-09-16 66 views
-1

我不是一個很有經驗的程序員。請你能告訴我爲什麼這個代碼給我的錯誤信息:用戶定義函數是否可調用?

錯誤:四:第一個參數是不可呼叫

代碼:

from matplotlib import pyplot as plt 
import numpy as np 
import scipy.integrate as integrate 

def parabola(x, a): 
    return a+x**2 

x=np.arange(-10, 10, 1) 

plt.plot(x, parabola(x,2)) 

plt.show() 

int1=integrate.quad(parabola(x,2), -5, 5) 
print int1 

如果所有用戶定義的函數可調用?

+4

你好不要調用函數。函數是可調用的,通過'parabola'沒有這些參數 –

+1

或'lambda x:parabola(x,2)' –

+0

_Functions_是可調用的。函數_return values_可能是,但通常它們不是。 –

回答

3

有在你的代碼的兩個問題:

1)調用該函數parabola()。相反,將它作爲參數傳遞給integrate

2)parabola()是一個兩參數函數。 integrate需要單參數函數。

要解決第二個問題,您需要將雙參數函數轉換爲單參數函數。這是一種通用技術,稱爲部分應用的功能。

嘗試這種情況:

def parabola1(x): return parabola(x, 2) 

int1 = integrate.quad(parabola1, -5, 5) 
print int1 
+2

或'integrate.quad(functools.partial(a = 2),-5,5)'([docs](https://docs.python.org/library/functools.html#functools.partial))。 –

+1

@CristianCiupitu錯字? 'integration.quad(functools.partial(parabola,a = 2),-5,5)' – zvone

+0

或'integrate.quad(lambda x:parabola(x,2),-5,5)' –

1

嘗試:

int1=integrate.quad(parabola, -5, 5, args=(2,)) 

quad簽名是:

quad(func, a, b, args=(), ...) 

功能,較低範圍,上限範圍,通過args_to_pass等

相關問題