scipy.quad在大范围内减少功能的麻烦

我有一个scipy.quad的问题。 简而言之,我有一个非常长而复杂的嵌套函数和积分集合,其中包含积分递减函数,它必须在特定范围内集成10 ^ 2 <x <10 ^ 20。

为了简单地演示这个问题,使用numpy.quad这些值之间的y = x ^( - 2)的numpy.quad

    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,但四元素返回一个非常小的值,并且通过取消函数中的打印行的注释,可以看到它仅累积了最大的x值(或者由于x轴)。 我需要找到解决这个问题的方法。

我知道你可以通过使用其他方法如Simpsons或梯形规则来得到正确答案:

    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循环来生成一个可以整合的数组,从而减慢整个程序的速度,让人无法接受。

有没有什么技巧可以为这种x系列做四分工,或者有什么像quad一样工作,我可以用它来代替?

链接地址: http://www.djcxy.com/p/69965.html

上一篇: scipy.quad trouble for decreasing functions over large ranges

下一篇: Python List comprehension with items() and enumerate()