2017-06-30 60 views
3

我使用從scipy.integrate v0.19.1所述quad函數在積分區間的每一端與像奇異平方根功能集成諸如例如使用SciPy的的四常規集成與奇點的函數

In [1]: quad(lambda x: 1/sqrt(1-x**2), -1, 1) 

(I使用來自numpy v1.12.0sqrt功能),其立即產生正確的結果PI:

Out[1]: (3.141592653589591, 6.200897573194197e-10) 

按照的文檔0功能關鍵字points應該用來指示奇點或積的不連續性的位置,但如果我表示點[1, -1]當上述積是singluar我得到一個警告和nan的結果:

In [2]: quad(lambda x: 1/sqrt(1-x**2), -1, 1, points=[-1, 1]) 

RuntimeWarning: divide by zero encountered in double_scalars 
IntegrationWarning: Extremely bad integrand behavior occurs at some 
points of the integration interval. 

Out[2]: (nan, nan) 

燦有人澄清,爲什麼quad產生這些問題,如果被積函數的奇點被指定,並且運行正常,如果這些點沒有指出?

編輯: 我想我找出了這個問題的正確解決方案。對於情況下,別人也遇到了類似的問題我趕緊想分享我的發現:

我要形式f(x)*g(x)的功能,具有平穩的功能f(x)g(x) = (x-a)**alpha * (b-x)**beta,其中ab是整合限制和g(x)整合在這些限制處具有奇點,如果alpha, beta < 0,那麼你應該僅僅使用g(x)作爲加權函數整合f(x)。對於quad例程,可以使用weightwvar參數。有了這些論點,你也可以處理不同種類的奇點和有問題的振盪行爲。上面定義的加權函數g(x)可以通過設置weight='alg'並使用wvar=(alpha, beta)來指定g(x)中的指數。

由於1/sqrt(1-x**2) = (x+1)**(-1/2) * (1-x)**(-1/2)我現在可以處理的積分如下:

In [1]: quad(lambda x: 1, -1, 1, weight='alg', wvar=(-1/2, -1/2)) 
Out[1]: (3.1415926535897927, 9.860180640534107e-14) 

其產生正確答案pi具有非常高的精度,不管我用的說法points=(-1, 1)或不(其中,就我現在明白了,只有在奇點/不連續點不能通過選擇適當的加權函數來處理時才應該使用)。

回答

0

參數points意味着發生的奇點/不連續點之內的積分區間。它不適用於該區間的端點。因此,在您的示例中,沒有points的版本是正確的方法。 (我無法確定在points中包含端點時沒有潛入SciPy包裝的FORTRAN代碼會出現什麼問題。)

比較用下面的例子,其中,發生整合的間隔內的奇點:

>>> quad(lambda x: 1/sqrt(abs(1-x**2)), -2, 2) 
(inf, inf) 
>>> quad(lambda x: 1/sqrt(abs(1-x**2)), -2, 2, points = [-1, 1]) 
(5.775508447436837, 7.264979728915932e-10) 

這裏points列入是適當的,併產生正確的結果,而無需points輸出是毫無價值的。

+0

嗨沃爾特,謝謝你的回答!我認爲這是正確的方法。 – TMueller83