Как использовать только нижние и верхние границы для квадратичного решателя qpsolve от Scilab?

У меня простой вопрос. Как мне использовать команду qpsolve из Scilab, если я хочу использовать только нижнюю и верхнюю границы?

   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


person MrYui    schedule 12.07.2018    source источник
comment
Попробуйте C, b как нули (x) и me = 0.   -  person PTRK    schedule 16.07.2018
comment
Вы уверены, что это сработает?   -  person MrYui    schedule 16.07.2018
comment
Нет, я не проверял, но, глядя на документ, это эквивалентно задаче оптимизации со связанными ограничениями.   -  person PTRK    schedule 16.07.2018
comment
@PTRK Хорошо! Я попробую это.   -  person MrYui    schedule 16.07.2018


Ответы (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, т.е. должен быть целым числом. Поскольку C и b — пустые матрицы, их значение не имеет значения.

Бонус:

если Q обратимо, вы можете пропустить макрос qpsolve и написать

x = -Q\p
x(x<ci) = ci(x<ci)
x(x>cs) = cs(x>cs)
person PTRK    schedule 16.07.2018
comment
для меня это работает: x = qp_solve(eye(n,n), v(n,1), zeros(n, 1), [0], 0), где v — вектор размерности n. - person MrYui; 24.07.2018