玩命加载中 . . .

CVX教程


CVX基本语法

声明问题类型或控制屏幕输出

cvx_begin       // 开始优化
cvx_begin quiet // 不输出log
cvx_begin sdp   // 半定规划
cvx_begin gp   // 几何规划

定义变量

variable x(20)      // 20维的决策变量
variable y(20, 30) complex  // 20X30的复数矩阵
variable X(20, 20) symmetric    // 20X20的对称方阵
variables x(20) Y(10, 20)    // 同时定义多个变量

目标函数(必须是凸函数)

  • 线性:$c^{T}x, trace(A * X)$
  • 二次:$x^{T}Qx$
  • 二阶范数:$norm(Ax-b)$

约束条件

  • 线性:$b^{T}x \leq a, A^{T}x \leq b$
  • 二次:$x^{T}Qx \leq a$
  • SOCP:$x_1^2 + x_2^2 - x_3^2 \leq 0, x_3 \geq 0$
  • SDP:$X \geq 0$,X是半正定矩阵,特征值都大于等于0

定义集合

  • 非负集:x == nonnegative(n),等价于x>=0,n维向量,两个等号表示属于
  • simplex:x == simplex(n),等价于$\sum^{n}_{i=1}x_i = 1, x >= 0$
  • 半定矩阵:X == semidefine(n),等价于$X >= 0, symmetric$

调整精度

cvx_precision default/low/medium/high/best

选择求解器

cvx_solver Mosek

最小二乘问题

m = 4;
n = 3;
A = randn(m, n);
b = randn(m, 1);
cvx_begin quiet
    variable x(n)   // n维变量
    minimize( norm(A*x-b) ) // 目标函数为二阶范数
cvx_end

有约束的最小二乘问题

m = 4;
n = 3;
A = randn(m, n);
b = randn(m, 1);

bnds = rand(n, 2);
l = min(bnds, [], 2);   // 每行的最小值组成的列
u = max(bnds, [], 2);   // 每行的最大值组成的列

cvx_begin quiet
    variable x(n)
    minimize( norm(A*x-b) )
    subject to
        l <= x <= u;
cvx_end

其他范数

无穷范数

cvx_begin quiet
    variable x(n)
    minimize( norm(A*x-b, Inf) )
cvx_end

1阶范数

cvx_begin quiet
    variable x(n)
    minimize( norm(A*x-b, 1) )
cvx_end

凸函数乘以一个整数或者和凸函数相加,结果还是凸函数

m = 4;
n = 3;
A = randn(m, n);
b = randn(m, 1);
gamma = logspace(-2, 2, 10);
l2norm = zeros(size(gamma));
l1norm = zeros(size(gamma));
for k = 1:length(gamma)     // 不同gamma值对目标的影响
    cvx_begin
        variable x(n)
        minimize( norm(A*x-b) + gamma(k)*norm(x, 1) )
    cvx_end
    l1norm(k) = norm(x, 1);
    l2norm(k) = norm(A*x-b);
end

DCP(Disciplined Convex Programming)

不能将$\sqrt{x^2+1}$写成sqrt(x^2+1),因为开根号是一种非凸运算,但可以将其转化为

所以编写为norm([x 1]),这样就可以了

不能直接写1/x,而是需要调用inv_pos(x),其默认定义域为$\mathbb{R}_{++}$,所以是凸函数,单调递减


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录