简介本资源是一份面向通信工程研究人员与高年级研究生的学术复现资料聚焦双STAR-RIS辅助下行NOMA系统的和速率最大化问题解决RIS相移、功率分配与时间分配三者联合优化这一核心挑战。包内含1个53KB的DOCX文档系统梳理了SDP松弛求解STAR-RIS相移、拉格朗日对偶分解法实现功率分配、函数极值法优化时间分配的完整推导链并附可运行Python代码含信道建模、多RIS级联信道计算、SINR迭代求解及收敛判断等关键模块辅以逐行注释与参数说明显著降低复现门槛。已有142人学习下载适合开展RIS-NOMA联合设计研究、撰写小论文或课程设计尤其利于理解KKT条件应用、半正定规划在无线通信中的落地逻辑以及交替优化框架的实际编程实现细节。1. 双STAR-RIS辅助NOMA下行链路为什么“和速率最大化”不能只靠调参而必须拆解SDP拉格朗日对偶的联合结构在5G-Advanced与6G原型验证中当基站覆盖边缘用户如工厂车间远端传感器、地下停车场终端时传统NOMA常因信道不对称性导致弱用户吞吐量骤降——不是功率分配没调好而是信道本身存在不可忽略的相位盲区。这时单纯优化功率系数如用SIC顺序或凸松弛已逼近理论天花板。双STAR-RISSimultaneous Transmitting and Reflecting Reconfigurable Intelligent Surface的出现本质是把“被动反射面”升级为“可编程全向信道编译器”它能同时调控入射信号的反射分量与透射分量为上行/下行、近端/远端用户分别构建独立可控的等效信道。本文标题所指的“和速率最大化”核心矛盾不在功率域而在空间域与功率域的耦合建模——即如何让反射系数矩阵Ω、透射系数矩阵Θ、基站预编码矩阵W、用户功率分配向量p四者协同使∑log₂(1SINRₖ)全局最优。这无法用梯度下降黑盒求解因为Ω/Θ含模长约束|ωₙ|≤1、相位连续性要求实际器件相位步进非无限精细且W与p存在非线性分式耦合。因此必须采用半定规划SDP松弛拉格朗日对偶分解的联合框架前者将非凸的二次型SINR约束转为线性矩阵不等式LMI后者将高维耦合变量解耦为基站层W,p与RIS层Ω,Θ的交替优化。本文复现严格遵循IEEE TWC 2023年一篇实证论文的数学推导路径所有代码基于CVXPYNumPy实现不依赖任何私有仿真平台可直接在消费级笔记本i7-11800H RTX3060上完成16-element双STAR-RIS场景的完整求解平均耗时90s。适合通信物理层算法工程师、RIS方向研究生及准备顶会复现实验的科研人员。2. 从信道建模到问题重构双STAR-RIS-NOMA系统建模的三个关键跃迁2.1 建立双STAR-RIS的联合信道响应模型为什么不能简单拼接反射/透射矩阵传统单RIS建模仅需一个对角相位矩阵Φ但双STAR-RIS需同时刻画反射信道Hᵣ ∈ ℂ^(M×N)与透射信道Hₜ ∈ ℂ^(K×N)M为基站天线数K为用户数N为RIS单元数。关键在于反射与透射并非正交分量而是由同一入射场激发的共轭响应。根据电磁场互易性原理实际物理实现中二者满足能量守恒约束|ωₙ|² |θₙ|² ≤ 1ωₙ为第n单元反射系数θₙ为透射系数。因此必须定义联合响应矩阵import numpy as np # 假设N16个RIS单元M4基站天线K3用户 N, M, K 16, 4, 3 # 随机生成LoS主导的信道符合典型室内场景 H_bs_ris np.random.randn(M, N) 1j * np.random.randn(M, N) # 基站→RIS H_ris_user np.random.randn(K, N) 1j * np.random.randn(K, N) # RIS→用户 # 注意此处H_ris_user实际包含反射路径H_ris_user_reflect与透射路径H_ris_user_transmit # 正确做法将H_ris_user拆分为两部分 H_ref np.random.randn(K, N) 1j * np.random.randn(K, N) # 反射路径如用户在RIS同侧 H_tra np.random.randn(K, N) 1j * np.random.randn(K, N) # 透射路径如用户在RIS异侧 # 双STAR-RIS的等效信道为 # 对反射用户k_refh_k_ref H_ref[:, n] * omega_n # 对透射用户k_trah_k_tra H_tra[:, n] * theta_n # 因此总信道矩阵需按用户类型分组构造提示很多复现失败源于此处建模错误——直接将H_ris_user当作单一矩阵乘以diag([ω;θ])忽略了反射/透射路径的空间分离性。正确做法是先根据用户部署位置通过几何坐标判断是否在RIS法线同侧划分用户集_ref与_tra再分别构建H_ref∈ℂ^(|_ref|×N)与H_tra∈ℂ^(|_tra|×N)。本复现默认3用户中2个为反射用户、1个为透射用户模拟RIS部署于走廊一侧2用户在走廊内1用户在对面房间。2.2 NOMA功率分配与SIC解码约束的数学显式化SINR表达式如何嵌入SDP框架NOMA的核心是叠加编码串行干扰消除SIC。设用户按信道增益降序排列为k1,2,3基站发送信号x ∑ₖ√pₖ sₖsₖ为用户k信息符号则用户k的SINR为$$ \text{SINR}k \frac{p_k |h_k^H w_k|^2}{\sum{ik} p_i |h_k^H w_i|^2 \sigma^2} $$但该式含分式与二次项无法直接放入凸优化。SDP松弛的关键一步是引入辅助变量tₖ表示用户k的接收信干噪比倒数即1/SINRₖ并利用Schur补引理将其转化为LMI约束$$ \begin{bmatrix} t_k (h_k^H w_k)^H \ h_k^H w_k \sum_{ik} p_i h_k^H w_i w_i^H h_k \sigma^2 I \end{bmatrix} \succeq 0 $$然而双STAR-RIS引入新变量ωₙ,θₙ后hₖ变为ω/θ的函数导致上述矩阵仍非线性。此时需进一步定义扩展信道向量# 构造扩展信道向量关键 # 对反射用户kh_k H_ref[k, :] ⊙ omega → 等价于 h_k diag(H_ref[k, :]) omega # 对透射用户kh_k H_tra[k, :] ⊙ theta → 等价于 h_k diag(H_tra[k, :]) theta # 因此定义块对角矩阵 H_ext_ref np.zeros((len(K_ref), N), dtypecomplex) for k_idx, k in enumerate(K_ref): H_ext_ref[k_idx, :] np.diag(H_ref[k, :]) # 注意此处diag()作用于行向量实际应构造对角矩阵 # 更严谨写法避免diag误用 H_ext_ref np.array([np.diag(H_ref[k, :]) for k in K_ref]) # shape: (|K_ref|, N, N) # 但SDP要求线性约束故需向量化vec(h_k) (I_N ⊗ H_ref[k, :].conj().T) vec(Omega) # 其中Omega diag(omega) ∈ ℂ^(N×N)vec(Omega) ∈ ℂ^(N²×1) # 这正是SDP松弛的起点——将非线性项转为线性映射参数说明K_ref为反射用户索引列表如[0,1]H_ref[k,:]是第k个反射用户的RIS-用户信道行向量。⊙表示Hadamard积逐元素相乘其向量化形式为vec(a⊙b) diag(vec(a)) vec(b)这是将RIS系数嵌入SDP约束的核心代数技巧。未做此转换会导致后续SDP问题不可行。2.3 拉格朗日对偶分解的变量分组逻辑为什么基站层与RIS层必须交替优化原始问题含四组变量WM×K预编码矩阵、pK维功率向量、ΩN×N反射系数对角阵、ΘN×N透射系数对角阵。若直接联合优化变量维度达M×K K 2NSDP求解器内存爆炸。拉格朗日对偶的物理意义是将耦合约束如用户QoS要求γₖ作为惩罚项引入目标函数从而解耦变量更新。具体分组为基站层子问题固定Ω,Θ优化W,p —— 此时信道hₖ已知退化为标准NOMA功率分配ZF预编码问题可用CVXPY直接求解RIS层子问题固定W,p优化Ω,Θ —— 此时目标变为max∑log₂(1SINRₖ)但SINRₖ含|ωₙ|²,|θₙ|²项需用MMMajorization-Minimization算法迭代逼近。# 拉格朗日函数示例简化版 def lagrangian(W, p, Omega, Theta, lambda_vec, gamma_vec): # lambda_vec: K维拉格朗日乘子gamma_vec: K维QoS阈值 rate_sum 0.0 for k in range(K): # 计算当前SINR_k需根据用户类型调用H_ref或H_tra if k in K_ref: h_k H_ref[k, :] np.diag(Omega.diagonal()) # 实际应为H_ref[k,:] Omega else: h_k H_tra[k, :] np.diag(Theta.diagonal()) sinr_k compute_sinr(h_k, W, p, k, sigma2) rate_sum np.log2(1 sinr_k) # 惩罚项sum_k lambda_k * max(0, gamma_k - sinr_k) penalty 0.0 for k in range(K): sinr_k compute_sinr(...) # 同上 penalty lambda_vec[k] * max(0, gamma_vec[k] - sinr_k) return rate_sum - penalty # 交替优化主循环 for iter in range(max_iter): # Step 1: 固定Omega,Theta优化W,p W_opt, p_opt solve_base_station_subproblem(H_ref, H_tra, K_ref, K_tra, Omega, Theta, sigma2) # Step 2: 固定W_opt,p_opt优化Omega,Theta用MM算法 Omega_opt, Theta_opt solve_ris_subproblem(H_ref, H_tra, K_ref, K_tra, W_opt, p_opt, sigma2) # Step 3: 更新lambda_vec次梯度法 lambda_vec update_lambda(lambda_vec, gamma_vec, W_opt, p_opt, Omega_opt, Theta_opt, sigma2)逻辑说明solve_base_station_subproblem()内部调用CVXPY构建SDP问题将SINR约束转为LMIsolve_ris_subproblem()不直接求解非凸问题而是构造一个可微的下界函数surrogate function例如用一阶泰勒展开近似log₂(1SINRₖ)使其关于ωₙ,θₙ凸化。这是避免陷入局部极值的关键——直接对原始目标求导会导致振荡。3. SDP松弛的落地实现用CVXPY构建可解的半定规划问题3.1 将SINR约束转化为LMISchur补的实际编码步骤CVXPY不支持直接输入分式约束必须手动实现Schur补。以用户k的SINR约束为例假设k为反射用户$$ \text{SINR}k \geq \gamma_k \quad \Leftrightarrow \quad p_k |h_k^H w_k|^2 \geq \gamma_k \left( \sum{ik} p_i |h_k^H w_i|^2 \sigma^2 \right) $$令u_k h_k^H w_k则左侧为p_k * |u_k|²右侧含|u_k|²的线性组合。SDP松弛引入辅助矩阵U_k w_k w_k^H秩1约束被暂时忽略则|u_k|² trace(H_k U_k H_k^H)其中H_k h_k h_k^H。最终LMI形式为$$ \begin{bmatrix} \text{trace}(H_k U_k H_k^H) \sqrt{p_k} \cdot \text{vec}(U_k)^H \ \sqrt{p_k} \cdot \text{vec}(U_k) I \end{bmatrix} \succeq 0 $$但在CVXPY中更实用的做法是使用cvxpy.lambda_min()或直接构造块矩阵import cvxpy as cp def build_sdr_constraints(U_list, p, H_list, gamma, sigma2, K_ref, K_tra): constraints [] for k in range(len(H_list)): # H_list[k] 是用户k的等效信道向量已包含RIS系数影响 hk H_list[k] # 构造SINR约束p_k * |hk * wk|^2 gamma_k * (sum_{ik} p_i * |hk * wi|^2 sigma2) # 使用U_k w_k w_k^H则 |hk * w_k|^2 trace(hk * hk.H U_k) lhs p[k] * cp.trace(hk hk.conj().T U_list[k]) rhs_terms 0 for i in range(k1, len(H_list)): rhs_terms p[i] * cp.trace(hk hk.conj().T U_list[i]) rhs gamma[k] * (rhs_terms sigma2) constraints.append(lhs rhs) return constraints # 主优化问题 U_vars [cp.Variable((M, M), complexTrue) for _ in range(K)] p_var cp.Variable(K) objective cp.Maximize(cp.sum([cp.log(1 cp.inv_pos(cp.pos(gamma[k] - ...))) for k in range(K)])) # 实际目标为sum log(1SINR_k)但CVXPY中log需用cp.logSINR需用上述约束保证 constraints build_sdr_constraints(U_vars, p_var, H_eff_list, gamma, sigma2, K_ref, K_tra) # 添加半正定约束 for U in U_vars: constraints.append(U 0) # U is PSD # 添加秩1约束不添加这是SDP松弛的核心——去掉rank(U)1解完后再用SVD提取w_k prob cp.Problem(objective, constraints) prob.solve(solvercp.MOSEK, verboseTrue) # MOSEK对SDP最稳定参数说明U_vars[k]是第k用户的预编码协方差矩阵 0表示半正定约束。cp.inv_pos()用于处理1/x类凸函数但此处SINR约束已通过不等式显式表达故目标函数直接用cp.log(1 ...)需确保内部为正——这由SINR约束lhs rhs保障。MOSEK求解器比ECOS更可靠尤其在处理大规模LMI时若无MOSEK许可证可用SCS但需设置eps1e-3避免收敛失败。3.2 RIS系数的模长与相位联合约束如何在CVXPY中表达|ωₙ|≤1且∠ωₙ∈[0,2π)双STAR-RIS的硬件限制是每个单元的反射系数ωₙ与透射系数θₙ满足|ωₙ|² |θₙ|² ≤ 1且相位通常离散化如4-bit相位分辨率对应16个离散值。CVXPY无法直接处理离散约束故分两步连续松弛阶段将ωₙ,θₙ建模为复数变量添加圆盘约束|ωₙ|² ≤ 1,|θₙ|² ≤ 1,|ωₙ|² |θₙ|² ≤ 1离散化后处理SDP解出连续解后对每个ωₙ,θₙ进行最近邻量化nearest-neighbor quantization。# 定义RIS变量N个单元 omega cp.Variable(N, complexTrue) theta cp.Variable(N, complexTrue) # 圆盘约束关键 constraints_ris [] for n in range(N): constraints_ris.append(cp.abs(omega[n])**2 1) constraints_ris.append(cp.abs(theta[n])**2 1) constraints_ris.append(cp.abs(omega[n])**2 cp.abs(theta[n])**2 1) # 相位连续性约束可选提升硬件可行性 # 要求相邻单元相位差不超过Δφ如π/4 for n in range(1, N): phase_diff cp.angle(omega[n]) - cp.angle(omega[n-1]) constraints_ris.append(cp.abs(phase_diff) np.pi/4) # 注意cp.angle()在CVXPY中不可微需用sin/cos替代 # 实用替代令omega[n] r_n * exp(j*phi_n)则约束|phi_n - phi_{n-1}| ≤ Δφ # 但phi_n需定义为实变量omega[n] r_n * (cp.cos(phi_n) 1j * cp.sin(phi_n)) # 离散化后处理函数 def quantize_ris_coeff(coeff, bits4): # coeff: 复数数组如omega或theta angles np.angle(coeff) magnitudes np.abs(coeff) # 4-bit相位16个均匀分布角度 quant_angles np.linspace(0, 2*np.pi, 2**bits, endpointFalse) # 对每个系数找最近角度并缩放幅度至满足|ω|²|θ|²≤1 quant_coeff np.zeros_like(coeff, dtypecomplex) for i, (mag, ang) in enumerate(zip(magnitudes, angles)): nearest_idx np.argmin(np.abs(quant_angles - ang)) quant_ang quant_angles[nearest_idx] # 幅度按比例缩放若原|ω|²|θ|²1则等比例缩小 scale min(1.0, np.sqrt(1 / (mag**2 1e-6))) quant_coeff[i] scale * mag * (np.cos(quant_ang) 1j * np.sin(quant_ang)) return quant_coeff注意cp.angle()在CVXPY中不被支持实际编码需用cp.cos()和cp.sin()显式构造。例如定义phi cp.Variable(N)则omega[n] r[n] * (cp.cos(phi[n]) 1j * cp.sin(phi[n]))再添加phi[n] - phi[n-1] np.pi/4等约束。本复现为简化默认关闭相位连续性约束仅保留模长约束因实测显示其对和速率影响3%。4. 拉格朗日对偶更新与收敛性保障次梯度法的步长选择与早停策略4.1 拉格朗日乘子的次梯度更新公式为什么不能用固定步长拉格朗日对偶问题中乘子λₖ的更新规则为$$ \lambda_k^{(t1)} \left[ \lambda_k^{(t)} \alpha_t \cdot \max\left(0, \gamma_k - \text{SINR}_k^{(t)}\right) \right]^ $$其中[·]⁺表示投影到非负域。步长αₜ的选择直接影响收敛速度与稳定性固定步长如αₜ0.01初期收敛快但后期在最优解附近振荡无法精确满足QoS约束递减步长如αₜα₀/t保证收敛但收敛过慢100次迭代后仍可能残留10⁻²级违反自适应步长推荐αₜ α₀ / √t兼顾速度与精度。# 次梯度更新函数 def update_lambda(lambda_vec, gamma_vec, W, p, Omega, Theta, sigma2, alpha00.1, t1): new_lambda np.zeros_like(lambda_vec) for k in range(len(gamma_vec)): # 计算当前SINR_k sinr_k compute_current_sinr(k, W, p, Omega, Theta, sigma2) violation max(0, gamma_vec[k] - sinr_k) # 自适应步长alpha_t alpha0 / sqrt(t) alpha_t alpha0 / np.sqrt(t) new_lambda[k] max(0, lambda_vec[k] alpha_t * violation) return new_lambda # 主循环中的调用 lambda_vec update_lambda(lambda_vec, gamma_vec, W_opt, p_opt, Omega_opt, Theta_opt, sigma2, titer1)参数说明alpha00.1是经验值适用于γₖ∈[3,10]dB的典型QoS要求若γₖ更高如15dB需增大alpha0至0.3。titer1确保步长随迭代递减避免后期振荡。实测表明当max_violation 1e-3且|rate_change| 1e-4时可终止此时QoS约束满足度达99.97%。4.2 收敛性验证的三重指标不能只看目标函数值下降仅监控∑log₂(1SINRₖ)下降是危险的——可能陷入鞍点或数值误差累积。必须同步检查指标合格阈值检查方法QoS约束违反最大值 1e-3 dBmax(gamma_k - SINR_k)需在每次迭代后显式计算功率总和偏差 1e-5 WRIS能量守恒满足度sum(ωₙdef check_convergence(sinr_list, gamma_vec, p, P_max, Omega, Theta, N): violations [max(0, gamma - sinr) for gamma, sinr in zip(gamma_vec, sinr_list)] qos_ok max(violations) 1e-3 power_ok abs(np.sum(p) - P_max) 1e-5 energy_ok np.sum(np.abs(Omega.diagonal())**2 np.abs(Theta.diagonal())**2) N 1e-6 return qos_ok and power_ok and energy_ok # 在主循环中 if check_convergence(current_sinr, gamma_vec, p_opt, P_max, Omega_opt, Theta_opt, N): print(fConverged at iteration {iter}) break血泪经验曾因忽略energy_ok检查导致RIS单元总能耗超限sum(|ωₙ|²|θₙ|²)1.05*N虽和速率略高但硬件无法实现。务必在每次迭代后验证物理可行性——这是从论文复现走向工程落地的分水岭。5. 避坑指南双STAR-RIS-NOMA复现中最常见的5个翻车点5.1 现象SDP问题状态为“infeasible”CVXPY报错“Problem does not appear to be DCP-compliant”原因未对复数变量显式声明complexTrue导致CVXPY默认实数运算cp.abs(omega[n])**2被解析为omega[n]**2平方而非模平方SINR约束中混用cp.log与cp.inv_pos而cp.log要求参数为正但初始p为零向量时SINRₖ0触发log(10)0合法但若约束写成cp.log(SINRₖ)则非法。解决所有复数变量必须用cp.Variable(shape, complexTrue)SINR约束统一用不等式lhs rhs目标函数用cp.sum(cp.log(1 SINR_approx))其中SINR_approx由约束保证为正初始p设为小正数如p_init np.ones(K) * 0.1避免零除。5.2 现象交替优化后和速率不升反降或在某次迭代后突降至零原因RIS层优化时未冻结基站层变量导致W,p在RIS更新中被意外修改compute_sinr()函数中用户索引错位如将透射用户信道H_tra误用于反射用户计算拉格朗日乘子更新后未重新归一化导致λₖ爆炸如某次迭代λₖ达1e6使惩罚项主导目标函数。解决在solve_ris_subproblem()中W,p必须作为cp.Parameter传入而非cp.Variable严格按K_ref与K_tra索引调用对应信道矩阵建议在函数开头加断言assert k in K_ref or k in K_tra每次更新lambda_vec后添加裁剪lambda_vec np.clip(lambda_vec, 0, 1e3)防止数值溢出。5.3 现象解出的U_k矩阵秩远大于1如rank(U_k)3.2导致提取w_k后SINR大幅下降原因SDP松弛后未执行秩1近似Rank-1 Approximation直接取U_k的特征向量作为w_kCVXPY求解器返回的U_k含数值噪声奇异值谱平缓无法清晰区分主特征向量。解决必须对每个U_k做SVDU_k V Σ V^H取最大特征值对应特征向量v₁令w_k sqrt(Σ₁₁) * v₁添加秩1验证np.linalg.norm(U_k - w_k w_k.conj().T) / np.linalg.norm(U_k) 1e-2否则警告并重采样。5.4 现象量化后的RIS系数在硬件测试中性能暴跌和速率下降40%原因量化时仅考虑单个系数ωₙ未联合优化ωₙ与θₙ以满足|ωₙ|²|θₙ|²≤1相位量化使用np.angle()直接取主值-π,π]但硬件相位范围为[0,2π)导致跨边界误差放大。解决量化函数quantize_ris_coeff()必须输入omega与theta成对处理按|ωₙ|²|θₙ|²联合缩放相位量化前统一偏移angles np.mod(np.angle(coeff), 2*np.pi)再映射到[0,2π)区间。5.5 现象多用户场景下SIC解码失败强用户解码弱用户信号时误码率飙升原因未按信道增益真实排序用户而是按索引k0,1,2硬编码SIC顺序compute_sinr()中干扰项∑_{ik} p_i |h_k^H w_i|²未排除自身用户即i≠k导致计算错误。解决每次迭代前重新计算用户信道增益||h_k||²用np.argsort(-norms)获得真实降序索引orderSINR计算中明确interf_sum sum(p[i] * |h_k^H w_i|² for i in order if i current_rank)current_rank为当前用户在order中的位置。6. 工程级提速与精度平衡一个值得坚持的三步验证习惯6.1 第一步用小规模场景N4, K2快速验证数学逻辑不要一上来就跑N16,K3。先构建最简案例1基站天线M1、2用户、4 RIS单元。此时问题退化为标量优化可手算验证设H_ref[1,0.5,0.3,0.1],H_tra[0.2,0.8,0.4,0.6],gamma[3,5]dB手动设定omega[0.8,0.6,0.4,0.2],theta[0.2,0.4,0.6,0.8]满足能量守恒计算理论SINR₁,SINR₂再用代码输出对比——若误差0.1dB说明信道建模或SINR计算有误。这一步耗时5分钟却能拦截80%的底层逻辑错误。我坚持在每次新增功能如加入相位约束后都回归此测试。6.2 第二步用CVXPY的prob.get_problem_data()导出SDP问题结构CVXPY内部将问题转为标准SDP格式min c^T x s.t. F_0 sum x_i F_i ⪰ 0。调用data, solver, inverse_data prob.get_problem_data(cp.MOSEK) print(Number of variables:, len(data[c])) print(Number of LMI constraints:, len(data[F]))若变量数远超预期如N16时变量数1000说明矩阵未向量化或约束冗余若LMI约束数为0说明 0约束未生效常见于忘记U 0或U cp.Variable(..., PSDTrue)。这是定位“infeasible”问题的黑匣子钥匙——比读报错日志高效十倍。6.3 第三步用蒙特卡洛仿真验证统计鲁棒性论文结果常基于单次信道快照但实际部署需抗衰落。我固定优化出的Omega,Theta,W,p生成1000次独立信道保持大尺度衰落小尺度服从Rayleigh统计和速率CDFrates [] for _ in range(1000): H_bs_ris_new gen_rayleigh_channel(M, N) H_ref_new gen_rayleigh_channel(len(K_ref), N) H_tra_new gen_rayleigh_channel(len(K_tra), N) # 用固定Omega,Theta,W,p计算rate rate compute_sum_rate(H_bs_ris_new, H_ref_new, H_tra_new, Omega, Theta, W, p, sigma2) rates.append(rate) # 输出5%-ile rate, median rate, 95%-ile rate print(f5%-ile: {np.percentile(rates, 5):.2f} bps/Hz)我的习惯如果5%-ile rate低于论文报告值的70%则判定方案脆弱需回溯RIS配置或增加QoS约束。这个习惯让我避开过三次“论文光鲜、实测翻车”的坑——毕竟通信系统的终极检验不是收敛曲线而是信道波动下的生存能力。希望帮到你。本文还有配套的精品资源点击获取