如何使用Python从3-D椭圆体生成随机的点样本?

时间:2019-06-01 06:29:28

标签: python math random geometry ellipse

我正在尝试从3-D椭圆形均匀采样大约1000个点。有什么编码方法可以使我们从椭球方程开始求点吗?

3 个答案:

答案 0 :(得分:2)

考虑使用蒙特卡洛模拟:生成一个随机的3D点;检查点是否在椭球内;如果是这样,请保留它。重复直到获得1,000分。

答案 1 :(得分:2)

这是一个通用函数,用于在具有a,b和c参数的球体,椭球或任何三轴椭圆体的表面上拾取随机点。请注意,直接生成角度将不会提供均匀的分布,并且会导致沿z方向的点过多。相反,phi是作为随机生成的cos(phi)的逆获得的。

    import numpy as np
    def random_point_ellipsoid(a,b,c):
        u = np.random.rand()
        v = np.random.rand()
        theta = u * 2.0 * np.pi
        phi = np.arccos(2.0 * v - 1.0)
        sinTheta = np.sin(theta);
        cosTheta = np.cos(theta);
        sinPhi = np.sin(phi);
        cosPhi = np.cos(phi);
        rx = a * sinPhi * cosTheta;
        ry = b * sinPhi * sinTheta;
        rz = c * cosPhi;
        return rx, ry, rz

此功能采用于此帖子:https://karthikkaranth.me/blog/generating-random-points-in-a-sphere/

答案 2 :(得分:1)

J.F。威廉姆森(Williamson),“随机选择分布在曲面上的点”,物理学与生物学 32(10),1987年,描述了一种选择参量表面上均匀随机点的一般方法。它是一种接受/拒绝方法,根据其拉伸因子(梯度范数)接受或拒绝每个候选点。要将这种方法用于参数化曲面,必须了解该曲面的几件事,即

  • x(u, v)y(u, v)z(u, v),它们是从二维坐标uv生成3维坐标的函数,< / p>

  • uv的范围,

  • g(point),表面上每个点的梯度范数(“拉伸因子”),以及
  • gmax,整个表面的最大值g

那么算法是:

  • 在表面xyz上生成一个点。
  • 如果g(xyz) >= RNDU01()*gmax,其中RNDU01()是[0,1)中的随机数,请接受该点。否则,请重复此过程。

Chen and Glotzer(2007)在“长形病毒衣壳形成的现象模型的模拟研究”,arXiv:cond-mat / 0701125中使用了该方法,将其应用于扁长球体(一种椭圆体形式)的表面。 mat.soft]。