2

각 레이어의 한계가 다음 레이어에 의존하는 파이썬에서 중첩 된 수치 적분으로 작업하고 있습니다. 내 코드의 전체 구조가 보이는 내 코드의 전체 버전에파이썬에서 중첩 된 수치 적분을

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의 일부 버전이 될 것이라고 생각합니다.하지만 partials를 사용하는 데 문제가있는 경우 알아두면 좋을 것입니다.

미리 감사 드리며 정리 해줄 수있는 것이 있다면 알려주세요!

+0

예제 코드에서와 같이 각 내부 계층의 한계는 외부 계층의 결과에 따라 다릅니다. 전역 함수라면 한계는 부동 소수점으로 처리 될 수 없으며 정수는 수치로 계산할 수 없습니다 – PhysicistAbroad

+0

한계로 언급 한 것을 어떻게 해결할 수 있습니까? 서면 중첩 된 integrals 에서처럼, 그들은 순차적으로 평가해야합니다. – PhysicistAbroad

+0

나는 잘할 수 있고, 나는 한두 가지를 배울 수 있습니다 :) 최종 결과는'-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. 분리 (Discretize) 복잡한 도메인 선, 삼각형, 또는 사면체로 (그 치수 1의 simplices은, here에서 라인/삼각형/사면체 (예를 들어 각각의 oneofmanymeshtools) 다음

  2. 사용 직교 수치를 이용하여 2, 3을 각각()).

불행하게도, 내가 4 simplices에 4 차원 도메인을 이산 어떤 도구 잘 모르는 것 같아요,도 4 simplices에 대한 직교 규칙의 (아마도 제외하고는 정점과 중간 규칙). 그러나 둘 다 일반적으로 만들 수 있습니다. 특히 쿼드 러처 규칙은 쉽게 생겨나 야합니다.

완전성을 위해 모든 차원에서 통합 규칙이 존재하는 하나 이상의 도메인 클래스 인 하이퍼 큐브가 있음을 알려드립니다.