计时实验
你没有指定你的时间限制,所以我用一个很好的集成包做了一个小实验。
如果立方体密度是简单的函数,则在没有优化的情况下,可以在标准笔记本电脑中在 0.005 秒内评估球坐标中的每个积分。
作为参考,这是 Mathematica 中的程序:
Clear@f;
(* Define a cuboid as density function *)
iP = IntegerPart;
f[{x_, y_, z_}, {lx_, ly_, lz_}] := iP[x - lx] + iP[y - ly] + iP[z - lz] /;
lx <= x <= lx + 3 && ly <= y <= ly + 3 && lz <= z <= lz + 3;
f[{x_, y_, z_}, {lx_, ly_, lz_}] := Break[] /; True;
Timing[Table[s = RandomReal[{0, 3}, 3]; (*sphere center random*)
sphereRadius = Min[Union[s, 3 - s]]; (*max radius inside cuboid *)
NIntegrate[(f[{x, y, z} - s, -s] /. (*integrate in spherical coords *)
{x -> r Cos@th Sin@phi,
y -> r Sin@th Sin@phi,
z -> r Cos@phi}) r^2 Sin@phi,
{r, 0, sphereRadius}, {th, 0, 2 Pi}, {phi, 0, Pi}],
{10000}]][[1]]
结果是52 秒,10^4 次迭代。
所以也许你不需要优化很多......