scipy.quad在大范围内减少函数的麻烦

时间:2015-10-25 08:51:59

标签: python scipy integration exponential quad

我对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范围的四边形工作,或任何像我可以使用的四边形工作?

0 个答案:

没有答案