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

CVXPY中quad_form输出与变量平方相乘触发DCP报错如何解决?

报错原因分析
  • 报错触发的核心原因是你定义的目标函数违反了CVXPY要求的*DCP( disciplined convex programming )规则:两个非仿射的凸表达式cp.power(lmbd, 2)(关于lmbd的凸函数)和cp.quad_form(z, A)(关于z的凸函数,A为半正定矩阵)直接相乘,相乘后的表达式无法被CVXPY判定为凸/凹/仿射,因此无法求解。
  • 额外语法问题:你原代码的目标函数括号配对错误,cp.Minimize()仅包裹了第一项乘积,漏了后面的线性项,需要先修正括号。
解决方案

根据你的使用场景可选两种修正方案:

方案1:lmbd为固定正则参数

如果lmbd不需要参与优化、是提前设定的固定值,直接把lmbd的类型从cp.Variable改为cp.Parameter即可,此时cp.power(lmbd,2)为常数项,和二次型相乘符合DCP规则。
修改后的可运行代码:

import cvxpy as cp
import numpy as np

d = 5 # 自行替换为实际维度
# 参数定义
A = np.random.rand(d, d)  
A = np.dot(A.T, A)
s = np.random.randn(d)

# lmbd设为固定参数,示例取值为2
lmbd = cp.Parameter(pos=True, value=2)
z = cp.Variable(d)

# 修正括号后的DCP合规目标函数
objective = cp.Minimize(cp.power(lmbd,2) * cp.quad_form(z, A) - lmbd * z.T @ s)
constraints = [cp.sum(z) == 1, z >= 0]

prob = cp.Problem(objective, constraints)
prob.solve()
print("最优z:", z.value)

方案2:需要联合优化lmbd和z

如果两个变量都需要参与优化,可通过变量替换等价转换为DCP合规问题:
引入新变量w = lmbd * z,代入原目标可做如下化简:
原目标:min lmbd² * zᵀA z - lmbd zᵀ s
代入z = w/lmbd后可简化为min wᵀA w - wᵀ s,完全符合凸函数定义。
约束同步转换为sum(w) = lmbd、w>=0(通常正则参数为非负,可新增lmbd>=0约束),求解完成后可通过z = w.value / lmbd.value还原原变量。
修改后的可运行代码:

import cvxpy as cp
import numpy as np

d = 5 # 自行替换为实际维度
# 参数定义
A = np.random.rand(d, d)  
A = np.dot(A.T, A)
s = np.random.randn(d)

# 替换后的变量定义
w = cp.Variable(d)
lmbd = cp.Variable(pos=True) # 非负约束符合正则参数的常规使用场景

# DCP合规的目标函数
objective = cp.Minimize(cp.quad_form(w, A) - w.T @ s)

# 转换后的约束
constraints = [
    cp.sum(w) == lmbd,
    w >= 0
]

# 求解
prob = cp.Problem(objective, constraints)
prob.solve()

# 还原原变量z
z = w.value / lmbd.value
print("最优lmbd:", lmbd.value)
print("最优z:", z)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:45:03