Я пытаюсь равномерно выбрать около 1000 точек из трехмерного эллипсоида. Есть ли способ закодировать его так, чтобы мы могли получать точки, начиная с уравнения эллипсоида?
Мне нужны точки на поверхности эллипсоида.
Уточните, хотите ли вы, чтобы точки были внутри эллипсоидом или на поверхности эллипсоидом. Внутри может быть легко, но на поверхности гораздо сложнее.
Предполагая внутри, это по сути дубликат stackoverflow.com/questions/5408276/…. Речь идет о выборке внутри сферы, но любой эллипсоид — это просто изображение сферы при аффинном преобразовании, и это аффинное преобразование сохранит единообразие. Согласен с @RoryDaulton, что однородная выборка на поверхности является значительно более сложной проблемой. Пожалуйста, уточните свои потребности!
Кроме того, не могли бы вы привести пример, показывающий, что вы подразумеваете под «уравнением эллипсоида» для этой конкретной задачи? В общем, есть много разных способов задать эллипсоид.
@MarkDickinson Аффинное преобразование в общем не сохраняет единообразия во всех трех измерениях.
@MarkDickinson Конечно, нет. Возьмите равномерно заполненный единичный круг и масштабируйте его только по одной оси с коэффициентом 1000. Точки по-прежнему будут равномерно распределены в каждом измерении, но не в 2D.
@MarkDickinson существует разница между предельной (по размеру) однородностью и однородной плотностью как n/(dx*dy).
@RoryDaulton Я отредактировал вопрос. Мне нужны точки на поверхности.
@MarkDickinson любая форма подойдет. Я отрегулирую. Мне просто нужна подсказка, как действовать дальше.
@MarkDickinson Просто рассчитайте плотность по исходной оси (N/1) и по масштабированной оси (N/1000). Как они равны?
@MarkDickinson Точно. А аффинные преобразования изменяют меры неравномерно. Длина осей меняется, но количество очков (вероятность приземления) не меняется.
Под «уравнением эллипсоида» вы имеете в виду Ax²+Bxy+Cy²+Dx+Ey+F=0 ?
Нет, пожалуйста, поймите, что я работаю здесь в 3D.






Рассмотрите возможность использования симуляции Монте-Карло: сгенерируйте случайную трехмерную точку; проверить, находится ли точка внутри эллипсоида; если есть, то держи. Повторяйте, пока не наберете 1000 очков.
P.S. Поскольку ОП изменил свой вопрос, этот ответ больше недействителен.
Дж. Ф. Уильямсон, «Случайный выбор точек, распределенных по криволинейным поверхностям», Физика в медицине и биологии 32(10), 1987, описывает общий метод выбора равномерно случайной точки на параметрической поверхности. Это метод принятия/отклонения, который принимает или отклоняет каждую точку-кандидата в зависимости от ее коэффициента растяжения (нормы градиента). Чтобы использовать этот метод для параметрической поверхности, необходимо знать несколько вещей о поверхности, а именно:
x(u, v), y(u, v) и z(u, v), которые являются функциями, которые генерируют трехмерные координаты из двухмерных координат u и v,
Диапазоны u и v,
g(point), норма градиента («коэффициент растяжения») в каждой точке поверхности, и
gmax, максимальное значение g для всей поверхности.
Тогда алгоритм такой:
xyz.g(xyz) >= RNDU01()*gmax, где RNDU01() — равномерное случайное число из [0, 1), принять балл. В противном случае повторите этот процесс.Чен и Глотцер (2007) применили этот метод к поверхности вытянутого сфероида (одна из форм эллипсоида) в «Имитационных исследованиях феноменологической модели формирования удлиненного вирусного капсида», arXiv: cond-mat/0701125 [cond-mat.soft ].
Вот общая функция для выбора случайной точки на поверхности сферы, сфероида или любого трехосного эллипсоида с параметрами 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/
Разве это не просто создание случайных точек на сфере, перепроецированных на эллипсоид? Если да, то совсем не очевидно, почему результирующее распределение будет равномерным. На самом деле это не так.
Связано: math.stackexchange.com/questions/973101/…