我在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时出了什么问题,那也是很好的发现。在
提前谢谢,如果这里有什么可以清理的,请告诉我!在
更新:
经过多次测试和重组后,似乎最好的解决方法不是嵌套函数或定义,而是在scipy.integrate.quad函数将外部变量传递给内部积分。在
非常感谢那些评论!在
这个答案可能并不令人满意,但希望它能让我们对问题所在的领域有所了解。在
重申一下,最初的问题是计算四重积分
从数学上讲,我们可以将其表述为
^{pr2}$其中
Omega
是由上述积分极限定义的四维域。如果这个领域是在一个、两个或三个维度,那么你的问题的答案就会很清楚:将复杂域离散成直线、三角形或四面体(分别是维度1、2、3中的简单体)(使用oneofmanymeshtools),然后
对每一条线/三角形/四面体使用数值求积(例如,从here开始)。
不幸的是,我不知道有什么工具可以将四维域离散成4个单形,也不知道4个单形的求积规则(可能除了顶点和中点规则)。然而,两者都有可能在一般情况下创建;特别是一组求积规则应该很容易想出。在
为了完整起见,让我提一下,至少有一类域在任何维度上都存在集成规则:超立方体。在
相关问题 更多 >
编程相关推荐