When we solve a SOCP, in addition to a solution \(x^\star\), we obtain a dual solution \(\lambda_i^\star\) corresponding to each second-order cone constraint. A non-zero \(\lambda_i^\star\) indicates that the constraint \(\|A_ix + b_i\|_2 \leq c_i^Tx + d_i\) holds with equality for \(x^\star\) and suggests that changing \(d_i\) would change the optimal value.
Example
In the following code, we solve a SOCP with CVXR. The second-order cone constraint \(\|Ax + b\|_2 \leq t\) is expressed as norm2(A %*% x + b) <= t in CVXR.
## Problem dimensionsset.seed(2)m <-3# number of SOC constraintsn <-10# number of variablesp <-5# number of equality constraintsn_i <-5# rows per SOC constraint## A feasible point used to construct the problem datax0 <-rnorm(n)f <-rnorm(n)## Generate random data for each SOC constraintsoc_data <-lapply(1:m, function(i) { Ai <-matrix(rnorm(n_i * n), nrow = n_i) bi <-rnorm(n_i) ci <-rnorm(n)## Choose d_i so that x0 is feasible: ||A_i x0 + b_i||_2 <= c_i'x0 + d_i di <-norm(Ai %*% x0 + bi, type ="2") -sum(ci * x0)list(A = Ai, b = bi, c = ci, d = di)})## Equality constraint: F x = g with g = F x0 so x0 is feasibleF_mat <-matrix(rnorm(p * n), nrow = p)g <- F_mat %*% x0## Define and solve the CVXR problemx <-Variable(n)soc_constraints <-lapply(soc_data, function(s) {norm2(s$A %*% x + s$b) <=sum(s$c * x) + s$d})
Warning: `norm2()` is deprecated. Use `p_norm(x, 2)` instead.
This warning is displayed once per session.
## Print resultcat(sprintf("The optimal value is %f\n", result))cat("A solution x is\n")print(value(x))for (i in1:m) {cat(sprintf("SOC constraint %d dual variable solution\n", i))print(dual_value(soc_constraints[[i]]))}
The optimal value is -120.464973
A solution x is
[,1]
[1,] -31.037523
[2,] 28.606756
[3,] -22.197659
[4,] 2.210524
[5,] -30.300881
[6,] 2.724953
[7,] 10.617886
[8,] 82.395792
[9,] -87.680423
[10,] -11.980917
SOC constraint 1 dual variable solution
[1] 2.90497
SOC constraint 2 dual variable solution
[1] 11.61755
SOC constraint 3 dual variable solution
[1] 2.153939e-09
Session Info
R version 4.5.3 (2026-03-11)
Platform: aarch64-apple-darwin20
Running under: macOS Tahoe 26.3.1
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
time zone: America/Los_Angeles
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] CVXR_1.8.1
loaded via a namespace (and not attached):
[1] slam_0.1-55 cli_3.6.5 knitr_1.51 ECOSolveR_0.6.1
[5] rlang_1.1.7 xfun_0.56 clarabel_0.11.2 otel_0.2.0
[9] gurobi_13.0-1 Rglpk_0.6-5.1 highs_1.12.0-3 cccp_0.3-3
[13] scs_3.2.7 S7_0.2.1 jsonlite_2.0.0 backports_1.5.0
[17] rprojroot_2.1.1 htmltools_0.5.9 Rmosek_11.1.1 gmp_0.7-5.1
[21] piqp_0.6.2 rmarkdown_2.30 grid_4.5.3 evaluate_1.0.5
[25] fastmap_1.2.0 yaml_2.3.12 compiler_4.5.3 codetools_0.2-20
[29] htmlwidgets_1.6.4 Rcpp_1.1.1 here_1.0.2 osqp_1.0.0
[33] lattice_0.22-9 digest_0.6.39 checkmate_2.3.4 Matrix_1.7-4
[37] tools_4.5.3