4

我正在使用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)**betaabg(x)alpha, beta < 0f(x)g(x)quadweightwvarg(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)(据我所知,只有在无法通过选择适当的加权函数来处理奇点/不连续性时才应该使用该参数) )。

4

1 回答 1

2

该参数points适用于积分区间内出现的奇点/不连续点。它不适用于间隔的端点。因此,在您的示例中,没有的版本points是正确的方法。points(如果不深入研究 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)

在这里,包含points是适当的,并且会产生正确的结果,而没有points输出则毫无价值。

于 2017-07-03T01:51:51.240 回答