7

我想使用 kernlab 的 ipop 函数求解以下二次规划方程:

min 0.5*x'*H*x + f'*x  
subject to:  A*x <= b   
Aeq*x = beq  
LB <= x <= UB 

在我们的示例 H 3x3 矩阵中,f 是 3x1,A 是 2x3,b 是 2x1,LB 和 UB 都是 3x1。

编辑 1 我的 R 代码是:

library(kernlab)
H <- rbind(c(1,0,0),c(0,1,0),c(0,0,1))
f = rbind(0,0,0)
A = rbind(c(1,1,1), c(-1,-1,-1))
b = rbind(4.26, -1.73)
LB = rbind(0,0,0)
UB = rbind(100,100,100)
> ipop(f,H,A,b,LB,UB,0)
Error in crossprod(r, q) : non-conformable arguments

我从matlab知道是这样的:

H = eye(3);
f = [0,0,0];
nsamples=3;
eps = (sqrt(nsamples)-1)/sqrt(nsamples);
A=ones(1,nsamples);
A(2,:)=-ones(1,nsamples);
b=[nsamples*(eps+1); nsamples*(eps-1)];

Aeq = [];
beq = [];
LB = zeros(nsamples,1);
UB = ones(nsamples,1).*1000;

[beta,FVAL,EXITFLAG] = quadprog(H,f,A,b,Aeq,beq,LB,UB);

答案是 3x1 的向量等于 [0.57,0.57,0.57];

但是,当我在 R 上尝试使用 kernlab 库 ipop(f,H,A,b,LB,UB,0)) 中的 ipop 函数时,我在 crossprod(r, q) 中遇到错误:不符合要求的参数

我感谢任何评论

4

1 回答 1

3

原始问题询问错误消息Error in crossprod(r, q) : non-conformable arguments。答案是r必须指定与 相同的尺寸b。所以如果b是 2x1 那么r也必须是 2x1。

第二个问题(来自评论)询问为什么原始问题中提出的系统在 Matlab 中有效,但在 R 中无效。答案是 R 和 Matlab 以不同的方式指定问题。Matlab 允许不等式约束与等式约束分开输入。然而,在 R 中,约束必须全部采用这种形式b<=Ax<=b+r(至少在kernlab函数内ipop)。那么我们如何模仿原始的不等式约束呢?简单的方法是制作b非常负数并制作r'=-b+rr'你的新r向量在哪里。现在我们仍然有相同的约束上限,因为r'+b=-b+r+b=r. 但是,我们也对约束设置了下限。我的建议是尝试用几个不同的值来解决系统b看看解决方案是否一致。

编辑:

这可能是处理解决程序的更好方法:

library(quadprog);  
dvec <- -f;  
Dmat <- H;  
Amat <- -t(A);  
bvec <- -rbind(4.26,-1.73);  
solve.QP(Dmat, dvec, Amat, bvec)

其中这些定义取决于先前定义的 R 代码。

于 2012-09-10T14:38:39.980 回答