SOSTOOLS学习

最近学习了一下SOSTOOLS,给自己做个记录

SOSTOOLS工具箱把SOSP问题转录为SDP问题,然后使用SDP工具箱去求解

使用步骤

  1. 初始化SOSP
  2. 声明SOSP变量
  3. 定义SOSP约束
  4. 设定目标函数
  5. 调用求解器
  6. 得到结果

具体编程

初始化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

添加约束

主要使用 soseqsosineq

等式约束

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  ab

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.solveroptions.paramsoptions.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变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值