我对scipy.quad
有疑问。简而言之,我有一套非常长而复杂的嵌套函数和积分,其中包括递减函数的整数,必须在特定范围内积分10 ^ 2< x< 10 ^ 20
要简单地演示此问题,请使用numpy.quad
考虑这些值之间的y = x ^( - 2)的积分:
import numpy as np
from scipy.integrate import quad
def func(x,z):
"decreasing function to test"
#print x,x**-2.
return x**(-2.)
#Test quad:
print 'Quad', quad(lambda x: func(x,0.),1e2,1e20)[0]
这个积分的真正答案是0.01,但是quad返回一个非常小的值,并且通过取消注释函数中的打印线,你可以看到它只集成了最大的x值(或者由于x轴的对数刻度)。我需要找到解决这个问题的方法。
我知道您可以使用其他方法(如辛普森一家或梯形规则)获得正确答案:
from scipy.integrate import simps
from numpy import trapz
xarray=np.logspace(2,20,1000)
print 'Simpson logspace x',simps(func(xarray,0.),xarray)
print 'Trapezoid logspace x',trapz(func(xarray,0.),xarray)
但是这些包括将数组传递给函数,这对于我的实际代码是不可能的。因此,我必须包含一个for循环来生成要与其集成的y数组,这会使整个程序的速度降低到不可接受的程度。
是否有任何技巧可以使这种x范围的四边形工作,或任何像我可以使用的四边形工作?