我不知道在matlab中绘制这个非lp可行区域的热点

时间:2015-03-18 12:50:42

标签: matlab plot constraints nonlinear-functions

我搜索并观察了如何绘制nonlp程序的3个维度

但我仍然不知道如何绘制这些约束。

的x ^ 2 + Y ^ 2 + Z ^ 2 = 1

X> = 2 * Y
2 * Y> = 3 * Z
X> = 3 * Z

我这样编程,但它没有工作,我认为这是上限制的错误程序。

func1 = @(x,y,z) sqrt(1-x.^2-y.^2);
func2 = @(x,y,z) max(x-2*y,0);
func3 = @(x,z) max(x-3*z,0);
ezsurf(func1,[0 1 0 1]);
hold on;
ezsurf(func2,[0 1 0 1]);
hold on;
ezsurf(func3,[0 1 0 1]);
axis([0 1 0 1 0 1]);

1 个答案:

答案 0 :(得分:4)

这样做的一种方法是使用体积数据。

我们的想法是创建一个F值的3D空间。 F在主方程的一侧是正的,而在另一方是负的。

[X,Y,Z]=meshgrid(-2:0.05:2,-2:0.05:2,-2:0.05:2);

F=X.^2+Y.^2+Z.^2-1;

然后将条件应用于此F。如果你想看到对象“剪切” 然后用nan替换不符合条件的地方。如果你想看到一个填充的对象,那么用一个正数替换它(在另一种情况下可能需要为负数,所以请查看其他示例。

% Conditions
cond1=X>=2*Y;
cond2=2*Y>=3*Z;
cond3=X>=3*Z;

% If you want the boundaries to show
F1=F;
F1(~cond1)=1;
F1(~cond2)=1;
F1(~cond3)=1;

% If you want the boundaries not to show
F2=F;
F2(~cond1)=NaN;
F2(~cond2)=NaN;
F2(~cond3)=NaN;

然后想法是在零水平(你的原始功能)创建一个等值面。在这段代码中,我创建了2个图,这样您就可以看到填充和填充边界之间的差异。还有一些花哨的编码,以获得不错的数字。但是,isosurfacepatch部分与获取曲面并绘制曲线相关。

subplot(121)
iso1=isosurface(X,Y,Z,F1,0);
p=patch(iso1);
isonormals(X,Y,Z,F1,p);
set(p,'FaceColor','red','EdgeColor','none');
daspect([1 1 1])
axis equal

camlight
lighting gouraud


subplot(122)
iso2=isosurface(X,Y,Z,F2,0);

p=patch(iso2);
isonormals(X,Y,Z,F2,p);
set(p,'FaceColor','red','EdgeColor','none');
axis equal

daspect([1 1 1])
camlight headlight
lighting gouraud

结果:

enter image description here

此外,您可以计算初始边界F的等值面并使用较低的Alpha值绘制它,以便您可以更好地了解实际选择的域的哪一部分。

enter image description here