调用cvxopt的solve_qp函数报数组维度匹配ValueError如何解决
问题原因
该报错是quadprog求解器内部拼接约束向量时维度不匹配导致的,根源是传入的向量维度格式不符合求解器要求,同时存在冗余无效约束。
解决方案
按以下步骤修改代码即可:
1. 统一所有向量为一维numpy数组
求解器要求目标函数项q、等式约束项b、上下界lb/ub均为一维数组,原定义的都是二维列向量,需要做展平处理:
# 目标函数C展平为一维 C = np.asarray(np.bmat([[b*np.ones(24),b*np.ones(24),0*np.ones(24),ppp]])).flatten() # 等式约束beq展平为一维 beq = np.asarray(np.bmat([[M],[np.zeros((24,1))]])).flatten() # 上下界展平为一维 lb = np.asarray(np.bmat([[0*np.ones(24),0*np.ones(24),[0.1],0.1*np.ones(22), [0.1],100*np.ones(24)]])).flatten() ub = np.asarray(np.bmat([[max_pch*np.ones(24),max_pdch*np.ones(24),[0.1],0.9*np.ones(22), [0.9],500*np.ones(24)]])).flatten()
2. 删除冗余等式约束
原Aeq中最后48行全为0,对应beq最后48行全为0,属于0x=0的无效约束,直接删除避免求解器处理异常:
Aeq = np.asarray(np.bmat([[-I,I,Z,I], [-gamma1*I, gamma2*I,MM,Z]]))
3. 修正solve_qp调用参数
不需要将numpy数组转换为cvxopt的matrix类型,直接传入原生numpy数组即可:
x = solve_qp(P=Q, q=C, G=None, h=None, A=Aeq, b=beq, lb=lb, ub=ub, solver='quadprog')
4. 维度校验(可选)
修改完成后可以先打印各参数维度确认匹配:
- Q.shape == (96, 96)
- C.shape == (96,)
- Aeq.shape == (48, 96)
- beq.shape == (48,)
- lb.shape == ub.shape == (96,)
内容的提问来源于stack exchange,提问作者sajad parvizi
相关产品推荐
相关产品推荐

