如何在CVXPY中编写可被识别为拟凸的二次分式规划?
在CVXPY中正确识别拟凸比值函数的方法
直接用除法运算符f / h时,CVXPY无法自动识别该函数的拟凸性,这是因为CVXPY的DQCP规则要求必须使用专门的原子来构造符合条件的拟凸/拟凹函数,而非直接通过运算符组合。
根据DQCP文档里的Ratio原子定义,非负凸函数与正凹函数的比值是拟凸的,完全匹配你的场景(f是凸且非负,h是凹且满足h(x)>0),因此需要用cp.ratio()显式构造该函数,替代直接除法。
修改后的代码
# Import packages import cvxpy as cp import numpy as np # parameters A1 = np.matrix([[2,1],[1,3]]) A2 = np.matrix([[1,1],[1,4]]) # create model x = cp.Variable(2) f = cp.quad_form(x,A1,assume_PSD=True) h = -cp.quad_form(x,A2,assume_PSD=True) + 10 # 使用cp.ratio代替直接除法 quadFrac = cp.ratio(f, h) # check the function type print("f is convex: ",f.is_convex()) print("h is concave: ",h.is_concave()) print("f/h is quasiconvex: ",quadFrac.is_quasiconvex()) print("f/h is ",quadFrac.curvature)
关键说明
cp.ratio(f, h)会严格按照DQCP规则验证输入:第一个参数必须是非负凸函数,第二个参数必须是正凹函数,满足条件后会被正确识别为拟凸函数。- 修改后运行代码,
quadFrac.is_quasiconvex()会返回True,曲率也会被标记为QUASICONVEX,后续可基于该函数构建拟凸优化问题并正常求解。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

