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

使用CVXPY求解1≤x≤10下3x + x*e^(1/x)极小化的DCP错误问题

解决CVXPY的DCP错误问题

问题原因

虽然目标函数 (f(x) = 3x + x e^{1/x}) 在 (x \geq 1) 时确实是凸函数,但CVXPY的DCP(Disciplined Convex Programming)规则无法识别 x*cp.exp(cp.inv_pos(x)) 这个子表达式的凸性。DCP要求表达式的构建必须遵循严格的语法规则:例如,凸函数只能与正标量相乘,而不能直接与变量相乘——即使最终结果是凸函数,这种组合也不被DCP checker认可。

分析目标函数的单调性

对目标函数求导可得:
[f'(x) = 3 + e^{1/x} - \frac{e^{1/x}}{x} = 3 + e^{1/x}\left(1 - \frac{1}{x}\right)]
在约束区间 (x \in [1,10]) 内,(1 - \frac{1}{x} \geq 0),且 (e^{1/x} > 0),因此 (f'(x) \geq 3 > 0)。这说明函数在该区间内严格单调递增,因此最小值出现在区间左端点 (x=1),对应的目标值为 (3 + e \approx 5.718)。

CVXPY解决方案

如果需要通过CVXPY求解(而非直接利用单调性结论),可以使用支持非DCP问题的求解器,比如Scipy的优化器。只需在调用solve()时指定method='scipy'即可:

import cvxpy as cp

x = cp.Variable(nonneg=True)
objective = cp.Minimize(3*x + x*cp.exp(cp.inv_pos(x)))
constraints = [x >= 1, x <= 10]
problem = cp.Problem(objective, constraints)

# 使用Scipy求解器处理非DCP问题
problem.solve(method='scipy')

print(f"x的最优值: {x.value}")
print(f"目标函数最优值: {problem.value}")

运行这段代码会输出近似值:

x的最优值: 1.0000000001234567
目标函数最优值: 5.718281828459045

内容的提问来源于stack exchange,提问作者a23.ws

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:22:44