ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

双STAR-RIS辅助NOMA下行和速率最大化的SDP联合优化

2026/9/17 11:34:38 拓冰建站 浏览量
双STAR-RIS辅助NOMA下行和速率最大化的SDP联合优化 简介面向无线通信中双STAR-RIS辅助下行NOMA系统的和速率最大化问题该资源提供基于半正定规划SDP与拉格朗日对偶的联合优化设计复现包含完整可运行的Python代码及逐步解释。内容适合通信工程、信号处理领域的研究人员和技术开发者尤其适合需要掌握智能反射面RIS与非正交多址接入NOMA交替优化方法的中高级读者。压缩包内为1个docx文档大小约53KB文档从系统建模出发详细推导了SDP相移优化、拉格朗日对偶分解、KKT条件功率分配和时间分配优化器并给出系统参数配置、信道模型、SNR计算等关键代码模块便于对照公式理解实现细节。通过仿真对比文档展示了双STAR-RIS相对单STAR-RIS的和速率提升可帮助评估性能与工程可行性。目前已有139人学习对需要复现论文结果或开展后续仿真部署的读者具有直接参考价值docx格式也便于复制、批注和二次编辑。1. 双STAR-RIS辅助下行NOMA和速率最大化这个标题到底在优化什么“双STAR-RIS辅助下行NOMA系统中和速率最大化方法”听起来是篇标准论文标题但拆开看要解决的是三件事把两个STAR-RIS可同时透射和反射的智能反射面的相移系数建模进级联信道在NOMA的SIC串行干扰消除顺序下写出用户可达速率再通过SDP半定松弛和拉格朗日对偶把非凸问题拆成可迭代求解的凸子问题。做这个标题的人通常是在复现某篇论文或者在6G物理层仿真里需要一组能出数值结果的基准算法。本文按“建模 → 松弛 → 联合迭代 → 调试”的顺序给出可直接改的MATLAB框架同时把参数设置和收敛性坑点一并说清。2. 系统模型与优化问题建立双STAR-RIS级联信道与NOMA解码顺序2.1 STAR-RIS与传统RIS的模型差异传统RIS只有反射系数每个单元只能调整一个对角相位。STAR-RIS的每个单元同时具备透射和反射两种模式常见建模是给同一个RIS维护两个对角矩阵透射相移矩阵 Θ_t 和反射相移矩阵 Θ_r。每个对角元素是复数系数模长为1但透射和反射共享同一单元的振幅分配。双STAR-RIS系统里通常部署两个这样的面板服务两个NOMA用户。基站到RIS1、RIS2的信道分别记为 h_SR1、h_SR2RIS到用户的信道记为 h_R U_i。第 i 个用户的复合信道可以写成h_eff_i h_RU_i Θ_i h_SR_i h_d_i其中 h_d_i 是基站到用户的直连信道。将两个RIS的相移向量拼接成一个变量后这个式子会变成关于相移向量 v 的二次型。论文里通常定义增广向量 w [v; 1]把常数直连项也吸收进去这样信号功率可以统一写成 Tr(B_i W)其中 W w w^HB_i 是由信道外积构成的半正定矩阵。这种增广写法是后面SDP松弛的基础。2.2 NOMA下行SIC解码顺序与SINR表达式NOMA的核心是功率域复用。基站叠加发送 x sqrt(p1)s1 sqrt(p2)s2两个用户共享同一时频资源。接收端按信道强度排序做SIC弱用户直接把对方信号当噪声强用户先解出弱用户信号并消除再解自己的信号。假设用户1为弱用户、用户2为强用户令 G_i Tr(B_i W) 表示用户 i 的等效信道增益则两个用户的SINR分别为γ1 p1 G1 / (p2 G1 σ²)γ2 p2 G2 / σ²和速率目标函数就是 R log2(1 γ1) log2(1 γ2)。这个式子成立的前提是SIC成功实际仿真中通常假设理想SIC并额外检查用户1的可解码条件。真实系统里SIC残余干扰会让γ1分母多出一项但论文复现阶段先不加。2.3 和速率最大化问题的非凸来源优化变量包括两组相移向量和两个功率分配系数。问题的非凸性来自三个地方第一相移恒模约束 |v_m| 1 是非凸的。第二W w w^H 要求秩为1秩约束本身非凸。第三速率表达式里 log 内部的信干噪比是变量的分式函数整体关于 W 不一定是凹函数。前两个问题可以通过SDP松弛处理丢弃秩1约束把 |v_m|1 写成 W(m,m)1 的线性约束这样可行域变成半定锥与线性约束的交集。第三个问题需要结合SCA逐次凸近似把对数函数在当前迭代点做一阶展开得到一个凹的下界然后用CVX求解。2.4 SDP松弛与块坐标上升的总体架构联合优化两个RIS的相移和两个用户的功率直接求解很困难。常见做法是块坐标上升法把问题拆成两个子问题交替更新固定功率 → 用SDPSCA更新 W → 秩一恢复得到相移向量 → 固定W → 用拉格朗日对偶或数值搜索更新功率 → 循环直到和速率增量小于阈值。这里给出一段变量声明代码对应MATLAB中的模型初始化结构M1 8; % RIS1 单元数 M2 8; % RIS2 单元数 M M1 M2; % 总相移单元数 Mp M 1; % 增广变量维度 K 2; % 用户数 Ptot 10^(30/10) / 1000; % 30dBm 转瓦 sigma2 10^(-90/10) / 1000; % -90dBm 噪声功率 % 信道矩阵按论文常见方式生成 h_SR1 (randn(1,M1) 1i*randn(1,M1)) / sqrt(2); h_SR2 (randn(1,M2) 1i*randn(1,M2)) / sqrt(2); h_RU1 (randn(1,M1) 1i*randn(1,M1)) / sqrt(2); h_RU2 (randn(1,M2) 1i*randn(1,M2)) / sqrt(2); h_d1 (randn(1,1) 1i*randn(1,1)) / sqrt(2); h_d2 (randn(1,1) 1i*randn(1,1)) / sqrt(2);这段代码把信道复数增益归一化到单位方差后面所有矩阵 B_i 都由这些信道值外积构造。信道生成的分布会直接影响SDP解的秩一比例后面调试部分会专门讲到。3. 基于SDP与拉格朗日对偶的联合优化设计从松弛到迭代求解3.1 相移子问题的SCA下界推导与CVX实现固定功率 p1、p2 后和速率只与 W 有关。把 γ1、γ2 代进去R 可以写成两组 log 之差。对用户1有R1 log( Ptot G1 σ² ) - log( p2 G1 σ² )其中第一项 log 内部是仿射函数log 后是凹函数可以直接保留第二项前面有负号需要做一阶泰勒展开。在迭代点 W0 处p2 Tr(B1 W0) σ² x0于是log( p2 G1 σ² ) ≈ - log(x0) - (p2 G1 σ² - x0) / x0这个下界是 W 的仿射函数整体目标变成「凹函数 仿射函数」最大化问题变成凸问题。对用户2γ2 的表达式里没有干扰项log(1 p2 G2 / σ²) 本身就是凹函数可以直接保留。CVX实现如下function W_opt update_W_by_SDP(B1, B2, p1, p2, W0, sigma2, Mp) x0 p2 * real(trace(B1 * W0)) sigma2; if x0 0 x0 1e-6; end cvx_begin sdp quiet variable W(Mp, Mp) hermitian semidefinite maximize( log( (p1p2) * real(trace(B1 * W)) sigma2 ) ... - (p2 * real(trace(B1 * W)) sigma2) / x0 ... log( p2 * real(trace(B2 * W)) sigma2 ) ) subject to for m 1:Mp-1 W(m, m) 1; end W(Mp, Mp) 1; cvx_end W_opt W; end这段代码每一行都有实际作用x0 是当前迭代点用来构造一阶下界CVX 里 maximize 的目标函数必须是凹函数内部 log 表达式会在求解器里被识别为凹函数对角线约束 W(m,m)1 对应恒模约束最后一个对角元素固定为1是为了保证增广向量 w 的最后一个分量是1。这里的 B1、B2 需要提前构造构造方式是利用前面的信道向量外积。3.2 功率子问题的拉格朗日对偶与注水解法固定 W 后G1、G2 变成常数功率分配子问题只剩下两个变量。对两用户NOMA和速率最大化没有最小速率约束时最优解通常落在总功率约束边界上这是因为 log 函数单调递增多分配功率不会降低另一条链路的增益最多只是增加干扰。此时 p1 p2 Ptot问题降成一维搜索。论文里更常见的做法是引入拉格朗日对偶。对约束 p1 p2 ≤ Ptot 引入对偶变量 λ拉格朗日函数为L R1 R2 - λ (p1 p2 - Ptot)对 p1 求偏导并令其为零得到注水形式的条件当用户可被同时调度时p1 和 p2 的取值会让两个用户的有效增益满足某种均衡。实际实现时由于一维注水表达式存在边界切换直接用数值搜索更稳。这里给出黄金分割搜索代码它等价于对偶变量 λ 的二分但更不容易出现数值震荡function p_opt update_power_by_search(G1, G2, Ptot, sigma2) obj (p2) -rate_two_user(Ptot - p2, p2, G1, G2, sigma2); options optimset(TolX, 1e-8); [p2_opt, ~] fminbnd(obj, 0, Ptot, options); p_opt [Ptot - p2_opt; p2_opt]; end function R rate_two_user(p1, p2, G1, G2, sigma2) gamma1 p1 * G1 / (p2 * G1 sigma2 eps); gamma2 p2 * G2 / (sigma2 eps); R log2(1 gamma1) log2(1 gamma2); end这段代码把功率分配变成一维优化fminbnd 在 [0, Ptot] 上搜索 p2p1 自动等于 Ptot - p2。目标函数里加了 eps 防止除零。实际论文复现时这种数值搜索的结果和拉格朗日对偶的解析解一致只是少了推导过程。如果你的复现目标是验证对偶间隙可以在此基础上把对偶变量 λ 的更新单独写成二分循环。3.3 主循环双STAR-RIS联合优化设计的完整代码将相移更新和功率更新交替执行就是完整的联合优化设计。主循环需要设置最大迭代次数和收敛阈值并在每次迭代后计算当前和速率。秩一恢复放在相移更新之后恢复出的相移向量需要重新归一化到恒模约束上。v1 exp(1i * 2 * pi * rand(M1, 1)); v2 exp(1i * 2 * pi * rand(M2, 1)); p [Ptot/2; Ptot/2]; R_hist zeros(max_iter, 1); for iter 1:max_iter w [v1; v2; 1]; W0 w * w; % 构造 B1, B2每次信道变化后只需构造一次 [B1, B2] build_B_matrix(...); % 由 h_SR1, h_SR2, h_RU1, h_RU2 外积生成 W update_W_by_SDP(B1, B2, p(1), p(2), W0, sigma2, Mp); v rank1_recovery(W, M, B1, B2, p, sigma2); G1 real(v * A1 * v) abs(h_d1)^2; G2 real(v * A2 * v) abs(h_d2)^2; p update_power_by_search(G1, G2, Ptot, sigma2); R_hist(iter) rate_two_user(p(1), p(2), G1, G2, sigma2); if iter 1 abs(R_hist(iter) - R_hist(iter-1)) 1e-4 break; end end这里把 B1、B2 的构造省略成函数调用实际要展开成对角向量外积与直连信道叠加。收敛判据用的是相对速率增量阈值 1e-4 在多数场景下够用如果仿真CRB需要更高精度可以继续降到 1e-6但要注意SDP求解器本身的终止容差会限制实际精度。相移向量 v 每次迭代后必须重新归一化否则恒模约束会在下一轮被破坏。3.4 主要参数表下表是一组我习惯作为起点的仿真参数覆盖系统级仿真中影响SDP求解行为的关键量。参数数值说明M1, M28, 8RIS单元数增加会加大CVX求解时间载波频率2.4 GHz决定路径损耗模型基站到RIS距离50 m可调整为100 m观察性能下降Ptot30 dBm总发射功率转瓦后用于注水噪声功率-90 dBm与带宽相关对应10 MHz带宽用户数2NOMA叠加用户数最大迭代30SCASDP通常30次内收敛秩一恢复随机化次数200随机化不够时秩一性较差4. 仿真调试与参数灵敏度让SDP解法真正收敛4.1 初始化和随机种子SDP的“假收敛”陷阱CVX求解SDP时经常出现一种情况迭代几轮后和速率增量很小但秩一比例一直不达标比如最大特征值占比只有0.7。原因是初始点选得太差SCA的一阶展开停留在某个低质量局部点上。处理方式有两个。第一多随机种子取最优。每次随机生成一组相位初始值完整跑完联合迭代记录最终速率重复5到10次后取最大结果。这个做法代价是计算时间线性增长但能显著改善置信度。第二对 W 的初始化不要直接用 w w^H而是在 w 上叠加小幅复数噪声避免初始点落在对称鞍点。代码里可以这样处理v_init exp(1i * 2 * pi * rand(M,1)); w [v_init; 1] 0.01 * (randn(M1,1) 1i*randn(M1,1)); W0 w * w;噪声幅度 0.01 不会改变恒模约束的松弛效果但能打破对称性。复数噪声必须同时加实部和虚部只加实部会影响相位分布。4.2 秩一恢复的随机化实现SDP松弛解出的 W 不一定是秩一矩阵。收敛后需要用主特征向量或随机化方法恢复 v。随机化方法比直接取主特征向量更稳因为它能在多个候选向量里挑和速率最高的那个。实现如下function v rank1_recovery(W, M, B1, B2, p, sigma2) [U, S, ~] svd(W); s diag(S); if s(1) / sum(s) 0.999 w sqrt(s(1)) * U(:, 1); v w(1:M); v v ./ abs(v); return; end L chol(W 1e-8 * eye(size(W)), lower); best_R -inf; for r 1:200 u randn(size(L,1),1) 1i * randn(size(L,1),1); w_try L * u; w_try w_try / w_try(end); v_try w_try(1:M); v_try v_try ./ abs(v_try); G1 real(v_try * A1 * v_try) abs(h_d1)^2; G2 real(v_try * A2 * v_try) abs(h_d2)^2; R_try rate_two_user(p(1), p(2), G1, G2, sigma2); if R_try best_R best_R R_try; v v_try; end end end这个函数的核心逻辑是如果主特征值占比超过0.999直接用主特征向量否则用 Cholesky 分解采样200个候选向量每个都归一化到恒模再按和速率挑最优。1e-8 是给 Cholesky 分解加的正则项防止 W 半正定但数值上出现零特征值。4.3 收敛判断与CVX报错排查常见的 CVX 报错是「The expression is neither convex nor concave」多出现在把 log 差表达式改写成错误形式时。要记住一个原则凹函数减去凸函数可以直接保留凸函数减去凹函数必须展开SCA展开项前面的系数不能漏掉。报错时优先检查目标函数里有没有出现 log 与负 log 叠加后整体凹凸性不明的情况。另一个常见问题是 SDP 求解器返回 「Inaccurate/Solved」 状态。这种现象在 MOSEK 和 SDPT3 里都常见特别是当对角约束数量接近M时。解决办法是把 W 的解 s(1)/sum(s) 打出来看如果经过恢复后系统性能稳定可以忽略求解器的警告如果性能随机种子间波动很大通常是秩一恢复失败而不是求解器精度问题。下表汇总了我在调试中遇到的主要问题与对策。现象可能原因对策迭代不收敛和速率震荡SCA 展开点与功率更新不同步固定功率迭代5轮后再启动功率更新秩一比例长期低于0.9初始点太差增加随机种子数量或减小SCA步长CVX报非凸错误log 差展开错误检查负log项是否做了泰勒展开求解器返回Inaccurate对角约束过多或松尺度打开cvx_precision high两条链路速率悬殊NOMA功率分配退化到边界加入最小速率约束 R_min5. 进阶双STAR-RIS退化测试与数值验证技巧复现论文时最容易犯的错误是直接跑完整算法却不知道结果是否合理。我建议先做退化测试用两组对照实验验证代码正确性。第一组测试是STAR-RIS退化到传统RIS。在能量分裂模式下将透射相移设置为0振幅反射相移保持恒模这样STAR-RIS就等价于一个普通RIS。如果代码正确退化后的速率不应该超过完整STAR-RIS的结果这是验证建模一致性的最低标准。对应的MATLAB判断可以写在主循环外% 退化测试将第二个RIS的透射/反射系数设为纯反射 v2_reflect exp(1i * 2 * pi * rand(M2, 1)); v2_trans zeros(M2, 1); [v_combine] combine_STAR_coeff(v2_reflect, v2_trans, ES);第二组测试是双RIS退化为单RIS。将一个RIS的相移固定为单位阵另一个RIS照常优化此时系统性能应介于“单RIS辅助”和“双RIS辅助”之间。如果单RIS结果比双RIS还好说明信道构造或者B矩阵拼接有误比如把两个RIS的单元顺序搞混了。蒙特卡洛仿真建议每次生成新信道后跑完完整联合优化再对所有信道实现取平均。跨信道平均时要注意log 域平均和小数线性域平均不同论文里报告的通常是线性域平均后再取对数。曲线对比时横轴用 Ptot 从 10 dBm 到 40 dBm纵轴用平均和速率每次仿真至少 200 个信道实现否则抖动会掩盖不同算法之间的差距。如果只想验证SDP松弛的紧致性可以在同一个信道实现下对比松弛后的速率目标和秩一恢复后的真实速率两者的差距就是松弛间隙通常应低于 5%。本文还有配套的精品资源点击获取