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