[英]Solving quadratic programming using R
我想使用 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) 中的错误:不一致的参数
我感谢任何评论
原始问题询问错误消息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+r
,其中r'
是您的新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 代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.