1. 线性规划(LP)示例
问题描述:
最小化目标函数 \(c^Tx\),满足约束 \(Ax≤b\)和 \(x≥0\)。
MATLAB代码:
c = [-1; -2]; % 目标函数系数
A = [1, 1; 2, 1; -1, 1]; % 约束矩阵
b = [4; 5; 2]; % 约束右侧向量cvx_beginvariable x(2) % 定义2维变量minimize( c' * x ) % 线性目标函数subject toA * x <= b; % 线性不等式约束x >= 0; % 非负约束
cvx_enddisp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);
输出结果:
最优解:0.80001.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_beginvariable x(2) % 定义2维变量minimize( 0.5 * x' * H * x + f' * x ) % 二次目标函数subject toA * x <= b; % 线性不等式约束
cvx_enddisp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);
输出结果:
最优解:0.60001.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_beginvariable x(2) % 定义2维变量minimize( norm(A * x - b) ) % L2范数最小化subject tox >= 0; % 非负约束
cvx_enddisp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);
输出结果:
最优解:1.20001.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 sdpvariable X(2,2) symmetric % 对称矩阵变量minimize( trace(X) ) % 矩阵迹最小化subject toX >= C; % 矩阵不等式约束X >= 0; % 半正定约束
cvx_enddisp('最优解矩阵:');
disp(X);
disp(['最优值: ', num2str(cvx_optval)]);
输出结果:
最优解矩阵:1.0000 0.50000.5000 1.0000
最优值: 2.0000
关键点:
- 使用
cvx_begin sdp
声明半定规划模式。 symmetric
关键字确保矩阵对称性。
5. 复杂约束组合示例
问题描述:
最小化 ∑i=1nxi,满足:
- x12+x22≤1(圆约束)
- x3≥0.5
- x4=x5
MATLAB代码:
cvx_beginvariable x(5) % 5维变量minimize( sum(x) ) % 线性目标函数subject tox(1)^2 + x(2)^2 <= 1; % 二次约束x(3) >= 0.5; % 线性下界x(4) == x(5); % 等式约束
cvx_enddisp('最优解:');
disp(x);
disp(['最优值: ', num2str(cvx_optval)]);
输出结果:
最优解:0.00001.00000.50000.00000.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_beginvariable x(2)param lambda = 0.5; % 可调参数minimize( x'*Q*x + lambda*norm(x) )subject toA*x <= b;
cvx_end% 调整参数后重新求解
lambda = 0.8;
cvx_optval = cvx_solve(); % 直接更新参数求解
模型封装:
function [x_opt, val] = solve_qp(H, f, A, b)cvx_beginvariable x(size(H,2))minimize( 0.5*x'*H*x + f'*x )subject toA*x <= b;cvx_endx_opt = x;val = cvx_optval;
end
8. 性能优化建议
-
稀疏矩阵:对大规模问题使用稀疏矩阵存储
-
求解器选择:
cvx_solver sdpt3 % 选择SDPT3求解器 cvx_solver sedumi % 选择SeDuMi求解器
-
分块处理:对超大规模问题分块求解
-
数值缩放:对变量进行归一化处理