2010-12-10 992 views
2

我想根據三維離散不均勻密度分佈計算球體的質量。可以說一組3×3×3不同密度的立方​​體被一個球體刻成。使用Python總結分區大衆的最快方法是什麼?如何計算不均勻球體的質量?

我試圖計算數學方程下的體積爲球體:X^2 + Y^2 + Z^2 = R^2使用scipy.integrate.dblquad立方體中的一個的範圍內。 然而,只有當邊界小於球體的半徑並且重複計算讓我們說50'000球體和27個立方體體積都相當緩慢時,結果纔有效。

另一方面,由於相當粗糙和離散的質量分佈,我認爲通常的CoM調用方程不適用。

+1

「然後小半徑」應該是「比半徑」。比較用「than」,然後用「時間順序」。 – 2010-12-10 19:03:23

+0

如果立方體是原生的......只需加上立方體的質量即可。如果立方體不均勻,讓我們看看密度公式。您不需要CoM來計算質量。 – 2010-12-10 19:08:16

+0

我認爲這不是一個真正的問題,除非指定了立方體的密度。 – 2010-12-10 19:17:58

回答

0

我無法得到你刻劃球體的確切含義。我也沒有試過scipy.integrate。但是,這裏有一些:

設置一個3x3x3立方體單位密度。然後分別對每個立方體進行集成,因此您應該在此處有體積立方體V_ijk。現在對於每個球體,可以通過求和V_ijk*D_ijk來獲得每個球體的質量,其中D_ijk是球體的密度。

它應該快得多,因爲您現在不需要進行集成。

0

您可以獲得立方體(或直角棱鏡)和球體之間相交體積的解析公式。這並不容易,但它應該是可能的。我已經完成了2D中的任意三角形和圓。基本思想是將交點分解成更簡單的部分,如四面體和體積三角形部分,對於這些部分已知相對簡單的體積公式。主要困難在於考慮所有可能的交叉點情況。幸運的是,兩個對象都是凸的,所以你可以保證有一個凸的交叉點體積。

近似的方法可能是簡單地細分立方體,直到近似數值積分算法確實起作用;這應該還是比較快的。你知道嗎Pick's Theorem?這隻適用於2D,但我相信3D generalizations

1

時序實驗

你沒有指定時間限制,所以我做了一個小實驗,一個不錯的集成包。

沒有優化,如果立方體密度是直接函數,那麼在標準筆記本電腦中,每個球面座標積分可以在0.005秒內評估。

只是作爲參考,這是在數學程序:

[email protected]; 
(* 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 [email protected] [email protected], 
     y -> r [email protected] [email protected], 
     z -> r [email protected]}) r^2 [email protected], 
     {r, 0, sphereRadius}, {th, 0, 2 Pi}, {phi, 0, Pi}], 
     {10000}]][[1]] 

結果是52秒爲10^4次迭代。

因此,也許你並不需要優化了很多...