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

2024-09-28 20:46:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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,并加快运行时间。在

我试着引用了其他的一些帖子:

^{pr2}$

但是我得到一个错误,本地对象不能被pickle。在

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

但是我需要一个函数,在这个函数中,我也可以将限制作为输入传递(因此我使用了partials)。在

有人知道如何解决这些问题吗?我想解决办法是池.map它可以处理多个输入是很好的,但是如果我在使用partials时出了什么问题,那也是很好的发现。在

提前谢谢,如果这里有什么可以清理的,请告诉我!在


Tags: returndefnpabspartiala3a4func
2条回答

更新:

经过多次测试和重组后,似乎最好的解决方法不是嵌套函数或定义,而是在scipy.integrate.quad函数将外部变量传递给内部积分。在

非常感谢那些评论!在

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

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

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

从数学上讲,我们可以将其表述为

^{pr2}$

其中Omega是由上述积分极限定义的四维域。如果这个领域是在一个、两个或三个维度,那么你的问题的答案就会很清楚:

  1. 将复杂域离散成直线、三角形或四面体(分别是维度1、2、3中的简单体)(使用oneofmanymeshtools),然后

  2. 对每一条线/三角形/四面体使用数值求积(例如,从here开始)。

不幸的是,我不知道有什么工具可以将四维域离散成4个单形,也不知道4个单形的求积规则(可能除了顶点和中点规则)。然而,两者都有可能在一般情况下创建;特别是一组求积规则应该很容易想出。在

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

相关问题 更多 >