在使用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,但未解决上述两个具体问题。
答案 0 :(得分:3)
在python 2.7(你正在使用)中,整数除法是默认的。这意味着1/2将评估为0.如果要使用浮点除法,请将from __future__ import division
添加到代码顶部。
答案 1 :(得分:1)
正如@gjdanis指出的那样,在python 2.7中,1/2
为0
(除非您在代码中包含from __future__ import division
)。
你的被积函数在1和-1处有奇点。 fixed_quad
和quadrature
使用加权函数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
,则还应明智地使用miniter
。 quadrature
天真地从miniter
开始,并将订单增加1,直到错误估算值足够小或达到maxiter
为止。
要详细了解fixed_quad
和quadrature
的工作原理,请查看源代码:https://github.com/scipy/scipy/blob/master/scipy/integrate/quadrature.py
正如您所指出的,quad
是Fortran库QUADPACK的包装器。此代码比fixed_quad
和quadrature
使用的简单高斯求积法复杂得多。