forked from oxfordcontrol/SOSTOOLS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sosmatrixineq.m
executable file
·124 lines (105 loc) · 4.81 KB
/
sosmatrixineq.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
function [sos] = sosmatrixineq(sos,fM,option)
% SOSMATRIXINEQ --- Creates a SOS constraint from a matrix inequality
% constraint
%
% [SOSP] = sosmatrixineq(SOSP,fM)
%
% SOSP is the sum of squares program.
% fM is a polynomial matrix used to generate the polynomial inequality y'fMy>0
% This file is part of SOSTOOLS - Sum of Squares Toolbox ver 4.00.
%
% Copyright (C)2002, 2004, 2013, 2016, 2018, 2021
% A. Papachristodoulou (1), J. Anderson (1),
% G. Valmorbida (2), S. Prajna (3),
% P. Seiler (4), P. A. Parrilo (5),
% M. Peet (6), D. Jagt (6)
% (1) Department of Engineering Science, University of Oxford, Oxford, U.K.
% (2) Laboratoire de Signaux et Systmes, CentraleSupelec, Gif sur Yvette,
% 91192, France
% (3) Control and Dynamical Systems - California Institute of Technology,
% Pasadena, CA 91125, USA.
% (4) Aerospace and Engineering Mechanics Department, University of
% Minnesota, Minneapolis, MN 55455-0153, USA.
% (5) Laboratory for Information and Decision Systems, M.I.T.,
% Massachusetts, MA 02139-4307
% (6) Cybernetic Systems and Controls Laboratory, Arizona State University,
% Tempe, AZ 85287-6106, USA.
%
% Send bug reports and feedback to: [email protected]
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Change log and developer notes
% AP - 16/4/2013
% JA - 6/6/2013
if nargin<3
option='quadraticMineq';%sets the default: asks for sos expression v'M(x)v
end
[n,m] = size(fM);
if n~=m
disp('ERROR: Matrix fM in inequality fM>0 must be square.');
return
end
if isfield(sos,'symvartable')
% Original Code
if strcmp(option,'quadraticMineq')
%creates the vector of variables Mvar to generate the quadratic expression
%M_var'*fM*Mvar
if n>sos.varmat.count
s1 = 'syms ';
for i=sos.varmat.count+1:n
s1 = strcat(s1,sprintf(' Mvar_%d',i));
end
%eval(expression) evaluates the MATLAB code in the string expression.
eval(s1);
Mvar = sym(zeros(n-sos.varmat.count,1));
for i=sos.varmat.count+1:n
Mvar(i-sos.varmat.count) = eval(['Mvar_',int2str(i)]);%GV 04.29.2014 correction
end
%updates the vartable in the sos program
sos.varmat.symvartable = [sos.varmat.symvartable; Mvar];
Mvarctable = sym2chartable(Mvar);
if sos.varmat.count==0
sos.varmat.vartable = [Mvarctable(1:end)];
else
sos.varmat.vartable = [sos.varmat.vartable(1:end-1),',',Mvarctable(2:end)];
end
sos.varmat.count = n;
end
varMconst = sos.varmat.symvartable(1:n);
%create the sosconstraint using the sparse multipartite option since it is
%homogeneous in varMconst
sos = sosineq(sos,varMconst.'*fM*varMconst,'sparsemultipartite',{sos.symvartable,varMconst}); %GV&JA 6/12/2013
elseif strcmp(option,'Mineq')
sos = sosineq(sos,fM); %GV&JA 10/01/2013
end
else
if strcmp(option,'quadraticMineq')
% Multipoly Code: PJS 9/9/2013
if n>sos.varmat.count
Mvar = polynomial(zeros(n-sos.varmat.count,1));
for i=sos.varmat.count+1:n
Mvar(i-sos.varmat.count) = pvar(['Mvar_' int2str(i)]);
end
%updates the vartable in the sos program
sos.varmat.vartable = [sos.varmat.vartable; Mvar];
sos.varmat.count = n;
end
%create the sosconstraint using the sparse multipartite option since it is
%homogeneous in varMconst
sos = sosineq(sos,sos.varmat.vartable(1:n).'*fM*sos.varmat.vartable(1:n),'sparsemultipartite',{sos.vartable,sos.varmat.vartable(1:n)}); % PJS 9/9/2013 %GV 20/06/2014 replaced Mvar by sos.varmat.vartable
elseif strcmp(option,'Mineq')
sos = sosineq(sos,fM); %GV&JA 10/01/2013
end
end