You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:57:01