Как построить 3D неравенства на Matlab

Я хочу построить трехмерную область в MATLAB, ограниченную множеством неравенств.

Например:

0 <= x <= 1

sqrt(x) <= y <= 1

0 <= z <= 1 - y

Я нашел 2D-пример, который кто-то сделал на этом сайте, но я не уверен, как преобразовать это в 3D. Как построить неравенства.

Изменить: С помощью @Tobold я изменил код, чтобы ограничить отображаемые точки точками, которые определены всеми тремя регионами, но он отображает только 2 или 3 точки. Похоже, что точки в векторах X1, Y1 и Z1 правильные, но по какой-то причине на нем изображены лишь немногие. Есть идеи, почему он строит только несколько точек из векторов X1, Y1 и Z1 вместо всех?

[X,Y,Z]=meshgrid(0:0.1:1,0:0.1:1,0:0.1:1); % Make a grid of points between 0 and 1
p1=0.1; p2=0.2; % Choose some parameters
X1 = (X >= 0 & X <= 1) & (Y >= sqrt(X) & Y <= 1) & (Z >= 0 & Z <= 1 - Y);
Y1 = (X >= 0 & X <= 1) & (Y >= sqrt(X) & Y <= 1) & (Z >= 0 & Z <= 1 - Y);
Z1 = (X >= 0 & X <= 1) & (Y >= sqrt(X) & Y <= 1) & (Z >= 0 & Z <= 1 - Y);
ineq1 = (X >= 0 & X <= 1) * 2;
ineq2 = (Y >= sqrt(X) & Y <= 1) * 4;
ineq3 = (Z >= 0 & Z <= 1 - Y) * 8;
all = ineq1 & ineq2 & ineq3;
colors = zeros(size(X))+ineq1+ineq2+ineq3;
scatter3(X1(:),Y1(:),Z1(:),3,colors(:)','filled')

2 ответа

Я пытался понять то же самое, и хитрость заключается в том, чтобы сделать размер всего, что не находится на пересечении 0. Линия scatter3 Тобольда использует "3" в качестве параметра размера, то есть все точки будут отображаться как точка 3 Это может быть заменено матрицей, равной размеру X1, с набором размеров. Самый простой способ сделать это просто сделать s = 3*all:

all = ineq1 & ineq2 & ineq3;
colors = zeros(size(X))+all;
sizes = 3 * all;
scatter3(X1(:),Y1(:),Z1(:),sizes,colors(:)','filled')

Это должно дать вам только область на перекрестке.

- edit: переменная цвета тоже должна измениться. Вы просто хотите пересечение, а не другие неравенства.

Вы можете сделать почти то же самое, что и в случае с 2D, который вы указали. Просто запишите три неравенства, используйте сетку 3d, умножьте каждое неравенство на число из набора из трех чисел с уникальными подмножествами (например, 2, 4, 8) и используйте scatter3:

[X,Y,Z]=meshgrid(0:0.1:1,0:0.1:1,0:0.1:1); % Make a grid of points between 0 and 1
p1=0.1; p2=0.2; % Choose some parameters
ineq1 = (X >= 0 & X <= 1) * 2;
ineq2 = (X >= sqrt(X) & Y <= 1) * 4;
ineq3 = (Z >= 0 & Z <= 1 - Y) * 8;
colors = zeros(size(X))+ineq1+ineq2+ineq3;
scatter3(X(:),Y(:),Z(:),3,colors(:),'filled')

Я не понимаю некоторых вещей в коде, который вы написали как модификацию справки @Tobold. Например, что параметры p1 и p2 делают в вашем коде?

В любом случае, код, отображающий только точки вашей сетки, удовлетворяет всем вашим неравенствам;

[X,Y,Z]=meshgrid(0:0.1:1,0:0.1:1,0:0.1:1);
ineq1 = (X >= 0 & X <= 1);
ineq2 = (Y >= sqrt(X) & Y <= 1);
ineq3 = (Z >= 0 & Z <= 1 - Y);
all = ineq1 & ineq2 & ineq3;
scatter3(X(all),Y(all),Z(all),'b','filled')

Результат представлен на следующем изображении.

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