簡體   English   中英

python中的多處理嵌套數值積分

[英]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是由上述積分極限定義的三維域。 如果域是一維,二維或三維的,那么您的問題的答案將很清楚:

  1. 離散的復數域到線,三角形,或四面體(這些都是在尺寸1,2,3中的單純形,分別地)(使用一個 許多 網狀 工具 ),然后

  2. 在每條線/三角形/四面體上使用數字正交(例如,從此處開始 )。

不幸的是,我不知道有任何工具可以將四維域離散化為4個單純形,也不知道4個單純形的正交規則(也許除了頂點和中點規則)。 但是,兩者都可以總體上創建; 特別是一堆正交規則應該很容易提出。

為了完整起見,讓我提及至少在任何維度上都存在集成規則的一類域:超立方體。

更新:

經過大量的測試和重組后,似乎最好的解決方法不是嵌套函數或定義,而是利用scipy.integrate.quad函數中的args參數將外部變量傳遞給內部整合。

非常感謝那些發表評論的人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM