【问题标题】:How to generate a random sample of points from a 3-D ellipsoid using Python?如何使用 Python 从 3-D 椭圆体生成点的随机样本?
【发布时间】:2019-10-17 15:40:43
【问题描述】:

我正在尝试从 3-D 椭球中均匀地采样大约 1000 个点。有没有什么方法可以编码,这样我们就可以从椭球方程开始得到点?

我想要椭球表面上的点。

【问题讨论】:

  • 请说明您是否希望这些点位于椭圆体内部在椭圆体表面。内部可能很容易,但表面上要困难得多。
  • 假设在里面,这本质上是stackoverflow.com/questions/5408276/…的副本。那是关于在球体内进行采样,但是任何椭球体只是仿射变换下的球体图像,并且仿射变换将保持均匀性。同意@RoryDaulton 在表面上均匀采样是一个非常困难的问题。请说明您的需求!
  • 另外,请你举个例子来说明你对这个特定问题的“椭球方程”的意思吗?一般来说,有许多不同的方法来指定一个椭球体。
  • “椭球方程”是指Ax²+Bxy+Cy²+Dx+Ey+F=0 ?

标签: python math random geometry ellipse


【解决方案1】:

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

附注由于 OP 改变了他们的问题,这个答案不再有效。

【讨论】:

    【解决方案2】:

    J.F. Williamson,“随机选择分布在曲面上的点”,Physics in Medicine & Biology 32(10),1987,描述了在参数表面上选择均匀随机点的一般方法。它是一种接受/拒绝方法,根据其拉伸因子(梯度范数)接受或拒绝每个候选点。要将这种方法用于参数曲面,必须了解有关曲面的几件事,即——

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

    • uv的范围,

    • g(point),曲面上每个点的梯度范数(“拉伸因子”),以及

    • gmax,整个表面的最大值g

    那么算法是:

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

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

    【讨论】:

      【解决方案3】:

      这是一个通用函数,用于在球体、椭球体或任何具有 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/

      【讨论】:

      • 这不只是在球体上创建随机点,重新投影到椭球体吗?如果是,那么为什么结果分布会是均匀的就完全不明显了。其实不然。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      相关资源
      最近更新 更多