2

三次元の離散的な不均一な密度分布に基づいて球の質量を計算したいと思います。密度の異なる3x3x3の立方体のセットが球によって内接しているとしましょう。Pythonを使用して分割された質量を合計する最も速い方法は何ですか?

球の数式の下で体積を計算しようとしました:scipy.integrate.dblquadを使用して、立方体の1つの範囲に対してx ^ 2 + y ^ 2 + z ^ 2 = R^2 。ただし、結果は、境界が球の半径よりも小さい場合にのみ有効であり、たとえば、それぞれ27個の立方体を持つ50,000個の球の反復計算は非常に遅くなります。

一方、CoM計算の通常の方程式は、かなり粗く離散的な質量分布のため、私の意見では使用できませんでした。

4

3 に答える 3

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]]  

結果は、10^4 反復で 52 秒です。

したがって、おそらく多くを最適化する必要はありません...

于 2010-12-13T00:27:36.000 に答える
0

球に内接するというあなたの正確な意味を理解できません。また、私はscipy.integrateを試していません。ただし、ここにいくつかあります:

3x3x3 の立方体を単位密度に設定します。次に、各キューブの統合をそれぞれ行うため、ここにボリューム キューブ V_ijkが必要です。これで、各球について、 を合計することで各球の質量を取得できますV_ijk*D_ijk。ここで、D_ijkは球の密度です。

今すぐ統合を行う必要がないため、はるかに高速になるはずです。

于 2010-12-10T19:15:19.983 に答える
0

立方体 (または直角プリズム) と球の間の交差体積の解析式を取得できます。簡単ではありませんが、可能になるはずです。2D の任意の三角形と円に対して実行しました。基本的な考え方は、交点を、比較的単純な体積公式が知られている四面体や体積球面三角形セクターなどの単純な部分に分解することです。主な困難は、考えられる交差のすべてのケースを考慮することです。幸いなことに、両方のオブジェクトが凸状であるため、単一の凸状交差ボリュームが保証されます。

おおよその方法は、おおよその数値積分アルゴリズムが機能するまでキューブを単純に分割することです。これはまだ比較的速いはずです。ピックの定理を知っていますか?これは 2D でのみ機能しますが、3D の一般化もあると思います。

于 2010-12-10T21:44:15.393 に答える