我不知道在 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 个图,因此您可以看到填充和不填充边界之间的区别。还有一些花哨的编码以获得漂亮的数字。但是 isosurface
和 patch
部分与获取表面和绘制它相关。
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 值绘制它,这样您就可以更好地了解您实际选择的域的哪一部分。
我搜索并观看了如何绘制非 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 个图,因此您可以看到填充和不填充边界之间的区别。还有一些花哨的编码以获得漂亮的数字。但是 isosurface
和 patch
部分与获取表面和绘制它相关。
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 值绘制它,这样您就可以更好地了解您实际选择的域的哪一部分。