使用scipy的quad例程将函数与奇点集成

我正在使用scipy.integrate v0.19.1中的quad函数在积分区间的每一端集成函数和平方根,如奇点,例如

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

(我使用numpy v1.12.0中的sqrt函数),它立即产生正确的结果pi:

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

根据quad函数的文档,关键字点应该用于指示被积函数的奇点或不连续点的位置,但是如果我指出上面的被积函数是单一的点[1,-1]我得到一个警告和南结果:

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)=(xa)** alpha *(bx)** beta进行积分,其中a和b是积分极限,并且如果α,β<α,则g(x)在这些极限处具有奇点. 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)

无论我是否使用参数points =( – 1,1),我都会以非常高的精度产生正确的答案pi​​(据我所知,现在只应使用,如果奇点/不连续可以不能通过选择适当的加权函数来处理).

解决方法:

参数点用于在积分区间内出现的奇点/不连续性.它不适用于间隔的端点.因此,在您的示例中,没有点的版本是正确的方法. (当我没有深入了解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)

这里包含点是合适的,并产生正确的结果,而没有点,输出是没有价值的.

上一篇:Latex数学公式中的矩阵


下一篇:c – allegro5 – 如何在Linux上运行?