如何在Julia中使用CVXOPT求解器并修复现有代码运行报错
Julia调用CVXOPT求解二次规划的问题修复
现有代码的错误原因
1. UndefVarError: cvxopt not defined相关报错
- 未导入CVXOPT包,缺少
using CVXOPT语句 - 调用语法不符合Julia的CVXOPT封装规范,你使用的是Python原生CVXOPT的调用写法,不适用于Julia的CVXOPT.jl包
npzread的返回值没有赋值给Matrix10变量,后续读取Matrix10["Q"]等操作也会触发未定义变量报错options=["kktreg":1e-9]写法错误,Julia中对应参数需要传入Dict类型,应改为options=Dict("kktreg"=>1e-9)
2. Certificate of dual infeasibility found提示
这个是求解器返回的问题本身的属性,不是调用错误:
- 说明你构造的二次规划问题对偶不可行,对应原问题要么无可行解,要么目标函数无下界
- 需要优先排查问题建模逻辑,而非调用语法
修正后的代码示例
@time begin using Pkg # 首次运行时执行安装,后续可以注释掉避免重复安装 # ENV["PYTHON"]="" # Pkg.add("CVXOPT") # Pkg.add("NPZ") # Pkg.test("CVXOPT") using CVXOPT using SparseArrays using NPZ # 读取npz文件并赋值给Matrix10 Matrix10 = npzread("C:/Users/skqkr/Desktop/Semesterarbeit/Chiwan_Q1.npz") # 将Julia原生矩阵转为CVXOPT支持的格式 Q = CVXOPT.Matrix(2 * Matrix10["Q"]) p = CVXOPT.Matrix(Matrix10["p"]) G = CVXOPT.Matrix(Matrix10["G"]) h = CVXOPT.Matrix(Matrix10["h"]) # 调用Julia CVXOPT的qp接口 sol = CVXOPT.qp(Q, p, G, h, kktsolver="ldl", options=Dict("kktreg"=>1e-9)) print(sol) print(sol["x"]) end
对偶不可行问题排查方向
- 确认Q矩阵是半正定矩阵,凸二次规划要求Q必须半正定才能保证存在最优解
- 检查约束条件
Gx ≤ h是否存在冲突,是否存在满足所有约束的x取值 - 验证目标函数构造逻辑,确认是否存在无下界的情况
内容的提问来源于stack exchange,提问作者Chiwan Park
相关产品推荐
相关产品推荐

