[英]Multiprocessing nested numerical integrals in 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並加快運行時間。
關於堆棧溢出的其他一些文章,我嘗試了以下操作:
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的使用出現問題,那么也很容易找到答案。
在此先感謝您,讓我知道這里是否有任何可以清除的內容!
這個答案可能並不令人滿意,但是希望它將對問題的領域有所了解。
重申一下,原始問題是計算四重積分
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
是由上述積分極限定義的三維域。 如果域是一維,二維或三維的,那么您的問題的答案將很清楚:
不幸的是,我不知道有任何工具可以將四維域離散化為4個單純形,也不知道4個單純形的正交規則(也許除了頂點和中點規則)。 但是,兩者都可以總體上創建; 特別是一堆正交規則應該很容易提出。
為了完整起見,讓我提及至少在任何維度上都存在集成規則的一類域:超立方體。
更新:
經過大量的測試和重組后,似乎最好的解決方法不是嵌套函數或定義,而是利用scipy.integrate.quad函數中的args參數將外部變量傳遞給內部整合。
非常感謝那些發表評論的人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.