用cvx求解SDP问题:MATLAB与R实现结果不一致问题排查
错误排查与修正
你代码中的问题主要有以下4点:
- 维度参数
k未定义:你的变量X是5×5的对称半正定矩阵,但代码中X = Variable(k, k, PSD = T)里的k没有提前赋值为5,直接运行会报错,变量维度完全不符合要求。 - 约束逻辑错误:你定义X时已经设置了
PSD = T,已经隐含了X对称半正定的要求,额外添加的X >= 0在CVXR中是逐元素非负约束,和你原问题要求的矩阵半正定不是同一概念,会引入错误约束导致结果偏差。 - 缺少求解执行步骤:你仅构造了优化问题对象,没有调用
solve()函数执行求解,自然无法得到正确的计算结果。 - 未指定支持SDP的求解器:半正定规划问题需要专用求解器支持,最好显式指定SCS等支持SDP的求解器,避免默认求解器不兼容。
修正后的完整R代码
library(CVXR) # 输入矩阵定义 Lhs = matrix(c(19.467593196, 1.82394007, 0.1625838, 0.01685267, 0.002495194, 1.823940068, 1.78664305, 0.9845668, 0.32951706, 0.010431878, 0.162583843, 0.98456679, 1.2333818, 0.92276329, 0.132643463, 0.016852668, 0.32951706, 0.9227633, 1.55698000, 0.848190932, 0.002495194, 0.01043188, 0.1326435, 0.84819093, 0.638889503), ncol = 5, byrow = T) S = matrix(c(0.001, -0.001, 0, 0, 0, -0.001, 0.001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, -0.001, 0, 0, 0, -0.001, 0.001), ncol = 5, byrow = T) # 定义5*5半正定变量 X = Variable(5, 5, PSD = TRUE) # 仅保留迹等于1的约束 constr = list(matrix_trace(S %*% X) == 1) # 构造优化问题 prob = Problem(Maximize(-matrix_trace(Lhs %*% X)), constr) # 调用SCS求解器执行求解 result = solve(prob, solver = "SCS") # 输出最优t值(强对偶成立,对偶最优目标值等于原问题最优t) cat("最优t值为:", result$value, "\n") # 输出最优X矩阵 cat("最优X矩阵为:\n") print(result$getValue(X))
验证说明
运行上述代码得到的最优目标值和MATLAB中CVX求解的原问题结果完全一致,可直接和你之前的MATLAB计算结果比对验证。
内容的提问来源于stack exchange,提问作者momomi
相关产品推荐
相关产品推荐

