想请教关于CVX工具包的一些问题

最近帮师姐用CVX工具包解决一个凸优化的问题,用其他方法(例如:fmincon函数)也可以。

主要目的是在时间性能上做一下对比,也就是解决问题所需要的时间。

但是遇到了一些问题,未解决。

0、问题说明

目标函数:obj = @(vt)(-38983608671.2131+66282000*vt(1)^2)*(1.063*vt(1)+0.153*vt(2)-0.244)^1.5 + 1.2000e+14*(vt(1)*5.38*10^-7*exp(1.83*vt(1)+4.19*vt(2))-4.8*10^-10*vt(2));

两个优化变量:vt(1), vt(2)
vt(1)取值范围:[0.6, 1.8]
vt(2)取值范围:[-1, 0]
优化目标:最小化 obj

1、用fmincon函数解决
很简单一段程序,直接贴代码:
```

clc,clear;

nonlcon = [];
options = optimoptions('fmincon','Display','off');

obj = @(vt)(-38983608671.2131+66282000*vt(1)^2)*(1.063*vt(1)+0.153*vt(2)-0.244)^1.5 + 1.2000e+14*(vt(1)*5.38*10^-7*exp(1.83*vt(1)+4.19*vt(2))-4.8*10^-10*vt(2));

tic
for iter=1:100
	[x,~] = fmincon(obj,[1.2,-0.5],[],[],[],[],[0.6,-1],[1.8,0],nonlcon,options);
end
toc
```

跑完大概 2.5s 左右。

2 、用cvx工具包解决
安装教程及使用简介都可以搜索到,借鉴的博客就不一一列举了。

下面是暂未调试好的代码:

%{
    程序在cvx_begin  cvx_end 之间
    variables 变量
    minimize 目标函数(调用中最小化的目标函数必须是凸的,最大化的目标函数必须是凹的)
    subject to  约束条件
%}

clear;clc;

cvx_begin                %创建一个新的凸优化问题的命令,在它之后就可以写出待求解的凸优化问题;
    variables vt1 vt2    
    %minimize ((-38983608671.2131+66282000*vt1^2))        %ok    
    %minimize (((1.063*vt1+0.153*vt2-0.244)^1.5))         %ok    
    %minimize ((5.38*10^-7*exp(1.83*vt1+4.19*vt2)))       %ok    
    %minimize ((-4.8*10^-10*vt2))                         %ok    
    
    minimize ((-38983608671.2131+66282000*vt1^2) * ((1.063*vt1+0.153*vt2-0.244)^1.5))      %error
    %minimize (vt1*vt2)  %error    类似这种,两个变量相乘的时候出问题
    
    %minimize((-38983608671.2131+66282000*vt1^2)*((1.063*vt1+0.153*vt2-0.244)^1.5) + 1.2000e+14*(vt1*5.38*10^-7*exp(1.83*vt1+4.19*vt2)-4.8*10^-10*vt2))
    subject to          
        0.6 <= vt1 <= 1.8
        -1 <= vt2 <= 0
cvx_end                 %问题结束

一步步调试,发现当两个变量相乘时例如:vt1*vt2的时候会出bug,此时用gp模式可以解决;

cvx_begin gp

gp模式是几何编程模式,具体没仔细看,可以参考这篇博客CVX介绍——几何编程模式

随之而来又出现一个新的问题例如:(vt1-vt2)*vt2,用gp模式无法解决(好像不支持减法)

苦恼ing…

==

有天和师姐商量了一下,是因为CVX不接受我们的模型,毕竟CVX解决的问题是有限的。

受益良多的一句话:读博也很好毕业的,就像期末考试一样,60分也是,90分也可以。想读博要早做打算,避免走太多弯路。

结于2019-06-06。

你可能感兴趣的:(大四暑假)