代码之家  ›  专栏  ›  技术社区  ›  euraad

如何只使用Scilab的二次规划求解qpsolve的下限和上限?

  •  0
  • euraad  · 技术社区  · 8 年前

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   PTRK    8 年前

    在Scilab 5.5.1中, [] 适用于C和B,但不适用于 me . 所以 C = [];b = [];me = 0; 应该有效。

    为什么?

    qp solve是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
    

    它将每个约束转换为线性约束。首先,它交换了不等式约束的符号。要做到这一点,它必须知道 ,即必须是整数。自从 C b 是空矩阵,是值无关紧要。

    奖金:

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

    x = -Q\p
    x(x<ci) = ci(x<ci)
    x(x>cs) = cs(x>cs)