第【48期】-- 通信问题的cvx教程之基础篇【一】-- MU-MIMO下行功率分配问题

📅 2026/7/3 2:40:29
第【48期】-- 通信问题的cvx教程之基础篇【一】-- MU-MIMO下行功率分配问题
1、最近有大量小伙伴在问关于通信领域里面CVX的代码编写问题因此计划新开系列文章讲解无线通信优化问题中关于MATLAB CVX工具的使用。2、计划前期先写经典的简单通信问题的CVX求解以打实基础后期再针对目前热门的通信方向如RISNOMAUAVISAC等方向的复杂非凸问题的近似迭代后的CVX求解。3、本文为第一期讲解MU-MIMO系统简单的功率分配问题的CVX代码感兴趣的朋友后续可以点个关注后续追更。博主往期所写热门文章cvx安装无线通信中的优化问题matlab中cvx的使用心得文章目录1 引言为什么需要凸优化工具箱CVX2 系统建模与问题表述2.1 系统建模2.2 优化问题2.3 非凸转凸3 CVX代码分析3.1 CVX基础语法3.2 CVX关键规则3.3 第2.3小节的凸问题CVX求解4 总结1 引言为什么需要凸优化工具箱CVX在无线通信系统设计中我们经常遇到资源分配、波束成形、功率控制等核心问题。这些问题通常可以建模为带有约束的优化问题而其中的许多都可以转化为凸优化问题如线性规划、二次规划、二阶锥规划等。CVX 是一个专为凸优化设计的建模系统它允许我们用接近数学公式的自然语法描述优化问题并自动调用底层求解器如 SeDuMi、SDPT3、MOSEK进行求解。对于通信领域的研究生和工程师CVX 是快速验证算法性能的首选工具。本文将通过一个具体的多用户多输入多输出MU‑MIMO下行链路功率最小化例子教学 CVX 的基本用法。从问题建模开始一步步编写、调试并解读代码最终绘制出结果曲线。2 系统建模与问题表述2.1 系统建模2.2 优化问题2.3 非凸转凸两边同时开平方得到:因此得到标准的二阶锥约束左侧是 2-范数右侧是仿射函数再通过引入辅助变量tao则等价凸问题形式为3 CVX代码分析3.1 CVX基础语法本小节讲解CVX语法基础会的可以直接跳到3.3节。CVX核心用法是构建一个“规范”通过几个关键部分来定义优化问题。框架cvx_begin 声明变量 目标 约束 cvx_end命令作用cvx_begin/cvx_end必须成对出现包裹所有优化代码quiet不显示求解过程信息优化速度加在cvx_begin后面sdp启用半正定规划模式处理矩阵半正定约束时使用变量用 variable 声明用法如下表代码含义variable x声明实数标量variable x(n)声明 n 维实数向量variable X(m, n)声明 m×n 实数矩阵variable x(n) complex声明 n 维复数向量variable X(m, n) complex声明 m×n 复数矩阵variable x(n) nonnegative声明非负向量x ≥ 0variable X(n, n) symmetric声明实对称矩阵variable X(n, n) hermitian声明复 Hermitian 矩阵即 X X^Hvariable X(n, n) semidefinite声明半正定矩阵X ⪰ 0核心约束规则整体约束必需为凸约束3.2 CVX关键规则CVX 不是任何数学表达式都能接受的。它要求整个问题必须是凸的。规则1目标函数必须符合凸性minimize 后面的表达式必须是凸函数如 norm、sum、quad_formmaximize 后面的表达式必须是凹函数如 log、geo_mean规则2约束的左右结构有限制boyd的凸优化里面关于上镜图和下镜图有讲原因感兴趣可搜约束类型左侧要求右侧要求合法示例非法示例凸凹norm(x) 11 norm(x)凹凸1 norm(x)norm(x) 1仿射仿射A * x bnorm(x) 1常用函数的凹凸性类型常见函数说明仿射,-,*,/常数除法,real,imag,conj,trace,diag,sum,vec,reshape线性运算既是凸也是凹凸norm,norm(x, p),quad_form,sum_square,maxabs实数square,inv_pos,log_sum_exp可用于的左侧或minimize凹log,log_det,geo_mean,sqrt,可用于的左侧或maximize3.3 第2.3小节的凸问题CVX求解先上代码clear;clc;K4;%用户数 M4;%基站天线数 sigma1;%噪声标准差噪声功率1 num_realizations10;%每个 gamma 值下的随机信道次数可调大一点更平滑%定义要扫描的 gamma 范围线性值 gamma_vec0.5:0.5:4;%从0.5到8步长0.5avg_powerzeros(size(gamma_vec));%存储每个 gamma 对应的平均功率fprintf(开始扫描不同 gamma 值...\n);forg_idx1:length(gamma_vec)gammagamma_vec(g_idx);power_sum0;valid_count0;forz1:num_realizations Hrandn(K,M);%随机信道 cvx_begin quiet variable tau nonnegative variableW(M,K)complexminimize(tau)subject tofori1:K%SINR 约束含噪声norm([H(i,:)*W,sigma])sqrt(11/gamma)*real(H(i,:)*W(:,i));%强制接收信号为实数且非负imag(H(i,:)*W(:,i))0;real(H(i,:)*W(:,i))0;endnorm(vec(W))sqrt(tau);cvx_end%检查求解状态只累加成功求解的结果ifstrcmp(cvx_status,Solved)power_sumpower_sumtau;valid_countvalid_count1;else%若不可行忽略该次实现或可记录失败次数%fprintf(gamma %.2f, 第 %d 次不可行\n,gamma,z);end endifvalid_count0avg_power(g_idx)power_sum/valid_count;fprintf(gamma%.2f,有效次数%d,平均功率%.4f\n,gamma,valid_count,avg_power(g_idx));elseavg_power(g_idx)NaN;%若全部不可行置 NaNfprintf(gamma %.2f, 无可行的信道实现\n,gamma);end end%绘图gamma vs 平均最小发射功率 figure;plot(gamma_vec,avg_power,b-o,LineWidth,2);xlabel(SINR 门限 \gamma (线性值));ylabel(平均最小发射功率 (||W||_F^2));title([M,num2str(M),, K,num2str(K),, 噪声功率 \sigma^2,num2str(sigma^2),..., 每个\gamma下随机信道次数,num2str(num_realizations)]);grid on;解释如下这里信道噪声并没完全按照通信的要求来随便给了一个数值只为体现cvx的用法约束和目标函数的写法和第二章的理论完全一致为了克服信道随机性的影响对同一个横坐标多次进行随机信道取结果的平均值以克服随机性的影响。通信论文里面常用也叫蒙特卡洛仿真CVX代码讲解其实蕴含在理论解释部分以及代码注释部分这里不再赘述了。仿真如图模拟不同SINR要求下的最小功率的变化SINR要求越高系统的总发射功率就越大且增长率也越大符合物理意义。4 总结写了很多年的CVX了其实感觉不太好用很多时候理论本身没问题但是受限于数据的精度或者CVX要求的DCP规则导致代码仿真出现异常特别是涉及到迭代的的收敛性很难控制。奈何通信领域用传统凸优化主流还是得用matlab的CVX工具所以没办法得学。最近发现了一个叫AMPL的编程也能够用来求解凸优化问题我用了一段时间感觉比CVX好用点感兴趣也可留言后续会写学习笔记出来。通信优化问题路漫漫其修远兮~