我使用從scipy.integrate v0.19.1
所述quad
函數在積分區間的每一端與像奇異平方根功能集成諸如例如使用SciPy的的四常規集成與奇點的函數
In [1]: quad(lambda x: 1/sqrt(1-x**2), -1, 1)
(I使用來自numpy v1.12.0
的sqrt
功能),其立即產生正確的結果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
,其中a
和b
是整合限制和g(x)
整合在這些限制處具有奇點,如果alpha, beta < 0
,那麼你應該僅僅使用g(x)
作爲加權函數整合f(x)
。對於quad
例程,可以使用weight
和wvar
參數。有了這些論點,你也可以處理不同種類的奇點和有問題的振盪行爲。上面定義的加權函數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)
或不(其中,就我現在明白了,只有在奇點/不連續點不能通過選擇適當的加權函數來處理時才應該使用)。
嗨沃爾特,謝謝你的回答!我認爲這是正確的方法。 – TMueller83