使用不同的方程整合Chebyshev权重函数时的不同结果

时间:2014-08-13 15:15:09

标签: python scipy integration numerical-methods

在使用3个不同的例程和2个不同的exponent表示集成Chebyshev weight function时,有人可以解释我观察到的以下行为吗?在每种情况下,预期答案是Pi:

from scipy.integrate import quadrature, quad, fixed_quad

print fixed_quad(lambda x: 1/(1 - x**2)**(1/2), -1, 1)
print fixed_quad(lambda x: 1/(1 - x**2)**(0.5), -1, 1)

print quadrature(lambda x: 1/(1 - x**2)**(1/2), -1, 1) 
print quadrature(lambda x: 1/(1 - x**2)**(0.5), -1, 1)

print quad(lambda x: 1/(1 - x**2)**(1/2), -1, 1)
print quad(lambda x: 1/(1 - x**2)**(0.5), -1, 1)

给出了

(2.0000000000000009, None)
(2.8254100794589787, None)

(1.9999999999999996, 4.4408920985006262e-16)
/usr/lib/python2.7/dist-packages/scipy/integrate/quadrature.py:168: AccuracyWarning:    maxiter (50) exceeded. Latest difference = 6.965869e-04
 AccuracyWarning)
(3.107110439388189, 0.00069658693569163432)

(2.0, 2.220446049250313e-14)
(3.141592653589564, 6.200200353134733e-10)

首先,可以看出,答案取决于指数中是否给出1/2或0.5:为什么会这样?

其次,结果取决于所选择的例程;有人可以解释为什么FORTRAN的QUADPACK得到了正确答案,但高斯正方形完全错过了结果吗?

注意:类似的问题已针对here,但未解决上述两个具体问题。

2 个答案:

答案 0 :(得分:3)

在python 2.7(你正在使用)中,整数除法是默认的。这意味着1/2将评估为0.如果要使用浮点除法,请将from __future__ import division添加到代码顶部。

答案 1 :(得分:1)

正如@gjdanis指出的那样,在python 2.7中,1/20(除非您在代码中包含from __future__ import division)。

你的被积函数在1和-1处有奇点。 fixed_quadquadrature使用加权函数w(x) = 1执行高斯求积法,因此这些奇点处理得不好。

fixed_quad不适应(因此名称)。默认顺序为5.您必须增加订单(按批次)以获得合理的近似值:

In [179]: print fixed_quad(lambda x: 1/(1 - x**2)**(0.5), -1, 1, n=100)
(3.124265558250825, None)

In [180]: print fixed_quad(lambda x: 1/(1 - x**2)**(0.5), -1, 1, n=2000)
(3.1407221810853478, None)

quadrature只是按递增顺序调用fixed_quad(最多由maxiter参数给出的最大值),直到连续积分估计值之间的差异足够小。打印的警告告诉您达到了最大订单但未达到所需的容错范围。 maxiter的默认值为50;您需要增加maxiter才能获得更好的结果。例如,这里的结果为maxiter=200

In [2]: print quadrature(lambda x: 1/(1 - x**2)**(0.5), -1, 1, maxiter=200)
/Users/warren/local_scipy/lib/python2.7/site-packages/scipy/integrate/quadrature.py:183: AccuracyWarning: maxiter (200) exceeded. Latest difference = 4.353464e-05
  AccuracyWarning)
(3.1329074742380407, 4.3534643496823122e-05)

如果您使用maxiter,则还应明智地使用miniterquadrature天真地从miniter开始,并将订单增加1,直到错误估算值足够小或达到maxiter为止。

要详细了解fixed_quadquadrature的工作原理,请查看源代码:https://github.com/scipy/scipy/blob/master/scipy/integrate/quadrature.py

正如您所指出的,quad是Fortran库QUADPACK的包装器。此代码比fixed_quadquadrature使用的简单高斯求积法复杂得多。