2

私は各レイヤの限界が次のレイヤーに依存する、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のいくつかのバージョンは素晴らしいと思うが、私の部分的な使用に間違っている場合は、それも見つけることが素晴らしいだろう。

お返事ありがとうございます。ここに何かがある場合はお知らせください。

+0

私が与えたコード例のように、各内側の層の限界は、外側の層の結果に依存します。それらが大域関数であれば、限界は浮動小数点として処理することはできず、積分は数値的に評価することはできません – PhysicistAbroad

+0

どうすれば限界に言及したのでしょうか?書かれたネストされたインテグラルと同じように、順番に評価する必要があります – PhysicistAbroad

+0

私はうまくいけませんか、私はここで2つを学ぶかもしれません:)最終結果は '-22576720.048151683'でしょうか? – roganjosh

答えて

0

更新:

多くのテストと再構築した後、このの世話をするための最良の方法は、巣に機能や定義ではなく、scipyのダウンロードでの引数のパラメータを利用するように思われます。内部変数に外部変数を渡すintegrate.quad関数

コメントした人に多くの感謝!

0

この回答はおそらく満足できるものではありませんが、うまくいけば、問題がどの分野にあるかについてのいくつかの洞察を与えるでしょう。繰り返しに

は、元の問題は、Omega積分限界によって定義された4つの次元領域である一方は

integrate(f(x1, x2, x3, x4), Omega) 

としてこれを定式化することができ、数学的には四重積分

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

を計算することです上記。ドメインは、1、2、または3次元でされていた、そして、あなたの質問への答えは明らかである:

  1. は、それらが次元1で単体です(線、三角形、または四面体にあなたの複雑なドメインを離散化hereからライン/三角/四面体(例えば、それぞれにoneofmanymeshtools)、次いで

  2. 使用数値積分を用いて2、3、それぞれ())。

残念ながら、私は4-単体に4次元領域を離散任意のツールの、また(多分頂点との中間点の規則を除く)4-単体する直交ルールを認識していませんよ。しかし、どちらも一般的に作成することが可能です。特に、直交ルールの束は容易に出てくるはずです。

完全性のために、どの次元にも統合ルールが存在する少なくとも1つのクラスのドメインが存在することを言及しておきたいと思います。

関連する問題