3

我想在 MATLAB 中从一组不等式中绘制一个 3d 区域。

例如:

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')
4

3 回答 3

0

我一直在试图弄清楚同样的事情,诀窍是使所有不在交叉点的大小为 0。Tobold 的 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')

这应该让你只是十字路口的区域。

-- 编辑:颜色变量也需要改变。你只想要交叉点,而不是其他不等式。

于 2013-02-24T17:50:30.000 回答
0

您可以执行与链接到的 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')
于 2012-09-18T12:23:58.970 回答
0

我不明白您作为修改@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')

结果如下图所示。 在此处输入图像描述

于 2020-05-03T15:42:07.457 回答