python中的多处理嵌套数值积分

时间:2017-05-16 20:35:14

标签: python multithreading parallel-processing scipy numerical-integration

我正在使用python中的嵌套数值积分,其中每个图层的限制取决于下一层。我的代码的整体结构看起来像

import numpy as np
import scipy.integrate as si

def func(x1, x2, x3, x4):
    return x1**2 - x2**3+x3*x2 - x4*x3**3  

def int1():
    """integrates `int2` over x1"""
    a1, b1 = -1, 3
    def int2(x1):
        """integrates `func` over x2 at given x1.""" 
        #partial_func1 = lambda x2: func(x1, x2)
        b2 = 1 - np.abs(x1)
        a2 = -np.abs(x1**3)
        def int3(x2):
            a3 = x2
            b3 = -a3
            def int4(x3):
                partial_func = lambda x4: func(x1, x2, x3, x4)
                a4 = 1+np.abs(x3)
                b4 = - a4
                return si.quad(partial_func,a4,b4)[0]
            return si.quad(int4, a3, b3)[0]
        return si.quad(int3, a2, b2)[0]     
    return si.quad(int2, a1, b1)[0]
result = int1()  # -22576720.048151683

在我的代码的完整版本中,积分和限制很复杂,运行需要几个小时,这很不方便。每个积分看起来都可以很容易地并行化:看起来我应该能够使用多处理将集成分配到多个CPU并加快运行时间。

参考堆栈溢出的其他一些帖子,我尝试了以下内容:

def testfunc(intfunc,fmin,fmax):
    return scint.quad(intfun,fmin,fmax,epsabs=10**-40)[0]

result = pool.map(partial(partial(testfunc, intfunc = int4),fmin = a3),[b3])

但是我收到一个错误,即本地对象无法被腌制。

我遇到的另一个资源是http://catherineh.github.io/programming/2016/10/04/parallel-integration-for-mere-mortals

但我需要一个函数,我可以通过输入作为输入(因此我使用partials)。

有谁知道如何解决这些问题?我认为一个解决方案是可以处理多个输入的某个版本的pool.map会很棒,但如果我使用partials有问题,那么找出它也很棒。

提前致谢,如果有任何问题可以解决,请告诉我们!

2 个答案:

答案 0 :(得分:0)

这个答案可能并不令人满意,但希望它会对问题所涉及的领域有所了解。

重申一下,最初的问题是计算四重积分

integrate(
    integrate(
        integrate(
            integrate(
                f(x1, x2, x3, x4),
                [1+abs(x3), -1-abs(x3)]
                ),
            [x2, -x2]
            ),
         [1-abs(x1), -x1**3]
         ),
    [-3, 1])

在数学上,人们可以将其表述为

integrate(f(x1, x2, x3, x4), Omega)

其中Omega是由上述积分限制定义的四维域。如果域名分为一维,二维或三维,那么您的问题的答案就很明确了:

  1. 将复杂域分为线,三角形或四面体(分别为尺寸1,2,3中的单形)(使用one of many { {3}} mesh),然后

  2. 在每条线/三角形/四面体上使用数字求积(例如,来自tools)。

  3. 不幸的是,我不知道有任何工具可以将四维域离散为4个单纯形,也不知道4个单纯形的正交规则(除了顶点和中点规则之外)。但是,两者都可以创造;特别是一堆正交规则应该很容易想出来。

    为了完整起见,我要提一下,至少有一类域可以在任何维度中存在集成规则:超立方体。

答案 1 :(得分:0)

更新

经过大量的测试和重组后,似乎最好的方法是不要嵌套函数或定义,而是利用scipy.integrate.quad函数中的args参数来传递外部变量到内部集成。

非常感谢那些评论的人!