CVX求解线性规划(LP)、二阶锥规划(SOC)、半定规划 (SDP)问题

CVX toolbox

CVX是一个常用的matlab凸优化求解器,但是不能求解非凸优化问题,而且优化问题必须满足CVX的DCP规则,CVX提供了使用手册CVX user guide。

下面分别展示用CVX求解LP,SOCP和SDP问题。

LP

优化问题:
在这里插入图片描述
代码:

%%
clc,clear;
close all
%随机初始化参数
s=rng(1)
m = 20; n = 10; p = 4;
A = randn(m,n); b = randn(m,1);
C = randn(p,n); d = randn(p,1); e = rand;
cvx_begin
    variable x(n) %声明变量
    minimize( norm( A * x - b, 2 ) ) %目标函数
    subject to
        C * x == d %等式约束
        norm( x, Inf ) <= e %不等式约束
cvx_end
输出结果

输出结果:

Calling SDPT3 4.0: 56 variables, 22 equality constraints
   For improved efficiency, SDPT3 is solving the dual problem.
------------------------------------------------------------

 num. of constraints = 22
 dim. of socp   var  = 41,   num. of socp blk  = 11
 dim. of linear var  = 11
 dim. of free   var  =  4 *** convert ublk to lblk
*******************************************************************
   SDPT3: Infeasible path-following algorithms
*******************************************************************
 version  predcorr  gam  expon  scale_data
    NT      1      0.000   1        0    
it pstep dstep pinfeas dinfeas  gap      prim-obj      dual-obj    cputime
-------------------------------------------------------------------
 0|0.000|0.000|1.4e+01|8.5e+00|3.0e+03| 8.795268e+00  0.000000e+00| 0:0:00| chol  1  1 
 1|0.922|0.470|1.1e+00|4.5e+00|7.3e+02| 1.475473e+01 -4.178097e+00| 0:0:00| chol  1  1 
 2|1.000|0.966|2.0e-05|1.6e-01|3.9e+01| 1.554422e+01 -4.431746e+00| 0:0:00| chol  1  1 
 3|0.977|0.870|2.2e-06|2.2e-02|6.2e+00| 8.064512e-01 -4.453998e+00| 0:0:00| chol  1  1 
 4|0.758|0.662|6.1e-07|7.4e-03|2.1e+00|-2.191328e+00 -4.153897e+00| 0:0:00| chol  1  1 
 5|1.000|0.230|3.2e-08|5.7e-03|7.7e-01|-3.442874e+00 -4.106998e+00| 0:0:00| chol  1  1 
 6|1.000|0.502|1.4e-08|2.8e-03|2.6e-01|-3.806851e+00 -4.030127e+00| 0:0:00| chol  1  1 
 7|0.971|0.646|3.2e-09|1.0e-03|6.5e-02|-3.942257e+00 -3.996587e+00| 0:0:00| chol  1  1 
 8|1.000|0.498|1.3e-09|5.0e-04|2.1e-02|-3.972640e+00 -3.988766e+00| 0:0:00| chol  1  1 
 9|0.996|0.927|3.5e-10|3.7e-05|9.7e-04|-3.982939e+00 -3.983604e+00| 0:0:00| chol  1  1 
10|0.954|0.985|2.2e-10|3.3e-06|5.0e-05|-3.983425e+00 -3.983451e+00| 0:0:00| chol  1  1 
11|0.944|0.979|2.4e-10|1.7e-07|3.2e-06|-3.983440e+00 -3.983442e+00| 0:0:00| chol  1  1 
12|0.969|0.977|1.9e-09|1.1e-08|2.1e-07|-3.983442e+00 -3.983442e+00| 0:0:00| chol  1  2 
13|1.000|0.984|6.1e-10|7.5e-10|8.6e-09|-3.983442e+00 -3.983442e+00| 0:0:00|
  stop: max(relative gap, infeasibilities) < 1.49e-08
-------------------------------------------------------------------
 number of iterations   = 13
 primal objective value = -3.98344194e+00
 dual   objective value = -3.98344194e+00
 gap := trace(XZ)       = 8.59e-09
 relative gap           = 9.58e-10
 actual relative gap    = 4.35e-10
 rel. primal infeas (scaled problem)   = 6.15e-10
 rel. dual     "        "       "      = 7.47e-10
 rel. primal infeas (unscaled problem) = 0.00e+00
 rel. dual     "        "       "      = 0.00e+00
 norm(X), norm(y), norm(Z) = 3.0e+00, 4.2e+00, 5.9e+00
 norm(A), norm(b), norm(C) = 1.8e+01, 2.0e+00, 6.5e+00
 Total CPU time (secs)  = 0.16  
 CPU time per iteration = 0.01  
 termination code       =  0
 DIMACS: 6.1e-10  0.0e+00  1.3e-09  0.0e+00  4.4e-10  9.6e-10
-------------------------------------------------------------------
 
------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +3.98344
 

SOCP

在这里插入图片描述
代码:

clc,clear;
close all;
s = rng(1);
y0 = rand(1);
N = 2;%q的维度
d = rand(N,1);
cvx_begin
variable q(N,1)
variable y nonnegative
maximize (log(1+1/y0)-(y-y0)/(y0*(y0+1)))
subject to
    norm([2*(q-d);1-y])<=1+y %SOC约束

cvx_end

输出结果:

Calling SDPT3 4.0: 6 variables, 2 equality constraints
------------------------------------------------------------

 num. of constraints =  2
 dim. of socp   var  =  4,   num. of socp blk  =  1
 dim. of linear var  =  2
*******************************************************************
   SDPT3: Infeasible path-following algorithms
*******************************************************************
 version  predcorr  gam  expon  scale_data
    NT      1      0.000   1        0    
it pstep dstep pinfeas dinfeas  gap      prim-obj      dual-obj    cputime
-------------------------------------------------------------------
 0|0.000|0.000|3.8e+00|4.9e+00|2.0e+02| 1.692250e+01  0.000000e+00| 0:0:00| chol  1  1 
 1|0.697|0.741|1.1e+00|1.3e+00|9.0e+01| 1.371567e+01 -2.019835e+01| 0:0:00| chol  1  1 
 2|1.000|1.000|2.0e-05|6.4e-03|1.3e+01| 5.376201e+00 -7.856240e+00| 0:0:00| chol  1  1 
 3|0.935|0.984|5.5e-06|7.4e-04|4.8e-01| 3.627761e-01 -1.139014e-01| 0:0:00| chol  1  1 
 4|0.706|1.000|1.6e-06|6.6e-05|1.8e-01| 1.698983e-01 -6.243616e-03| 0:0:00| chol  1  1 
 5|0.986|0.986|2.3e-08|7.6e-06|2.5e-03| 2.408733e-03 -7.809152e-05| 0:0:00| chol  1  1 
 6|0.989|0.989|3.0e-10|7.2e-07|2.8e-05| 2.656438e-05  1.278095e-07| 0:0:00| chol  1  1 
 7|0.989|0.989|3.0e-12|8.0e-09|3.0e-07| 2.919599e-07  1.399982e-09| 0:0:00| chol  2  3 
 8|0.989|1.000|3.6e-10|1.0e-12|5.0e-09| 4.457611e-09 -2.774934e-10| 0:0:00|
  stop: max(relative gap, infeasibilities) < 1.49e-08
-------------------------------------------------------------------
 number of iterations   =  8
 primal objective value =  4.45761069e-09
 dual   objective value = -2.77493445e-10
 gap := trace(XZ)       = 4.96e-09
 relative gap           = 4.96e-09
 actual relative gap    = 4.74e-09
 rel. primal infeas (scaled problem)   = 3.59e-10
 rel. dual     "        "       "      = 1.00e-12
 rel. primal infeas (unscaled problem) = 0.00e+00
 rel. dual     "        "       "      = 0.00e+00
 norm(X), norm(y), norm(Z) = 1.4e+00, 2.8e-01, 1.3e+00
 norm(A), norm(b), norm(C) = 3.2e+00, 2.4e+00, 2.7e+00
 Total CPU time (secs)  = 0.18  
 CPU time per iteration = 0.02  
 termination code       =  0
 DIMACS: 4.3e-10  0.0e+00  1.0e-12  0.0e+00  4.7e-09  5.0e-09
-------------------------------------------------------------------
 
------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +1.92888

SDP

clc,clear;
close all;

N = 10;
A = rand(N) +1i*rand(N);
A = (A*A');

cvx_begin
variable X(N,N) semidefinite  hermitian
minimize (real(trace(A*X)))
subject to
    real(trace(X))==1
    
cvx_end

码字不易,欢迎点赞、关注、转发、收藏。后续会持续分享相关内容。

知乎专栏,CVX求解线性规划(LP)、二阶锥规划(SOC)

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
半正定规划是一种重要的数学优化问题。在这个问题中,我们试图找到最优解以满足一些线性约束和一个半正定矩阵上的半正定约束。这种问题的解决方法通常涉及半正定规划模型的建立和求解Matlab是一种强大的数学软件,可以用来解决半正定规划问题。 为了解决半正定规划问题,我们需要定义一个半正定规划模型。这个模型包含一个目标函数和一些约束条件,其中目标函数可以被最小化或最大化。Matlab提供了一个内置函数,称为Semi-Definite Programming (SDP) solver,能用于解决半正定规划问题。这个函数可以自动找到最优解,并返回解决方案的参数和结果。 使用Matlab解决半正定规划问题很简单。我们只需要定义一个目标函数和一些约束条件,然后调用SDP求解器即可。在Matlab中,我们可以使用cvx或yalmip等工具箱来定义和求解半正定规划问题。这些工具箱可以自动将半正定规划问题转化为线性规划问题,并使用内置算法进行求解。 需要注意的是,半正定规划问题通常是NP难问题,因此我们不能保证SDP求解器总能找到全局最优解。在某些情况下,我们可能需要使用其他算法来解决半正定规划问题。但是,对于大多数实际问题SDP求解器已经足够强大了,可以提供较好的解决方案。 总之,半正定规划是一种重要的数学优化问题,可以用于解决各种实际问题Matlab是一个强大的数学软件,提供了一些内置函数和工具箱,可以用于定义和求解半正定规划问题。使用Matlab解决半正定规划问题非常方便,但需要注意问题的复杂性和解决方案的精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值