参考网址:YALMIP
SOS的基本思想
定义多项式 p ( x , y ) = ( 1 + x ) 4 + ( 1 − y ) 2 p(x,y)=(1+x)^4+(1-y)^2 p(x,y)=(1+x)4+(1−y)2
x = sdpvar(1,1)
y = sdpvar(1,1)
p = (1+x)^4+(1-y)^2
引入分解 p = v T Q v p=v^TQv p=vTQv,则 v v v 的阶数是 p p p 的一半,这里 p p p 的阶数是6
v = monolist([x y],degree(p)/2);
Q = sdpvar(length(v));
p_sos = v'*Q*v;
多项式 p s o s p_{sos} psos 和 p p p 要匹配,则两个多项式中的所有系数必须为0,同时, Q Q Q 矩阵是半正定的,那么可以定义约束问题如下
F = [coefficients(p-p_sos,[x y]) == 0, Q >= 0];
optimize(F)
其中, 函数 c o e f f i c i e n t s coefficients coefficients 表示提取标量多项式 p − p s o s p-p_{sos} p−psos 中 x x x 和 y y y 的系数,也就是说,其系数必须要等于0。
此外,如果想要查找多项式的下界,可以添加目标函数决策变量 t t t
sdpvar t
F = [coefficients((p-t)-p_sos,[x y]) == 0, Q >= 0];
optimize(F,-t)
SOSP操作
使用 s o s sos sos 函数和 s o l v e s o s solvesos solvesos 解决SOS问题
x = sdpvar(1,1);y = sdpvar(1,1);
p = (1+x)^4 + (1-y)^2;
% sos用于定义平方和约束
F = sos(p);
% 计算平方和分解
sol = solvesos(F);
if sol.problem == 0
disp('Sum-of-squares decomposition possible!');
end
% 提取计算的平方和分解
h = sosd(F);
sdisplay(h)
clean(p-h'*h,1e-6)
这里面涉及到了几个编程中会经常用到的函数, s o l v e s o s solvesos solvesos, s o l . p r o b l e m sol.problem sol.problem, s d i s p l a y sdisplay sdisplay, c l e a n clean clean