簡體   English   中英

python中奇點的數值積分(主值)

[英]Numerical integration with singularities in python (principal value)

我正在嘗試使用scipy.integrate的quad函數將函數與奇點集成,但我沒有得到所需的答案。 這是代碼:

from scipy.integrate import quad
import numpy as np
def fun(x):
    return 1./(1-x**2)
quad(fun, -2, 2, points=[-1, 1])

這導致IntegrationWarning和返回值約為0.4

函數的極點是[-1,1]。 答案應該是大約1.09(使用筆和紙計算)。

期權weight='cauchy'可以用來有效地計算像這樣的發散積分的主值。 這意味着提供給quad的函數將隱式乘以1/(x-wvar) ,因此相應地調整該函數(乘以x-wvar ,其中wvar是奇點的點)。

i1 = quad(lambda x: -1./(x+1), 0, 2, weight='cauchy', wvar=1)[0]
i2 = quad(lambda x: -1./(x-1), -2, 0, weight='cauchy', wvar=-1)[0]
result = i1 + i2

結果是1.0986122886681091

使用這樣的簡單函數,您還可以與SymPy進行符號集成:

from sympy import symbols, integrate
x = symbols('x')
f = integrate(1/(1-x**2), x)
result = (f.subs(x, 2) - f.subs(x, -2)).evalf()

結果: 1.09861228866811 如果沒有evalf() ,它將是log(3)

我也無法使用原始功能。 我想出了這個來評估scipy中的主要價值:

def principal_value(func, a, b, poles, eps=10**(-6)):
    #edges
    res = quad(func,a,poles[0]-eps)[0]+quad(func,poles[-1]+eps,b)[0]
    #inner part
    for i in range(len(poles)-1):
        res += quad(func, poles[i]+eps, poles[i+1]-eps)[0]
    return res

其中func是你的函數句柄, ab是極限, polespoles列表, eps是你想要靠近極點的距離。 你可以讓eps越來越小,以獲得更好的結果,但對於像這樣的問題,可能會更好。

有了這個功能和標准eps我得到了1.0986112886023367 ,這與wolframalpha給出的幾乎相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM