147 lines
3.8 KiB
Matlab
Executable File
147 lines
3.8 KiB
Matlab
Executable File
function varargout = plot(varargin)
|
|
%PLOT Plots the feasible region of a set of constraints
|
|
%
|
|
% p = plot(C,x,c,n,options)
|
|
%
|
|
% Note that only convex sets are allowed, or union of convex sets
|
|
% represented using binary variables (either defined explictly or
|
|
% introduced by YALMIP when modelling, e.g., mixed integer linear
|
|
% programming representable operators)
|
|
%
|
|
% C: Constraint object
|
|
% x: Plot variables [At most three variables]
|
|
% c: color [double] ([r g b] format) or char from 'rymcgbk'
|
|
% n: #vertices [double ] (default 100 in 2D and 300 otherwise)
|
|
% options: options structure from sdpsettings
|
|
|
|
% Get the onstraints
|
|
if nargin<1
|
|
return
|
|
end
|
|
|
|
F = varargin{1};
|
|
|
|
if length(F)==0
|
|
return;
|
|
end
|
|
|
|
if nargin < 5
|
|
opts = sdpsettings('verbose',0);
|
|
else
|
|
opts = varargin{5};
|
|
if isempty(opts)
|
|
opts = sdpsettings('verbose',0);
|
|
end
|
|
end
|
|
opts.verbose = max(opts.verbose-1,0);
|
|
|
|
if any(is(F,'uncertain'))
|
|
F = robustify(F,[],opts);
|
|
end
|
|
|
|
if nargin < 3
|
|
color=['rymcgbk']';
|
|
else
|
|
color = varargin{3};
|
|
if isa(color,'sdpvar')
|
|
error('The variables should be specified in the second argument.');
|
|
end
|
|
color = color(:)';
|
|
if isempty(color)
|
|
color=['rymcgbk']';
|
|
end
|
|
end
|
|
|
|
% Plot onto this projection (at most in 3D)
|
|
if nargin < 2
|
|
x = [];
|
|
else
|
|
x = varargin{2};
|
|
if ~isempty(x)
|
|
if ~isa(x,'sdpvar')
|
|
error('Second argument should be empty or an SDPVAR');
|
|
end
|
|
x = x(:);
|
|
x = x(1:min(3,length(x)));
|
|
end
|
|
end
|
|
|
|
if isempty(F)
|
|
return
|
|
end
|
|
|
|
if any(is(F,'sos'))
|
|
% Use image representation, feels safer (I'm not sure about the logic
|
|
% in the code at the moment. Can the dualization mess up something
|
|
% otherwise...)
|
|
if ~(opts.sos.model == 1)
|
|
opts.sos.model = 2;
|
|
end
|
|
% Assume the variables we are plotting are the parametric
|
|
F = compilesos(F,[],opts,x);
|
|
end
|
|
|
|
% Create a model in YALMIPs low level format
|
|
% All we change later is the cost vector
|
|
%sol = solvesdp(F,sum(x),opts);
|
|
[model,recoverdata,diagnostic,internalmodel] = export(F,[],opts,[],[],0);
|
|
if isempty(internalmodel) | (~isempty(diagnostic) && diagnostic.problem)
|
|
error('Could not create model. Can you actually solve problems with this model?')
|
|
end
|
|
internalmodel.options.saveduals = 0;
|
|
internalmodel.getsolvertime = 0;
|
|
internalmodel.options.dimacs = 0;
|
|
|
|
% Try to find a suitable set to plot
|
|
if isempty(x)
|
|
if isempty(internalmodel.extended_variables) & isempty(internalmodel.aux_variables)
|
|
x = depends(F);
|
|
x = x(1:min(3,length(x)));
|
|
localindex = 1;
|
|
localindex = find(ismember(recoverdata.used_variables,x));
|
|
else
|
|
% not extended variables
|
|
candidates = setdiff(1:length(internalmodel.c),[ internalmodel.aux_variables(:)' internalmodel.extended_variables(:)']);
|
|
% Not nonlinear variables
|
|
candidates = candidates(find(internalmodel.variabletype(candidates)==0));
|
|
% Settle with this guess
|
|
localindex = candidates(1:min(3,length(candidates)));
|
|
x = localindex;
|
|
end
|
|
else
|
|
localindex = [];
|
|
for i = 1:length(x)
|
|
localindex = [localindex find(ismember(recoverdata.used_variables,getvariables(x(i))))];
|
|
end
|
|
end
|
|
|
|
if nargin < 4
|
|
if length(x)==3
|
|
n = 300;
|
|
else
|
|
n = 100;
|
|
end
|
|
else
|
|
n = varargin{4};
|
|
if isempty(n)
|
|
if length(x)==3
|
|
n = 300;
|
|
else
|
|
n = 100;
|
|
end
|
|
end
|
|
if ~isa(n,'double')
|
|
error('4th argument should be an integer>0');
|
|
end
|
|
end
|
|
|
|
if ~isempty(internalmodel.integer_variables)
|
|
error('PLOT can currently not display sets involving integer variables');
|
|
end
|
|
|
|
% Use common function for lmi/plot and optimizer/plot
|
|
if nargout == 0
|
|
plotInternalModel(internalmodel,x,n,localindex,color,opts);
|
|
else
|
|
varargout{1} = plotInternalModel(internalmodel,x,n,localindex,color,opts);
|
|
end |