[英]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
是你的函數句柄, a
和b
是極限, poles
是poles
列表, eps
是你想要靠近極點的距離。 你可以讓eps越來越小,以獲得更好的結果,但對於像這樣的問題,可能會更好。
有了這個功能和標准eps
我得到了1.0986112886023367
,這與wolframalpha給出的幾乎相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.