2011-07-30 106 views
5

我正在尋找超級數字正交函數。它應該具有以下三個屬性:Python中的數值積分與矢量化函數的自適應求積

  • 自適應 - 它會自動調整採樣點的密度以適合被積函數。這是絕對必要的,因爲我的被積函數計算非常不均勻且代價高昂。
  • 矢量化 - 爲了效率,矢量化 - 它一次調用採樣點列表而不是一個點的被積函數。
  • 能夠處理向量值函數 - 矢量值被積函數的所有分量都是同時計算的,無需額外成本,因此將所有組件分開集成是沒有意義的。

此外,它應該是:

  • 2D - 積分我想計算是在平面區域二重積分,我希望能夠指定一個整體(相對)容差爲整體積分,並適當地管理誤差預算。

有沒有人知道一個庫有這樣的功能?四種財產中的兩種或三種都比沒有好。

我正在使用Python和SciPy,所以如果它已經與Python一起使用,那就是獎金。 (但是我也可以寫膠水代碼讓它在必要時調用我的被積函數。)

+1

唉,沒有解答!我正在用C#編寫我自己的數值積分算法。它是自適應的並且處理N維,但是不是矢量化的。證明終止條件(容忍)是正確的。 –

+0

@Keenan胡椒也許描述的過程[在這個問題可以給你一些見解](http://stackoverflow.com/questions/14441541/performance-behaviour-of-vectorized-functions-in-numpy/16551313#16551313) –

回答

1

scipy.integrate中的quadrature函數滿足您所查找內容的前兩個要求。類似的romberg函數使用different method

其它功能僅滿足的要求之一:

  • 類似命名quad函數做自適應正交,但只支持一個標量參數的函數。你可以傳遞一個​​函數來提高性能,但是普通的Python函數會很慢。
  • simps函數和相關的採樣方法可以傳遞一個(通常均勻間隔)樣本的向量,但不是自適應的。

你上市(矢量值函數的同時積分)第三個要求是有點深奧,並接受擺在首位的矢量功能的能力衝突(函數參數將不得不採取矩陣! )類似地,計算雙重積分的能力將顯着地使函數的規格複雜化。

在大多數情況下,quadrature函數將是要走的路。

1

我剛在quadpy中實現了一維和二維域的向量化自適應正交。您需要提供的只是您的域的三角剖分以及要整合的功能。它可能是矢量值。

pip install quadpy 

安裝quadpy和運行

import numpy 
import quadpy 


triangles = numpy.array([ 
    [[0.0, 0.0], [1.0, 0.0]], 
    [[1.0, 0.0], [1.0, 1.0]], 
    [[0.0, 1.0], [0.0, 1.0]], 
    ]) 

val, error_estimate = quadpy.triangle.adaptive_integrate(
     lambda x: [numpy.sin(x[0]), numpy.exp(x[0])], 
     triangles, 
     1.0e-10 
     ) 

print(val) 
print(error_estimate) 

這給

[ 0.45969769 1.71828183] 
[ 7.10494337e-12 3.68776277e-11]