Geometry 如何计算非均匀球体的质量?

Geometry 如何计算非均匀球体的质量?,geometry,volume,integrate,Geometry,Volume,Integrate,我想根据三维离散的非均匀密度分布来计算球体的质量。假设一组不同密度的3x3x3立方体被一个球体内接。使用Python总结分区质量的最快方法是什么 我试图用scipy.integrate.dblquad计算一个球体的数学方程下的体积:x^2+y^2+z^2=R^2,用于其中一个立方体的范围。 然而,只有当边界小于球体的半径时,结果才有效,并且对于50000个球体(每个球体有27个立方体)的重复计算将非常缓慢 另一方面,在我看来,由于质量分布相当粗糙和离散,通常的计算公式无法使用 我无法理解你所说的

我想根据三维离散的非均匀密度分布来计算球体的质量。假设一组不同密度的3x3x3立方体被一个球体内接。使用Python总结分区质量的最快方法是什么

我试图用scipy.integrate.dblquad计算一个球体的数学方程下的体积:x^2+y^2+z^2=R^2,用于其中一个立方体的范围。 然而,只有当边界小于球体的半径时,结果才有效,并且对于50000个球体(每个球体有27个立方体)的重复计算将非常缓慢


另一方面,在我看来,由于质量分布相当粗糙和离散,通常的计算公式无法使用

我无法理解你所说的被球体内接的确切含义。而且我还没有试过scipy.integrate。然而,以下是一些:

将3x3x3立方体设置为单位密度。然后分别对每个多维数据集进行积分,因此这里应该有体积多维数据集
V_ijk
。现在对于每个球体,可以通过求和
V_ijk*D_ijk
得到每个球体的质量,其中
D_ijk
是球体的密度


它应该快得多,因为您现在不需要进行积分。

您可以获得立方体(或矩形棱镜)和球体之间相交体积的解析公式。这并不容易,但应该是可能的。我已经做了二维任意三角形和圆的计算。基本思想是将交点分解为更简单的部分,如四面体和体积球面三角形扇形,相对简单的体积公式是已知的。主要困难在于考虑所有可能的交叉口情况。幸运的是,这两个对象都是凸面的,因此可以保证有一个凸面相交体积

一种近似方法可能是简单地细分立方体,直到近似数值积分算法开始工作;这应该还是比较快的。你知道吗?这只适用于2D,但我相信还有计时实验

您没有指定时间限制,所以我用一个很好的集成包做了一个小实验

在没有优化的情况下,如果立方体密度是简单的函数,则可以在标准笔记本电脑中以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]]  
Clear@f;
(*将长方体定义为密度函数*)
iP=整数部分;
f[{x_u,y_u,z_o},{lx_o,ly_o,lz_o}]:=iP[x-lx]+iP[y-ly]+iP[z-lz]/;

lx“小于半径”应为“小于半径”。使用“than”进行比较,“then”表示时间序列。如果立方体是同源的……只需将立方体的质量相加。如果立方体不是均匀的,让我们看看密度公式。你不需要CoM来计算质量。我认为这不是一个真正的问题,除非指定了立方体的密度。我认为你最好能问这个问题,首先澄清立方体的密度是否均匀,还有你所说的“内接”——我想你的意思是,球体内接了由27个立方体组成的立方体,但这只是一个猜测。如果这两个都是真的,你不需要数值积分,只要微积分。@AakashM:你的猜测是正确的。每个小立方体都由一个均匀的密度来描述,但与相邻的小立方体不同。通过“内接者”,我试图描述球体在一组3x3立方体中的位置。球体可能在集合空间的某个地方。这就是我尝试数值积分的原因,因为球体的方程是已知的。在我看来,我所需要的只是一种计算球体下方体积的方法,它属于每个立方体。