Как рассчитать массу неоднородной сферы? - PullRequest
2 голосов
/ 10 декабря 2010

Я хочу рассчитать массу сферы на основе трехмерного дискретного неоднородного распределения плотности. Допустим, набор кубиков 3x3x3 различной плотности вписан в сферу. Какой самый быстрый способ суммировать разделенные массы с помощью Python?

Я попытался вычислить объем по математическому уравнению для сферы: x ^ 2 + y ^ 2 + z ^ 2 = R ^ 2 для диапазона одного из кубов, используя scipy.integrate.dblquad . Однако результат действителен только в том случае, если границы меньше радиуса сферы, и повторные вычисления, скажем, для 50 000 сфер по 27 кубов будут довольно медленными.

С другой стороны, обычное уравнение для расчетов CoM, по моему мнению, не могло быть использовано из-за довольно грубого и дискретного распределения массы.

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

Сроки Эксперимент

Вы не указали свои временные ограничения, поэтому я провел небольшой эксперимент с хорошим пакетом интеграции.

Без оптимизации каждый интеграл в сферических координатах можно оценить в 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 итерации.

Так что, возможно, вам не нужно много оптимизировать ...

0 голосов
/ 11 декабря 2010

Вы можете получить аналитическую формулу для пересекающегося объема между кубом (или прямоугольной призмой) и сферой. Это будет нелегко, но это должно быть возможно. Я сделал это для произвольного треугольника и круга в 2D. Основная идея состоит в том, чтобы разложить пересечение на более простые части, такие как тетраэдры и объемные сферические треугольные сектора, для которых известны относительно простые формулы объема. Главное сложнее в рассмотрении всех возможных случаев пересечений. К счастью, оба объекта являются выпуклыми, поэтому вам гарантирован один выпуклый объем пересечения.

Примерный метод может состоять в том, чтобы просто подразделить кубы, пока ваш приближенный алгоритм численного интегрирования не сработает; это все еще должно быть относительно быстро. Вы знаете о теореме Пика ? Это работает только в 2D, но, я думаю, есть 3D обобщений .

0 голосов
/ 10 декабря 2010

Я не могу получить ваше точное значение надписи сферой.Также я не пробовал scipy.integrate.Тем не менее, вот некоторые из них:

Установите куб 3x3x3 для удельной плотности.Затем возьмите интеграцию для каждого куба соответственно, так что у вас должен быть объемный куб V_ijk здесь.Теперь для каждой сферы вы можете получить массу каждой сферы, суммируя V_ijk*D_ijk, где D_ijk - плотность сферы.

Это должно быть намного быстрее, потому что вам не нужно делатьинтеграция сейчас.

...