如何在 Python 中随机分布 N 个质量,使它们遵循 Plummer 密度分布

use*_*919 2 python physics

我正在用Python工作。我有N星星,每颗星星的质量都是一个太阳质量M_0。我想将这些恒星随机分布在半径为 的体积中R,使得密度分布遵循普卢默模型,由以下公式给出:

在此输入图像描述

我知道M在这种情况下这是总簇质量M=NM_0,但不确定我将如何编码这种质量分布。

Sim*_*ons 5

在接下来的内容中,我将假设您numpy在 python 中使用导入为

\n
import numpy as np\n
Run Code Online (Sandbox Code Playgroud)\n

最简单的方法是在球极坐标 (r,\xce\xb8,\xcf\x86) 中工作

\n
    \n
  • x = r sin(\xce\xb8) cos(\xcf\x86)
  • \n
  • y = r sin(\xce\xb8) sin(\xcf\x86)
  • \n
  • z = r cos(\xce\xb8)
  • \n
\n

然后,您需要一种依次选择其中每一个的方法。

\n

角坐标是最简单的,所以我们可以从这些开始。这里我们要选择角度 \xce\xb8 和 \xcf\x86 以便它们均匀分布在球体表面上。

\n

方位角 (\xcf\x86)

\n

由于区域元素中没有附加因素,因此可以在 [0,2\xcf\x80) 范围内统一选择

\n
phi = np.random.uniform(0, 2*np.pi)\n
Run Code Online (Sandbox Code Playgroud)\n

极角 (\xce\xb8)

\n

这里我们需要选择这个,以便sin(\xce\xb8)d\xce\xb8是统一的,注意我们可以写sin(\xce\xb8)d\xce\xb8 = d(cos(\xce\xb8))换句话说,对于 \xce\xb8 的每个值,我们选择的 cos(\xce\xb8) 需要具有相同的可能性。如果我们在 [-1,1) 之间采样 cos(\xce\xb8) 那么这将给出 \xce\xb8 值的正确分布

\n
theta = np.arccos( np.random.uniform(-1,1) )\n
Run Code Online (Sandbox Code Playgroud)\n

半径 (r)

\n

现在我们有了一种在球体表面随机分布点的方法,我们现在需要一种了解半径如何分布的方法。

\n

为此,我们需要累积质量分布

\n

在此输入图像描述

\n

这是普卢默球体中心半径 r 处包围的质量量。

\n

当我们创建一颗新恒星并将其放置在半径 r 处时,该恒星\n将在比其自身位置更靠近中心的位置看到星团的一定质量 m(r),因此也会有一定质量 M \xe2 \x88\x92 m(r) 位于距中心较远的位置。

\n

换句话说,它将看到其径向位置内总质量的一部分 m(r)/M。现在这个分数可以是 0 到 1 之间的任何值。如果粒子恰好放置在中心,则分数将为 0;如果粒子放置得很远,则分数将接近 1;当粒子放置在无穷远时,分数将接近 1。

\n

每个颗粒的排名,就封闭的质量而言,是随机的,并且质量分数是均匀的。换句话说,m(r)/M 将是 0 到 1 之间的随机值,每个值的可能性相同。

\n

因此,为了得到半径的表达式,我们需要对 m(r) 求逆,得到 r(m) 质量分数 m 所在的半径

\n

在此输入图像描述

\n

因此,如果我们在 [0,1) 中选择 m 均匀值,我们就可以使用该方程将其转换为正确的半径。

\n
r = a / np.sqrt( np.random.uniform(0, 1)**(-2.0 / 3.0) - 1)\n
Run Code Online (Sandbox Code Playgroud)\n

一旦你有了这些坐标,你就可以使用我上面给出的表达式将它们转换回笛卡尔坐标。

\n

这将完成一颗星的任务,我将让您弄清楚如何在 python 中有效地完成 n 任务。

\n

参考

\n

我的这个答案很大程度上基于计算科学的艺术也看到了如何从普卢默分布函数自洽地分配速度。

\n

我在这里描述的方法可以在附录中找到Aarseth 等人的附录中找到。等人。1974年

\n