接下来我将假设您正在使用numpy
在 python 中导入为
import numpy as np
最简单的方法是在球极坐标 (r,θ,φ) 中工作
- x = r sin(θ) cos(φ)
- y = r sin(θ) sin(φ)
- z = r cos(θ)
然后,您需要一种依次选择其中每一个的方法。
角坐标是最简单的,所以我们可以从这些开始。这里我们要选择角度 θ 和 φ,使它们均匀分布在球体的表面上。
方位角 (φ)
由于面积元素中没有附加因素,因此可以在 [0,2π) 范围内统一选择
phi = np.random.uniform(0, 2*np.pi)
极角 (θ)
这里我们需要选择这个,以便 sin(θ)dθ 是统一的,注意我们可以写 sin(θ)dθ = d(cos(θ)),换句话说,对于我们选择 cos(θ) 需要的每个 θ 值是同等可能的。如果我们在 [-1,1) 之间采样 cos(θ) 那么这将给出 θ 值的正确分布
theta = np.arccos( np.random.uniform(-1,1) )
半径 (r)
现在我们有了一种在球体表面随机分布点的方法,我们现在需要一种了解半径如何分布的方法。
为此,我们需要累积质量分布
这是普卢默球体中心半径 r 处包围的质量量。
当我们创建一颗新恒星并将其放置在半径 r 处时,该恒星
将在比其自身位置更靠近中心的位置处看到簇的质量量 m(r),因此在距中心更远的位置处会看到质量量 M − m(r)。
换句话说,它将看到其径向位置内总质量的一部分 m(r)/M。现在这个分数可以是 0 到 1 之间的任何值。如果粒子恰好放置在中心,则分数将为 0;如果粒子放置得很远,则分数将接近 1;当粒子放置在无穷远时,分数将接近 1。
每个颗粒的排名,就封闭的质量而言,是随机的,并且质量分数是均匀的。换句话说,m(r)/M 将是 0 到 1 之间的随机值,每个值的可能性相同。
因此,为了得到半径的表达式,我们需要对 m(r) 求逆,得到 r(m) 质量分数 m 所在的半径
因此,如果我们在 [0,1) 中选择 m 均匀值,我们就可以使用该方程将其转换为正确的半径。
r = a / np.sqrt( np.random.uniform(0, 1)**(-2.0 / 3.0) - 1)
一旦你有了这些坐标,你就可以使用我上面给出的表达式将它们转换回笛卡尔坐标。
这将完成一颗星,我将留给你弄清楚如何在 python 中有效地完成 n 。
参考
我这个答案很大程度上基于计算科学的艺术 http://www.artcompsci.org/kali/vol/plummer/volume11.pdf另请参阅如何从 Plummer 分布函数自洽地分配速度。
我在这里描述的方法可以在附录中找到阿尔塞斯等。等人。 1974年 http://adsabs.harvard.edu/abs/1974A%26A....37..183A