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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:32:37