加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:18:27 所属栏目:Python 来源:网络整理
导读:我正在使用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.200897573194197
我正在使用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,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,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,points = [-1,1])
(5.775508447436837,7.264979728915932e-10)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读