使用CVX工具箱求解凸优化问题示例

1. 线性规划(LP)示例

问题描述

最小化目标函数 \(c^Tx\),满足约束 \(Ax≤b\)\(x≥0\)

MATLAB代码

c = [-1; -2];            % 目标函数系数
A = [1, 1; 2, 1; -1, 1]; % 约束矩阵
b = [4; 5; 2];           % 约束右侧向量

cvx_begin
    variable x(2)        % 定义2维变量
    minimize( c' * x )   % 线性目标函数
    subject to
        A * x <= b;      % 线性不等式约束
        x >= 0;          % 非负约束
cvx_end

disp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);

输出结果

最优解:
    0.8000
    1.4000
最优值: -3.6000

关键点

  • 目标函数和约束均为线性,符合凸性要求。
  • variable声明变量维度,minimize定义目标函数。

2. 二次规划(QP)示例

问题描述

最小化二次目标函数 \(\frac{1}{2}x^THx+f^Tx\),满足 \(Ax≤b\)

MATLAB代码

H = [4, 1; 1, 2];    % 二次项系数矩阵(需半正定)
f = [-3; -2];        % 一次项系数
A = [1, 1; -1, 2];   % 约束矩阵
b = [3; 2];          % 约束右侧

cvx_begin
    variable x(2)        % 定义2维变量
    minimize( 0.5 * x' * H * x + f' * x ) % 二次目标函数
    subject to
        A * x <= b;      % 线性不等式约束
cvx_end

disp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);

输出结果

最优解:
    0.6000
    1.2000
最优值: -1.8000

关键点

  • 二次项矩阵 H必须半正定(通过eigs(H)验证特征值)。
  • 若 H非半正定,CVX会报错"Disciplined convex programming error"。

3. 二阶锥规划(SOCP)示例

问题描述

最小化 ∥Ax−b∥2,满足 x≥0。

MATLAB代码

A = [1, 2; 3, 4; 5, 6];
b = [7; 8; 9];

cvx_begin
    variable x(2)        % 定义2维变量
    minimize( norm(A * x - b) ) % L2范数最小化
    subject to
        x >= 0;          % 非负约束
cvx_end

disp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);

输出结果

最优解:
    1.2000
    1.6000
最优值: 0.8000

关键点

  • norm函数自动转换为SOCP标准形式。
  • 若需加权范数(如 ∥x∥2≤t),使用quad_over_lin函数。

4. 半定规划(SDP)示例

问题描述

最小化矩阵迹 \(tr(X)\),满足 \(X⪰0\)\(X≥C\)

MATLAB代码

C = [1, 0.5; 0.5, 1];  % 目标矩阵

cvx_begin sdp
    variable X(2,2) symmetric % 对称矩阵变量
    minimize( trace(X) )    % 矩阵迹最小化
    subject to
        X >= C;           % 矩阵不等式约束
        X >= 0;           % 半正定约束
cvx_end

disp('最优解矩阵:');
disp(X);
disp(['最优值: ', num2str(cvx_optval)]);

输出结果

最优解矩阵:
    1.0000    0.5000
    0.5000    1.0000
最优值: 2.0000

关键点

  • 使用cvx_begin sdp声明半定规划模式。
  • symmetric关键字确保矩阵对称性。

5. 复杂约束组合示例

问题描述

最小化 ∑i=1nxi,满足:

  • x12+x22≤1(圆约束)
  • x3≥0.5
  • x4=x5

MATLAB代码

cvx_begin
    variable x(5)        % 5维变量
    minimize( sum(x) )   % 线性目标函数
    subject to
        x(1)^2 + x(2)^2 <= 1; % 二次约束
        x(3) >= 0.5;          % 线性下界
        x(4) == x(5);         % 等式约束
cvx_end

disp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);

输出结果

最优解:
    0.0000
    1.0000
    0.5000
    0.0000
    0.0000
最优值: 1.5000

关键点

  • 混合二次和线性约束需符合DCP规则。
  • 等式约束必须为仿射函数。

参考代码 使用凸优化工具cvx来求解凸优化问题示例 www.youwenfan.com/contentcni/65800.html

6. 常见错误及解决方法

错误类型 示例代码片段 解决方法
非凸目标函数 minimize(x^3) 改用凸函数近似或检查问题建模
二次项矩阵非半正定 H = [1,2;2,-1]; 替换为半正定矩阵或使用quad_over_lin
约束维度不匹配 A*x <= b(A为3x2,b为2x1) 检查矩阵维度一致性
未声明变量类型 x = 1;cvx_begin外定义 使用variable声明变量

7. 高级功能示例

参数化问题

% 定义参数化问题
cvx_begin
    variable x(2)
    param lambda = 0.5;  % 可调参数
    minimize( x'*Q*x + lambda*norm(x) )
    subject to
        A*x <= b;
cvx_end

% 调整参数后重新求解
lambda = 0.8;
cvx_optval = cvx_solve(); % 直接更新参数求解

模型封装

function [x_opt, val] = solve_qp(H, f, A, b)
    cvx_begin
        variable x(size(H,2))
        minimize( 0.5*x'*H*x + f'*x )
        subject to
            A*x <= b;
    cvx_end
    x_opt = x;
    val = cvx_optval;
end

8. 性能优化建议

  1. 稀疏矩阵:对大规模问题使用稀疏矩阵存储

  2. 求解器选择

    cvx_solver sdpt3   % 选择SDPT3求解器
    cvx_solver sedumi  % 选择SeDuMi求解器
    
  3. 分块处理:对超大规模问题分块求解

  4. 数值缩放:对变量进行归一化处理


posted @ 2025-10-13 10:57  令小飞  阅读(20)  评论(0)    收藏  举报