yalmip.m
来自「国外专家做的求解LMI鲁棒控制的工具箱,可以相对高效的解决LMI问题」· M 代码 · 共 613 行 · 第 1/2 页
M
613 行
internal_sdpvarstate.sos_v{where} = varargin{6};
else
internal_sdpvarstate.sos_index(end+1) = varargin{2};
internal_sdpvarstate.sos_data{end+1} = varargin{3};
internal_sdpvarstate.sos_ParV{end+1} = varargin{4};
internal_sdpvarstate.sos_Q{end+1} = varargin{5};
internal_sdpvarstate.sos_v{end+1} = varargin{6};
end
else
internal_sdpvarstate.sos_index(end+1) = varargin{2};
internal_sdpvarstate.sos_data{end+1} = varargin{3};
internal_sdpvarstate.sos_ParV{end+1} = varargin{4};
internal_sdpvarstate.sos_Q{end+1} = varargin{5};
internal_sdpvarstate.sos_v{end+1} = varargin{6};
end
case 'sosid'
if not(isempty(internal_sdpvarstate.sosid))
internal_sdpvarstate.sosid = internal_sdpvarstate.sosid+1;
varargout{1}=internal_sdpvarstate.sosid;
else
internal_sdpvarstate.sosid=1;
varargout{1}=internal_sdpvarstate.sosid;
end
case 'getsos'
if isempty(internal_sdpvarstate.sos_index)
varargout{1}=[];
varargout{2}=[];
varargout{3}=[];
varargout{4}=[];
else
SOSid = varargin{2};
index_to_sos = find(SOSid==internal_sdpvarstate.sos_index);
if isempty(index_to_sos)
varargout{1}=[];
varargout{2}=[];
varargout{3}=[];
varargout{4}=[];
else
varargout{1} = internal_sdpvarstate.sos_data{index_to_sos};
varargout{2} = internal_sdpvarstate.sos_ParV{index_to_sos};
varargout{3} = internal_sdpvarstate.sos_Q{index_to_sos};
varargout{4} = internal_sdpvarstate.sos_v{index_to_sos};
% FIX
end
end
case 'getinternalsetstate'
varargout{1} = internal_setstate; % Get internal state, called from saveobj
case 'setinternalsetstate'
internal_setstate = varargin{2}; % Set internal state, called from loadobj
case 'getinternalsdpvarstate'
varargout{1} = internal_sdpvarstate; % Get internal state, called from saveobj
case 'setinternalsdpvarstate'
internal_sdpvarstate = varargin{2}; % Set internal state, called from loadobj
% Back-wards compability....
if ~isfield(internal_sdpvarstate,'extVariables')
internal_sdpvarstate.extVariables = [];
end
if ~isfield(internal_sdpvarstate,'ExtendedMap')
internal_sdpvarstate.ExtendedMap = [];
end
if ~isfield(internal_sdpvarstate,'variabletype')
internal_sdpvarstate.variabletype = ~(sum(internal_sdpvarstate.monomtable,2)==1 & sum(internal_sdpvarstate.monomtable~=0,2)==1);
end
if ~isfield(internal_sdpvarstate,'hash')
internal_sdpvarstate.hash=[];
internal_sdpvarstate.hashedmonomtable=[];
end
% Re-compute some stuff for safety
internal_sdpvarstate.variabletype = internal_sdpvarstate.variabletype(:)';
internal_sdpvarstate.variabletype = spalloc(size(internal_sdpvarstate.monomtable,1),1,0)';
nonlinear = ~(sum(internal_sdpvarstate.monomtable,2)==1 & sum(internal_sdpvarstate.monomtable~=0,2)==1);
if ~isempty(nonlinear)
mt = internal_sdpvarstate.monomtable;
internal_sdpvarstate.variabletype(nonlinear) = 3;
quadratic = sum(internal_sdpvarstate.monomtable,2)==2;
internal_sdpvarstate.variabletype(quadratic) = 2;
bilinear = max(internal_sdpvarstate.monomtable,[],2)<=1;
internal_sdpvarstate.variabletype(bilinear & quadratic) = 1;
sigmonial = any(0>internal_sdpvarstate.monomtable,2) | any(internal_sdpvarstate.monomtable-fix(internal_sdpvarstate.monomtable),2);
internal_sdpvarstate.variabletype(sigmonial) = 4;
end
[n,m] = size(internal_sdpvarstate.monomtable);
if n>m
internal_sdpvarstate.monomtable(n,n) = 0;
end
if size(internal_sdpvarstate.monomtable,2)>length(internal_sdpvarstate.hash)
% Need new hash-keys
need_new = size(internal_sdpvarstate.monomtable,1) - length(internal_sdpvarstate.hash);
internal_sdpvarstate.hash = [internal_sdpvarstate.hash ; 3*rand(need_new,1)];
end
if size(internal_sdpvarstate.monomtable,1)>size(internal_sdpvarstate.hashedmonomtable,1)
% Need to add some hash values
need_new = size(internal_sdpvarstate.monomtable,1) - size(internal_sdpvarstate.hashedmonomtable,1);
internal_sdpvarstate.hashedmonomtable = [internal_sdpvarstate.hashedmonomtable;internal_sdpvarstate.monomtable(end-need_new+1:end,:)*internal_sdpvarstate.hash];
end
case {'version','ver'}
varargout{1}=3;
if nargout==2
varargout{2} = '20050720';
end
case 'setintvariables'
internal_sdpvarstate.intVariables = varargin{2};
case 'intvariables'
varargout{1} = internal_sdpvarstate.intVariables;
case 'setbinvariables'
internal_sdpvarstate.binVariables = varargin{2};
case 'binvariables'
varargout{1} = internal_sdpvarstate.binVariables;
case 'setuncvariables'
internal_sdpvarstate.uncVariables = varargin{2};
case 'uncvariables'
varargout{1} = internal_sdpvarstate.uncVariables;
case 'setparvariables'
internal_sdpvarstate.parVariables = varargin{2};
case 'parvariables'
varargout{1} = internal_sdpvarstate.parVariables;
case 'setmonomtable'
% New monom table
internal_sdpvarstate.monomtable = varargin{2};
if nargin>=4
% User has up-dated the hash tables him self.
internal_sdpvarstate.hashedmonomtable=varargin{4};
internal_sdpvarstate.hash = varargin{5};
end
if size(internal_sdpvarstate.monomtable,2)>length(internal_sdpvarstate.hash)
% Need new hash-keys
need_new = size(internal_sdpvarstate.monomtable,1) - length(internal_sdpvarstate.hash);
internal_sdpvarstate.hash = [internal_sdpvarstate.hash ; 3*rand(need_new,1)];
end
if size(internal_sdpvarstate.monomtable,1)>size(internal_sdpvarstate.hashedmonomtable,1)
% Need to add some hash values
need_new = size(internal_sdpvarstate.monomtable,1) - size(internal_sdpvarstate.hashedmonomtable,1);
internal_sdpvarstate.hashedmonomtable = [internal_sdpvarstate.hashedmonomtable;internal_sdpvarstate.monomtable(end-need_new+1:end,:)*internal_sdpvarstate.hash];
end
if nargin >= 3
internal_sdpvarstate.variabletype = varargin{3};
if length(internal_sdpvarstate.variabletype) ~=size(internal_sdpvarstate.monomtable,1)
error('ASSERT')
end
else
internal_sdpvarstate.variabletype = zeros(size(internal_sdpvarstate.monomtable,1),1)';
nonlinear = ~(sum(internal_sdpvarstate.monomtable,2)==1 & sum(internal_sdpvarstate.monomtable~=0,2)==1);
if ~isempty(nonlinear)
%mt = internal_sdpvarstate.monomtable;
internal_sdpvarstate.variabletype(nonlinear) = 3;
quadratic = sum(internal_sdpvarstate.monomtable,2)==2;
internal_sdpvarstate.variabletype(quadratic) = 2;
bilinear = max(internal_sdpvarstate.monomtable,[],2)<=1;
internal_sdpvarstate.variabletype(bilinear & quadratic) = 1;
sigmonial = any(0>internal_sdpvarstate.monomtable,2) | any(internal_sdpvarstate.monomtable-fix(internal_sdpvarstate.monomtable),2);
internal_sdpvarstate.variabletype(sigmonial) = 4;
end
end
case 'monomtable'
varargout{1} = internal_sdpvarstate.monomtable;
if nargout >= 2
varargout{2} = internal_sdpvarstate.variabletype;
if nargout == 4
varargout{3} = internal_sdpvarstate.hashedmonomtable;
varargout{4} = internal_sdpvarstate.hash;
end
end
case 'variabletype'
varargout{1} = internal_sdpvarstate.variabletype;
case 'nonlinearvariables'
error('Internal error (ref. nonlinear variables). Report!')
varargout{1} = internal_sdpvarstate.nonlinearvariables;
if nargout==2
varargout{2} = internal_sdpvarstate.nonlinearvariablesCompressed;
end
case {'addinternal'}
internal_sdpvarstate.internalconstraints{end+1} = varargin{1};
% case {'setnvars'}
% sdpvar('setnvars',varargin{2});
case {'nvars'}
varargout{1} = size(internal_sdpvarstate.monomtable,1);
% varargout{1} = sdpvar('nvars');
case {'info'}
[version,release] = yalmip('version');
currentversion = num2str(version(1));
i = 1;
while i<length(version)
i = i+1;
currentversion = [currentversion '.' num2str(version(i))];
end
info_str = ['- - - - YALMIP ' currentversion ' ' num2str(release) ' - - - -'];
disp(' ');
disp(char(repmat(double('*'),1,length(info_str))));
disp(info_str)
disp(char(repmat(double('*'),1,length(info_str))));
disp(' ');
disp(['Variable Size'])
spaces = [' '];
ws = evalin('caller','whos');
n = 0;
for i = 1:size(ws,1)
if strcmp(ws(i).class,'sdpvar')
n = n+1;
wsname = ws(i).name;
wssize = [num2str(ws(i).size(1)) 'x' num2str(ws(i).size(2))];
disp([wsname spaces(1:13-length(wsname)) wssize]);
end
end
if n == 0
disp('No SDPVAR objects found');
end
disp(' ');
disp(['LMI']);
n = 0;
for i = 1:size(ws,1)
if strcmp(ws(i).class,'lmi')
n = n+1;
wsname = ws(i).name;
disp([wsname]);
end
end
if n == 0
disp('No SET objects found');
end
case 'getbounds'
if ~isfield(internal_sdpvarstate,'boundlist')
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
elseif isempty(internal_sdpvarstate.boundlist)
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
end
indicies = varargin{2};
if max(indicies)>size(internal_sdpvarstate.boundlist,1)
need_new = max(indicies)-size(internal_sdpvarstate.boundlist,1);
internal_sdpvarstate.boundlist = [internal_sdpvarstate.boundlist;inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1)];
end
varargout{1} = internal_sdpvarstate.boundlist(indicies,:);
case 'setbounds'
if ~isfield(internal_sdpvarstate,'boundlist')
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
elseif isempty(internal_sdpvarstate.boundlist)
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
end
indicies = varargin{2};
if any(ismember(indicies,internal_sdpvarstate.extVariables))
varargout{1}=2;
elseif any(internal_sdpvarstate.variabletype(indicies))
varargout{1}=1;
else
internal_sdpvarstate.boundlist(indicies,1) = varargin{3};
internal_sdpvarstate.boundlist(indicies,2) = varargin{4};
varargout{1}=0;
end
case 'solver'
if (nargin==2)
if isa(varargin{2},'char')
solver = varargin{2};
prefered_solver = solver;
else
error('Second argument should be a string with solver name');
end
else
if isempty(prefered_solver)
varargout{1}='';
else
varargout{1} = prefered_solver;
end
end
otherwise
disp('Please report bug "case error in YALMIP.m"');
end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?