How to generate a random sample of points from a 3-D ellipsoid using Python?

梦想与她 提交于 2020-06-27 22:58:45

问题


I am trying to sample around 1000 points from a 3-D ellipsoid, uniformly. Is there some way to code it such that we can get points starting from the equation of the ellipsoid?

I want points on the surface of the ellipsoid.


回答1:


Here is a generic function to pick a random point on a surface of a sphere, spheroid or any triaxial ellipsoid with a, b and c parameters. Note that generating angles directly will not provide uniform distribution and will cause excessive population of points along z direction. Instead, phi is obtained as an inverse of randomly generated 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

This function is adopted from this post: https://karthikkaranth.me/blog/generating-random-points-in-a-sphere/




回答2:


Consider using Monte-Carlo simulation: generate a random 3D point; check if the point is inside the ellipsoid; if it is, keep it. Repeat until you get 1,000 points.

P.S. Since the OP changed their question, this answer is no longer valid.




回答3:


J.F. Williamson, "Random selection of points distributed on curved surfaces", Physics in Medicine & Biology 32(10), 1987, describes a general method of choosing a uniformly random point on a parametric surface. It is an acceptance/rejection method that accepts or rejects each candidate point depending on its stretch factor (norm-of-gradient). To use this method for a parametric surface, several things have to be known about the surface, namely—

  • x(u, v), y(u, v) and z(u, v), which are functions that generate 3-dimensional coordinates from two dimensional coordinates u and v,

  • The ranges of u and v,

  • g(point), the norm of the gradient ("stretch factor") at each point on the surface, and
  • gmax, the maximum value of g for the entire surface.

The algorithm is then:

  • Generate a point on the surface, xyz.
  • If g(xyz) >= RNDU01()*gmax, where RNDU01() is a random number in [0, 1), accept the point. Otherwise, repeat this process.

Chen and Glotzer (2007) apply the method to the surface of a prolate spheroid (one form of ellipsoid) in "Simulation studies of a phenomenological model for elongated virus capsid formation", arXiv: cond-mat/0701125 [cond-mat.soft].



来源:https://stackoverflow.com/questions/56404399/how-to-generate-a-random-sample-of-points-from-a-3-d-ellipsoid-using-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!