3D에 포함 된 2D 영역에 대한 많은 유사한 수치 적분의 계산 속도를 높입니다.

Nov 18 2020

도메인 세트와 통합 세트가 있습니다. 각 도메인에 대해 각 적분을 수치 적으로 통합하고 싶습니다. 이를 수행하는 가장 효율적인 방법은 무엇입니까? 제 경우에는 특히 3D 공간에 2D 도메인이 포함되어 있습니다.

내가 해결하고 싶은 문제의 최소 작업 예 :

params = RandomReal[{1, 2}, {10, 6}];
doms = Triangle /@ RandomReal[{1, 2}, {10, 3, 3}];
expr[a_, b_, c_, x_, y_, z_] = ((a xp + b yp + c zp)/
    Sqrt[(x - xp)^2 + (y - yp)^2 + (z - zp)^2]);
MapThread[NIntegrate[Evaluate[expr @@ #1], {xp, yp, zp} \[Element] #2] &, 
 Transpose[Tuples[{params, doms}]]]

답변

1 cvgmt Nov 18 2020 at 11:42

여기서 우리는 코드 속도를 높일 수는 없지만 코드를 단순화 할뿐입니다.

params = Permutations[Range[2, 5], {3}];
doms = Triangle /@ Partition[params, 3];
expr[a_, b_, c_] = ((a xp + b yp + c zp)/Sqrt[xp^2 + yp^2 + zp^2]);
r1 = MapThread[
   NIntegrate[Evaluate[expr @@ #1], {xp, yp, zp} ∈ #2] &, 
   Transpose[Tuples[{params, doms}]]];
r2 = Table[
    NIntegrate[expr @@ param, {xp, yp, zp} ∈ dom], {param, 
     params}, {dom, doms}] // Flatten;
r3 = Outer[NIntegrate[expr @@ #1, {xp, yp, zp} ∈ #2] &, 
    params, doms, 1] // Flatten;
r1 == r2 == r3
(* True *)
1 HenrikSchumacher Nov 18 2020 at 23:00

적분은 매개 변수에 선형 적으로 만 의존한다는 것을 악용 할 수 있습니다. 따라서 {xp, yp, zp}/Sqrt[xp^2 + yp^2 + zp^2]각 삼각형에서 한 번만 적분을 계산하는 것으로 충분합니다 . 내 컴퓨터에서 (강제 병렬화없이) 이로 인해 요소 8.5의 속도가 향상됩니다.

First@AbsoluteTiming[
  
  A = MapThread[
     NIntegrate[Evaluate[expr @@ #1], {xp, yp, zp} \[Element] #2] &, 
     Transpose[Tuples[{params, doms}]]];
  
  ]

First@AbsoluteTiming[
  
  ints = NIntegrate[
       {xp, yp, zp}/Sqrt[xp^2 + yp^2 + zp^2], 
       {xp, yp, zp} \[Element] #
       ] & /@ doms;
  B = Flatten[Outer[Dot, params, ints, 1]];
  
  ]
Max[Abs[(B - A)/A]]

> 1.40043
> 
> 0.163504
> 
> 3.80123*10^-8