NIntegrated 함수의 상징적으로 처리 된 형태 추출

Nov 16 2020

내가 이해하는 바와 같이 NIntegrate는 실제로 진행되고 수치 적으로 통합되기 전에 입력의 상징적 전처리를 수행합니다. 이 중간 사전 조건 형식에 액세스 할 수있는 방법이 있는지 궁금합니다.

제가 보여 드리겠습니다.

expr[a_, b_, c_] = -((a xp + b yp - c zp)/Sqrt[(0.5` - xp)^2 + yp^2 + zp^2]);
dom = Triangle[{{0.`, 0.`, 1.`}, {0.25, 0.8, 0.4}, {-0.7, 0.5, 0.4}}];
Timing[NIntegrate[expr[1,2,3], {xp, yp, zp} \[Element] dom]]
Timing[NIntegrate[expr[1,2,3], {xp, yp, zp} \[Element] dom, 
  Method -> {Automatic, "SymbolicProcessing" -> 0}]]

{0.03125, 0.474964}
{0.21875, 0.47448}

보시다시피 NIntegrate가 입력을 사전 조정하도록 허용하면 건강한 성능 향상이 있습니다.

다른 도메인과 다른 매개 변수에 대해 수천 개 이상의 유사한 적분을 계산해야합니다. 매번이 단순화 단계를 복제하는 대신 매개 변수를 직접 삽입하거나 컴파일 할 수 있도록이 사전 조건화 된 양식에 액세스 할 수 있다면 좋을 것입니다.

답변

6 AntonAntonov Nov 17 2020 at 01:52

기호 전처리 후 IntegrationMonitor적분 및 영역 NIntegrate계산 을 검사하는 데 사용할 수 있습니다 .

다음은 그 예입니다.

NIntegrate[expr[1, 2, 3], {xp, yp, zp} \[Element] dom, 
 MaxRecursion -> 0, PrecisionGoal -> 1, IntegrationMonitor -> Print]

(* During evaluation of In[35]:= {NIntegrate`IntegrationRegion[{{0,0},{1,1}},Experimental`NumericalFunction[{xp,yp},-((3.21926 (1-xp) (-0.821918+1. xp+0.575342 (1-xp) yp))/Sqrt[1.17647 -1.36471 xp+1. xp^2-0.470588 (1-xp) yp+1.10118 (1-xp) xp yp+1.03529 (1-xp)^2 yp^2]),-NumericalFunctionData-],{},NIntegrate`MultiDimensionalRule[{{{{0.,0.},{0.179284,0.},{0.474342,0.},{0.474342,0.474342},{0.344124,0.344124}},{-0.193873,0.149367,0.0518214,0.0101611,0.0871183},{1.13809,-0.354748,0.00723975,-0.0241325,0.0871183}},{{},{},{},{}},{2,5,-1}}]]} *)

(* 0.474984 *)