我想基于三维离散不均匀密度分布来计算球体的质量。让我们说一组3x3x3不同密度的立方体由一个球体刻上。使用Python总结分区质量的最快方法是什么?
我试图用球体的数学方程式计算体积:x ^ 2 + y ^ 2 + z ^ 2 = R ^ 2,其中一个立方体的范围使用 scipy.integrate.dblquad < / em>的。 然而,结果仅在边界小于球体半径的情况下才有效,并且重复计算可以说50'000球体,每个球体具有27个立方体,这将非常慢。
另一方面,由于相当粗糙和离散的质量分布,我认为不能使用通常的CoM驯化方程。
答案 0 :(得分:1)
计时实验
你没有指定时间限制,所以我做了一个很好的集成包的实验。
如果没有优化,如果立方体密度是简单的函数,则在标准笔记本电脑中可以在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次迭代。
所以也许你不需要优化很多......
答案 1 :(得分:0)
我无法得到你用球体刻的确切含义。我也没有尝试过scipy.integrate。但是,这里有一些:
将3x3x3立方体设置为单位密度。然后分别对每个多维数据集进行集成,因此您应该在此处拥有卷多维数据集 V_ijk
。现在对于每个球体,您可以通过求和V_ijk*D_ijk
得到每个球体的质量,其中D_ijk
是球体的密度。
它应该快得多,因为你现在不需要进行集成。
答案 2 :(得分:0)
您可以获得立方体(或矩形棱柱)与球体之间相交体积的分析公式。这并不容易,但它应该是可能的。我已经完成了2D任意三角形和圆形。基本思想是将交叉点分解为更简单的部分,如四面体和体积球形三角形扇区,其中已知相对简单的体积公式。主要困难在于考虑交叉路口的所有可能情况。幸运的是,两个物体都是凸面的,因此可以保证单个凸交点体积。
近似方法可能是简单地细分立方体,直到您的近似数值积分算法起作用;这应该还是比较快的。你知道Pick's Theorem吗?这仅适用于2D,但我相信3D generalizations。