You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:14:53