最近学习了一下SOSTOOLS,给自己做个记录
SOSTOOLS工具箱把SOSP问题转录为SDP问题,然后使用SDP工具箱去求解
使用步骤
- 初始化SOSP
- 声明SOSP变量
- 定义SOSP约束
- 设定目标函数
- 调用求解器
- 得到结果
具体编程
初始化SOSP
syms x y
Program = sosprogram([x;y])
所用函数为sosprogram
sosprogram --- Initialize a new sum of squares program.
SOSP = sosprogram(VARTABLE,DECVARTABLE)
SOSP is a new sum of squares program.
VARTABLE is a vector of independent variables.
DECVARTABLE is a vector of decision variables (optional).
Both VARTABLE and DECVARTABLE are either symbolic or polynomial objects.
变量声明
标量决策变量
使用MATLAB符号工具箱 syms
下面的Prog1和Prog2等价
clear;clc
syms x y a b
Prog1 = sosprogram([x;y],[a;b])
Prog2 = sosprogram([x;y])
Prog2 = sosdecvar(Prog2,[a;b])
当要创建不同的对象时,一般使用 dpvar 来创建决策变量,使用 pvar 创建自变量
clear;clc
pvar x y
dpvar a b
prog = sosprogram([x;y],[a;b])
标量多项式变量
使用 sospolyvar 来声明多项式变量,对于 v ( x , y ) = a x 2 + b x y + c y 2 v(x,y)=ax^2+bxy+cy^2 v(x,y)=ax2+bxy+cy2,其中 a b c a ~b ~c a b c未知,自动创建 a b c a ~b ~c a b c:
clear
clc
pvar x y
prog = sosprogram([x;y])
[prog,v]=sospolyvar(prog,[x^2;x*y;y^2])
sossosvar --- 在 SOS 程序中声明一个新的平方和变量
[SOSP,VAR] = sossosvar(SOSP,Z)
输出:
SOS:修改后的平方和程序结构。
V:新的平方和决策变量。如果 SOS 包含符号变量,则 P 的输出类型将为 sym。否则,输出类型默认为
dpvar,除非调用者指定 PVoption='pvar' 作为第四个输入。
输入
SOS:要修改的平方和程序结构。
ZSym:VAR 的 Gram 分解中包含的单项式的列向量,即
VAR = ZSym' * COEFF * ZSym
其中 COEFF 是一个限制为
正半定的系数矩阵。COEFF 及其包含的决策变量将由 sossosvar 自动构建。
wscoeff(可选):如果 wscoeff='symmetric',sospolyvar 还将在 MATLAB 工作区中创建
与 VAR 对应的决策变量(即 coeff_xxx)。
PVoption(可选):当需要 pvar 输出类型时,带有 PVoption 'pvar' 的字符串(回归选项)
prog =
包含以下字段的 struct:
var: [1×1 struct]
expr: [1×1 struct]
extravar: [1×1 struct]
objective: [3×1 double]
solinfo: [1×1 struct]
vartable: {2×1 cell}
varmat: [1×1 struct]
decvartable: {3×1 cell}
v =
coeff_3*y^2 + coeff_2*x*y + coeff_1*x^2
使用 coeff_nnn 命名多项式变量中的未知系数;
如果需要使用这些系数 coeff_nnn ,要将第三个参数 wscoeff 赋给 sospolyvar,否则就会报错;
SOS变量
声明SOS变量时,必须 使用sossosvar
pvar x y
prog = sosprogram([x;y]);
[prog,p] = sossosvar(prog,[x;y])
prog =
包含以下字段的 struct:
var: [1×1 struct]
expr: [1×1 struct]
extravar: [1×1 struct]
objective: [4×1 double]
solinfo: [1×1 struct]
vartable: {2×1 cell}
varmat: [1×1 struct]
decvartable: {4×1 cell}
p =
coeff_4*y^2 + 2*coeff_3*x*y + coeff_1*x^2
添加约束
主要使用 soseq 和 sosineq
等式约束
clc
clear
pvar x y
prog = sosprogram([x;y]);
[prog,p] = sossosvar(prog,[x;y])
prog = soseq(prog,diff(p,x)-x^2)
不等式约束
不等式约束使用 sospolymatrixvar,解Lyapunov方程 P P P 正定, A T P + P A A^TP+PA ATP+PA 负定
clear
clc
syms x
G = rss(4,2,2);
A = G.A;
eps = 1e-6;
I = eye(4);
prog = sosprogram(x);
[prog,P] = sospolymatrixvar(prog,monomials(x,0),[4,4],'symmetric')
prog = sosmatrixineq(prog,P,'quadraticMineq');
deriv = A'*P+P*A;
prog = sosmatrixineq(prog,-deriv,'quadraticMineq');
prog = sossolve(prog);
p = double(sosgetsol(prog,P));
A
p
设置目标函数
设置目标函数使用 sossetobj,希望设置目标函数为 min a − b \textbf{min}~~ a-b min a−b
syms x y a b
Program4 = sosprogram([x;y],a)
Program4 = sosdecvar(Program4,b)
Program4 = sossetobj(Program4,a-b)
注意,对于 syms a b,要把 a b添加进 sosprogram 的结构体中
sosdecvar --- 在 SOS 程序中声明新的决策变量。
SOSP = sosdecvar(SOSP,DECVARS)
SOSP 是平方和程序。
DECVARS 是一个向量,其条目是新的决策变量。 DECVARS 可以是符号对象,也可以是多项式对象。
求解
求解使用 sossolve 函数,这个函数将SOSP问题转换为等效的SDP问题,调用半正定规划求解器,并将半正定规划求解器给出的结果转换回原始SOSP的解
对于 options 可以选择:options.solver、options.params、options.simplify
clear
clc
syms x
G = rss(4,2,2);
A = G.A;
eps = 1e-6;
I = eye(4);
prog = sosprogram(x);
[prog,P] = sospolymatrixvar(prog,monomials(x,0),[4,4],'symmetric')
prog = sosmatrixineq(prog,P,'quadraticMineq');
deriv = A'*P+P*A;
prog = sosmatrixineq(prog,-deriv,'quadraticMineq');
options.solver = 'mosek'
prog = sossolve(prog,options);
p = double(sosgetsol(prog,P));
获取结果
调用函数 sosgetsol 获取SOSP变量