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

I don't know hot to plot this nonlp's feasible reagion in matlab

我搜索并观看了如何绘制非 lp 程序的 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]);

一种方法是使用体积数据。

想法是创建一个具有 F 值的 3D space。 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。如果你想看对象"cut" 然后将不满足条件的地方替换为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

结果:

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