私は各レイヤの限界が次のレイヤーに依存する、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
にあった。しかし、私は、入力としても(パーシャルの故に私の使用)としての限界を通過することができる機能を必要としています。
誰でもこれらの問題を解決する方法を知っていますか?私は解決策は複数の入力を処理するpool.mapのいくつかのバージョンは素晴らしいと思うが、私の部分的な使用に間違っている場合は、それも見つけることが素晴らしいだろう。
お返事ありがとうございます。ここに何かがある場合はお知らせください。
私が与えたコード例のように、各内側の層の限界は、外側の層の結果に依存します。それらが大域関数であれば、限界は浮動小数点として処理することはできず、積分は数値的に評価することはできません – PhysicistAbroad
どうすれば限界に言及したのでしょうか?書かれたネストされたインテグラルと同じように、順番に評価する必要があります – PhysicistAbroad
私はうまくいけませんか、私はここで2つを学ぶかもしれません:)最終結果は '-22576720.048151683'でしょうか? – roganjosh