2017-02-16 68 views
1

我想數值超過一個三角形類似整合的功能可以scipy.integrate.fixed_quad與功能邊界計算積分?

import scipy.integrate as integrate 
inside = lambda x: integrate.quad(lambda x,y: 1, 0, x, args=(x))[0] 
outside = integrate.quad(inside, 0, 1)[0] 
print(outside) 
0.5 

但使用scipy.integrate.fixed_quad函數(其具有整合順序n作爲參數)。然而,當我寫

inside = lambda x: integrate.fixed_quad(lambda x,y: 1, 0, x, args=(x), n=5) 
print(inside(5)) 

Traceback (most recent call last): File "", line 1, in File "", line 1, in File "/Users/username/anaconda/lib/python3.5/site-packages/scipy/integrate/ quadrature.py", line 82, in fixed_quad return (b-a)/2.0 * np.sum(w*func(y, *args), axis=0), None

TypeError:() argument after * must be an iterable, not int

我不知道我在做什麼錯了,因爲我在scipy.integrate.fixed_quad下面的文檔。

回答

1

問題是您的定義爲args,args=(x)。它應作爲一個元組進行傳遞,所以你需要添加額外的逗號,使之成爲元組:

inside = lambda x: integrate.fixed_quad(lambda x,y: 1, 0, x, args=(x,), n=5) 

然後

inside(5) 

產生

(5.0, None) 

integrate.quad(lambda x,y: 1, 0, x, args=(x))[0] 

作用在quad檢查args是否爲元組;如果不將它轉換(直接從源代碼所):

if not isinstance(args, tuple): 
     args = (args,) 

fixed_quad是不是這樣的,這就是爲什麼你在一個接收錯誤,但不是這兩種情況。

+0

有趣的,沒有想到,因爲它爲integration.quad沒有逗號工作。然而,執行'outside = integrate.fixed_quad(inside,0,1,n = 5)[0]'會產生另一個ValueError,所以我仍然無法計算double積分。它雖然適用於'integrate.quad(inside,0,1)',但我寧願在兩個積分中都有n(高斯積分積分階)參數。 – Jan

+0

@Jan:我用信息編輯了我的帖子,爲什麼當'quad'被調用時它不會崩潰。 – Cleb