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

使用scipy的quad例程将函数与奇点集成,第1张

概述我正在使用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) 根 我正在使用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_scalarsIntegrationWarning: Extremely bad integrand behavior occurs at somepoints 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)

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

总结

以上是内存溢出为你收集整理的使用scipy的quad例程将函数与奇点集成全部内容,希望文章能够帮你解决使用scipy的quad例程将函数与奇点集成所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1196327.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存