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