如何在Julia中创建无穷矩阵并将QP问题下界设为负无穷
解决COSMO中QP问题的无下界约束设置
要实现将QP问题的下界设为负无穷(仅保留A*x < h约束),我们可以针对你代码里的两种约束定义方式分别修改,具体如下:
方法1:使用COSMO.Nonnegatives约束
原来的代码通过构造[-A; A]和[h; -l]将双向约束转换为非负约束。当我们取消下界限制后,只需要保留A*x ≤ h这一单方向约束,对应的转换只需保留-A*x ≥ -h(等价于h - A*x ≥ 0)。修改后的代码如下:
@time begin using COSMO, SparseArrays, LinearAlgebra using NPZ Matrix10 = npzread("C:/Users/skqkr/Desktop/Semesterarbeit/Chiwan_Q1.npz") q = Matrix10["p"]; P = sparse(Matrix10["Q"]); A = sparse(Matrix10["G"]); h = Matrix10["h"]; # 去掉下界约束,仅保留A*x ≤ h Aa = -A # 对应 -A*x ≥ -h → h - A*x ≥ 0 ba = h constraint1 = COSMO.Constraint(Aa, ba, COSMO.Nonnegatives); settings = COSMO.Settings(verbose=true); model = COSMO.Model(); assemble!(model, P, q, constraint1, settings = settings); res = COSMO.optimize!(model); end
方法2:使用COSMO.Box约束
COSMO.Box约束接受上下界参数,我们只需将下界设置为与h长度一致的负无穷数组即可取消下界限制。Julia中可以用fill(-Inf, length(h))生成对应数组:
@time begin using COSMO, SparseArrays, LinearAlgebra using NPZ Matrix10 = npzread("C:/Users/skqkr/Desktop/Semesterarbeit/Chiwan_Q1.npz") q = Matrix10["p"]; P = sparse(Matrix10["Q"]); A = sparse(Matrix10["G"]); h = Matrix10["h"]; # 设置下界为负无穷,仅保留上界h lower_bound = fill(-Inf, length(h)) constraint1 = COSMO.Constraint(A, zeros(size(A, 1)), COSMO.Box(lower_bound, h)); settings = COSMO.Settings(verbose=true); model = COSMO.Model(); assemble!(model, P, q, constraint1, settings = settings); res_box = COSMO.optimize!(model); end
关键说明
- 当使用
COSMO.Nonnegatives时,我们只保留了上界约束对应的非负转换,无需再处理下界部分。 - 当使用
COSMO.Box时,fill(-Inf, length(h))创建了一个和约束数量匹配的负无穷数组,告诉求解器不对变量施加任何下界限制。
内容的提问来源于stack exchange,提问作者Chiwan Park
相关产品推荐
相关产品推荐

