Как создать случайную выборку точек из трехмерного эллипсоида с помощью Python?

Я пытаюсь равномерно выбрать около 1000 точек из трехмерного эллипсоида. Есть ли способ закодировать его так, чтобы мы могли получать точки, начиная с уравнения эллипсоида?

Мне нужны точки на поверхности эллипсоида.

Связано: math.stackexchange.com/questions/973101/…

Thierry Lathuille 01.06.2019 08:47

Уточните, хотите ли вы, чтобы точки были внутри эллипсоидом или на поверхности эллипсоидом. Внутри может быть легко, но на поверхности гораздо сложнее.

Rory Daulton 01.06.2019 12:07

Предполагая внутри, это по сути дубликат stackoverflow.com/questions/5408276/…. Речь идет о выборке внутри сферы, но любой эллипсоид — это просто изображение сферы при аффинном преобразовании, и это аффинное преобразование сохранит единообразие. Согласен с @RoryDaulton, что однородная выборка на поверхности является значительно более сложной проблемой. Пожалуйста, уточните свои потребности!

Mark Dickinson 01.06.2019 12:21

Кроме того, не могли бы вы привести пример, показывающий, что вы подразумеваете под «уравнением эллипсоида» для этой конкретной задачи? В общем, есть много разных способов задать эллипсоид.

Mark Dickinson 01.06.2019 12:26

@MarkDickinson Аффинное преобразование в общем не сохраняет единообразия во всех трех измерениях.

DYZ 01.06.2019 18:14

@MarkDickinson Конечно, нет. Возьмите равномерно заполненный единичный круг и масштабируйте его только по одной оси с коэффициентом 1000. Точки по-прежнему будут равномерно распределены в каждом измерении, но не в 2D.

DYZ 01.06.2019 22:20

@MarkDickinson существует разница между предельной (по размеру) однородностью и однородной плотностью как n/(dx*dy).

Severin Pappadeux 02.06.2019 04:41

@RoryDaulton Я отредактировал вопрос. Мне нужны точки на поверхности.

Anirban Mandal 02.06.2019 09:05

@MarkDickinson любая форма подойдет. Я отрегулирую. Мне просто нужна подсказка, как действовать дальше.

Anirban Mandal 02.06.2019 09:07

@MarkDickinson Просто рассчитайте плотность по исходной оси (N/1) и по масштабированной оси (N/1000). Как они равны?

DYZ 02.06.2019 10:12

@MarkDickinson Точно. А аффинные преобразования изменяют меры неравномерно. Длина осей меняется, но количество очков (вероятность приземления) не меняется.

DYZ 02.06.2019 10:18

Под «уравнением эллипсоида» вы имеете в виду Ax²+Bxy+Cy²+Dx+Ey+F=0 ?

Stéphane Laurent 03.03.2020 16:06

Нет, пожалуйста, поймите, что я работаю здесь в 3D.

Anirban Mandal 07.06.2020 08:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
13
2 180
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Рассмотрите возможность использования симуляции Монте-Карло: сгенерируйте случайную трехмерную точку; проверить, находится ли точка внутри эллипсоида; если есть, то держи. Повторяйте, пока не наберете 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/

Разве это не просто создание случайных точек на сфере, перепроецированных на эллипсоид? Если да, то совсем не очевидно, почему результирующее распределение будет равномерным. На самом деле это не так.

zabop 23.12.2021 18:01

Другие вопросы по теме