0

我有一个简单的问题。如果我只想使用下限和上限限制,如何使用 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 的限制。不幸的是,该命令不能为空 []。我应该将 [] 作为一或零的行向量吗?

https://help.scilab.org/docs/6.0.1/en_US/qpsolve.html

4

1 回答 1

1

在 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,即它必须是整数。因为Cb是空矩阵,所以值无关紧要。

奖金:

如果Q是可逆的,你可以跳过qpsolve宏并写

x = -Q\p
x(x<ci) = ci(x<ci)
x(x>cs) = cs(x>cs)
于 2018-07-16T14:26:11.647 回答