使用CVX优化器求解函数最小值时遇凸规划错误求助
解决CVX中"real affine ./ real affine"的DCP错误
错误原因
CVX基于** disciplined convex programming (DCP)**规则运行,要求所有子表达式必须明确是凸、凹或仿射函数,且操作逻辑符合规则。你遇到的错误Cannot perform the operation: {real affine} ./ {real affine},核心问题是x1/(1+x2)和x2/(1+x1)属于「仿射函数除以仿射函数」,这类表达式既非凸也非凹,直接违反了DCP规则。你尝试用inv_pos重构,但未解决分式本身不符合DCP要求的问题,且未验证整个目标函数的凸性。
问题核心:目标函数的凸性判断
先转换目标函数形式(利用log2(a)=log(a)/log(2)简化):
obj = x1 + x2 + log(2)/log(1 + x1/(1+x2)) + log(2)/log(1 + x2/(1+x1));
假设优化变量满足x1≥0,x2≥0(常见于通信、功率优化场景):
x1+x2是仿射函数(既凸又凹)。- 对于
log(2)/log(1 + x1/(1+x2))这类项,当x1,x2≥0时,1+x1/(1+x2)≥1,log(...)≥0,该项为正。但进一步分析其二阶导数会发现,另一项log(2)/log(1 + x2/(1+x1))的凸性无法保证,整个目标函数大概率是非凸函数。
CVX仅支持凸优化问题,若目标函数非凸,直接使用CVX无法求解。
可行解决方案
方案1:验证凸性并尝试变量替换
若变量有额外约束(如x1,x2≥0),可尝试变量替换尝试转化为DCP兼容形式:
令t1 = 1+x2,t2=1+x1(则t1≥1,t2≥1),代入后目标函数变为:
obj = t1 + t2 - 2 + log(2)/log(1 + (t2-1)/t1 ) + log(2)/log(1 + (t1-1)/t2 );
但(t2-1)/t1 = 1 - 1/t1是凹函数,1+凹函数仍为凹,log(凹函数)的凸性不确定,所以仍不符合DCP规则。
方案2:改用非凸优化工具
若确认目标函数非凸,CVX无法直接处理,建议使用非凸优化工具:
- Matlab自带的
fmincon(需提供初始点) GlobalSearch或MultiStart求解全局最优解- YALMIP库(配合IPOPT等非凸求解器)
方案3:近似凸化(允许近似解时)
若可接受近似结果,可对非凸项进行凸近似:比如在初始点附近线性化非凸项,或用凸函数的下界/上界逼近非凸项,再用CVX求解。
示例代码(用fmincon求解)
假设x1,x2≥0,示例如下:
% 定义目标函数 fun = @(x) x(1) + x(2) + 1/log2(1 + x(1)/(1+x(2))) + 1/log2(1 + x(2)/(1+x(1))); % 设置初始点 x0 = [1;1]; % 变量约束:x1≥0,x2≥0 lb = [0;0]; % 求解配置 options = optimoptions('fmincon','Display','iter'); [x,fval,exitflag,output] = fmincon(fun,x0,[],[],[],[],lb,[],[],options);
内容的提问来源于stack exchange,提问作者Wireless Engineer
相关产品推荐
相关产品推荐

