Dynamic-Calibration/utils/YALMIP-master/extras/@lmi/plot.m

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