我正在使用quad
函数 fromscipy.integrate v0.19.1
在积分区间的每一端对具有平方根的奇异点进行积分,例如
In [1]: quad(lambda x: 1/sqrt(1-x**2), -1, 1)
(我使用sqrt
来自 的函数numpy v1.12.0
)立即产生正确的结果 pi:
Out[1]: (3.141592653589591, 6.200897573194197e-10)
根据quad
函数的文档,该关键字points
应用于指示被积函数的奇异点或不连续点的位置,但如果我指出[1, -1]
上述被积函数为奇异点的点,我会收到警告,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
f(x)
g(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)
(据我所知,只有在无法通过选择适当的加权函数来处理奇点/不连续性时才应该使用该参数) )。