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

如何在CVXPY DPP中使用参数及其倒数且维持DPP合规性?

解决CVXPY中DPP合规性问题的调整方案

问题根源

对参数使用cp.inv_pos()(取倒数)违反了DPP(Disciplined Parametrized Programming)规则:DPP要求参数只能以线性项、合法凸/凹函数的输入形式出现,不能对参数执行倒数这类非线性变换(但对优化变量执行倒数是允许的)。

调整方案

重新推导目标函数,将参数的倒数操作转化为对变量的操作,让参数仅以线性系数形式存在:

原目标表达式cp.maximum(a*b, b*cp.inv_pos(a))可提取公共因子b,改写为b * cp.maximum(a, cp.inv_pos(a))——此时参数b仅作为线性系数参与运算,完全符合DPP规范;而cp.inv_pos(a)是对优化变量a的操作,属于DPP允许的范围。

修改后的代码

import cvxpy as cp

def cp_log_ratio_norm(a, b):
    # 提取参数b作为线性系数,仅对变量a取倒数,满足DPP要求
    return b * cp.maximum(a, cp.inv_pos(a))

var = cp.Variable(pos=True)
param = cp.Parameter(pos=True)
param.value = 5
objective = cp.Minimize(cp_log_ratio_norm(var, param))
problem = cp.Problem(objective, [])
objective_value = problem.solve()

print(f"Objective value = {objective_value}")
print(f"Status = {problem.status}")

验证说明

修改后代码不会触发DPP警告,且求解结果与原代码一致:最小值出现在var=1时,目标值为5*1=5,问题状态为optimal。

内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:10:21