首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅使用Scilab的二次求解器的下界和上界?

问如何仅使用Scilab的二次求解器的下界和上界?
EN

Stack Overflow用户
提问于 2018-07-12 15:19:57
回答 1查看 82关注 0票数 0

我有个简单的问题。如果我只想使用下限和上限,那么如何使用Scilab中的qpsolve命令呢?

代码语言:javascript
复制
   ci  <= x <= cs

该命令可用于如下所示:

代码语言:javascript
复制
   [x [,iact [,iter [,f]]]] = qpsolve(Q,p,C,b,ci,cs,me)

但我想这样用它:

代码语言:javascript
复制
   x = qpsolve(Q,p,[],[],ci,cs,[])

只有ci和cs应该解释向量x的限制。不幸的是,命令不能取空[]。我应该把[]作为1或0的行向量吗?

US/qpsolve.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-16 14:26:11

在Scilab5.5.1中,[]适用于C和b,但不适用于me。所以C = [];b = [];me = 0;应该能工作。

为什么

qpsolve是qp_solve的一个接口:

代码语言:javascript
复制
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宏并编写

代码语言:javascript
复制
x = -Q\p
x(x<ci) = ci(x<ci)
x(x>cs) = cs(x>cs)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51309315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档