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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:52:09