如何仅使用 Scilab 的二次求解器 qpsolve 的下限和上限?
How to only use the lower bounds and upper bounds for quadratic solver qpsolve from Scilab?
我有一个简单的问题。如果我只想使用下限和上限,如何使用 Scilab 中的命令 qpsolve?
ci <= x <= cs
命令可以这样使用:
[x [,iact [,iter [,f]]]] = qpsolve(Q,p,C,b,ci,cs,me)
但我想这样使用它:
x = qpsolve(Q,p,[],[],ci,cs,[])
只有 ci 和 cs 应该解释矢量 x 的限制。不幸的是,该命令不能带空[]。我应该将 [] 作为一个或零的行向量吗?
在 Scilab 5.5.1 中,[]
适用于 C 和 b 但不适用于 me
。所以 C = [];b = [];me = 0;
应该可以。
为什么
qpsolve 是 qp_solve 的接口:
function [x, iact, iter, f]=qpsolve(Q,p,C,b,ci,cs,me)
rhs = argn(2);
if rhs <> 7
error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "qpsolve", 7));
end
C(me+1:$, :) = -C(me+1:$, :);
b(me+1:$) = -b(me+1:$);
// replace boundary contraints by linear constraints
Cb = []; bb = [];
if ci <> [] then
Cb = [Cb; speye(Q)]
bb = [bb; ci]
end
if cs <> [] then
Cb = [Cb; -speye(Q)]
bb = [bb; -cs]
end
C = [C; Cb]; b = [b; bb]
[x, iact, iter, f] = qp_solve(Q, -p, C', b, me)
endfunction
它将每个边界约束转换为线性约束。首先,它交换不等式约束的符号。为此,它必须知道 me
,即它必须是一个整数。由于 C
和 b
是空矩阵,因此值无关紧要。
奖金:
如果Q
是可逆的,你可以跳过qpsolve
宏,写
x = -Q\p
x(x<ci) = ci(x<ci)
x(x>cs) = cs(x>cs)
我有一个简单的问题。如果我只想使用下限和上限,如何使用 Scilab 中的命令 qpsolve?
ci <= x <= cs
命令可以这样使用:
[x [,iact [,iter [,f]]]] = qpsolve(Q,p,C,b,ci,cs,me)
但我想这样使用它:
x = qpsolve(Q,p,[],[],ci,cs,[])
只有 ci 和 cs 应该解释矢量 x 的限制。不幸的是,该命令不能带空[]。我应该将 [] 作为一个或零的行向量吗?
在 Scilab 5.5.1 中,[]
适用于 C 和 b 但不适用于 me
。所以 C = [];b = [];me = 0;
应该可以。
为什么
qpsolve 是 qp_solve 的接口:
function [x, iact, iter, f]=qpsolve(Q,p,C,b,ci,cs,me)
rhs = argn(2);
if rhs <> 7
error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "qpsolve", 7));
end
C(me+1:$, :) = -C(me+1:$, :);
b(me+1:$) = -b(me+1:$);
// replace boundary contraints by linear constraints
Cb = []; bb = [];
if ci <> [] then
Cb = [Cb; speye(Q)]
bb = [bb; ci]
end
if cs <> [] then
Cb = [Cb; -speye(Q)]
bb = [bb; -cs]
end
C = [C; Cb]; b = [b; bb]
[x, iact, iter, f] = qp_solve(Q, -p, C', b, me)
endfunction
它将每个边界约束转换为线性约束。首先,它交换不等式约束的符号。为此,它必须知道 me
,即它必须是一个整数。由于 C
和 b
是空矩阵,因此值无关紧要。
奖金:
如果Q
是可逆的,你可以跳过qpsolve
宏,写
x = -Q\p
x(x<ci) = ci(x<ci)
x(x>cs) = cs(x>cs)