最近帮师姐用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。