如何在CVXPY中遵循DCP规则建模log(e^X/(e^Y+c))目标函数?
解决CVXPY中DCP规则不兼容的问题
核心思路是通过代数变形把目标函数转化为CVXPY能识别的DCP合规形式——直接用乘除组合会让CVXPY无法判定整体的凹性,而利用对数基本性质拆分后就能解决:
原目标函数:
$$\log\left(\frac{eX}{eY + c}\right)$$
利用对数商数法则和指数对数互逆性,等价变形为:
$$\log(e^X) - \log(e^Y + c) = X - \log(e^Y + c)$$
这个变形后的式子完全符合DCP规则:
- $X$(对应代码里的
P_D)是线性函数,属于既凸又凹的函数 - $\log(e^Y + c)$是凸函数(CVXPY内置的
cp.log作用在凸函数c + cp.exp(P_N)上,结果仍为凸函数) - 凹函数(线性函数)减去凸函数,最终得到凹函数,而最大化凹函数是CVXPY允许的DCP问题
修改后的代码如下:
import cvxpy as cp P_D = cp.Variable(10, nonneg=True) P_N = cp.Variable(10, nonneg=True) c = 0.5 p_max = # 填入p_max的具体数值 # 变形后的目标函数 obj = P_D - cp.log(c + cp.exp(P_N)) objective = cp.Maximize(cp.sum(obj)) # 约束:P_D已声明nonneg=True,P_D>=0可省略 constraints = [P_D <= p_max] problem = cp.Problem(objective, constraints) problem.solve(solver=cp.MOSEK)
额外说明
- 原代码里的
cp.multiply(cp.exp(P_D), cp.inv_pos(c + cp.exp(P_N)))虽数学等价,但CVXPY的DCP分析器无法直接识别该组合的凹性:inv_pos是凸函数,cp.exp(P_D)也是凸函数,凸函数相乘的结果无明确凸/凹性,因此会被判定为非DCP合规。 - 变量
P_D和P_N已通过nonneg=True声明非负,约束里的P_D>=0可删除以避免冗余。
内容的提问来源于stack exchange,提问作者Mahdi Hosseini
相关产品推荐
相关产品推荐

