R函数solve.QP error“;约束不一致,没有解决方案&引用;

R函数solve.QP error“;约束不一致,没有解决方案&引用;,r,mathematical-optimization,R,Mathematical Optimization,我试图通过使用solve.QP函数(来自quadprog包)和以下参数来运行优化 R = matrix( c( 2.231113e-05,-4.816095e-05,-5.115287e-05, 0,2.989584e-05,4.212173e-06,0,0, 5.504990e-05), ncol=3, byrow=T) b = c(-1,0,rep(0,ncol(R))) C = cbind(rep(1,ncol(R)), diag(ncol(R))) C = cbind(-rep(1,nc

我试图通过使用solve.QP函数(来自quadprog包)和以下参数来运行优化

R = matrix( c( 2.231113e-05,-4.816095e-05,-5.115287e-05, 0,2.989584e-05,4.212173e-06,0,0, 5.504990e-05), ncol=3, byrow=T)
b = c(-1,0,rep(0,ncol(R)))
C = cbind(rep(1,ncol(R)), diag(ncol(R)))
C = cbind(-rep(1,ncol(R)),C)
d = as.matrix(c(57621264,78057622,171342351),ncol=1)
H = solve.QP(Dmat = R, factorized = TRUE, dvec = d, Amat = C, bvec = b)
但我收到的错误是

Error in solve.QP(Dmat = R, factorized = TRUE, dvec = d, Amat = C, bvec = b) : 
constraints are inconsistent, no solution!
但是,当我对R使用不同的矩阵时

R2 = matrix( c( 0.05365071,-0.06364421,-0.04102565, 0, 0.08423283,-0.04048879,0,0,0.09659707), ncol=3, byrow=T)
solve.QP调用

H = solve.QP(Dmat = R2, factorized = TRUE, dvec = d, Amat = C, bvec = b)
不会引起任何问题。 我现在的问题是,为什么在前一种情况下会出现问题


非常感谢您的帮助

可能有两个问题。首先,您没有输入参数meq,该参数告诉解算器有多少约束方程是等式约束,而有多少是不等式约束,因此它默认为meq=0,这使它们都是等式约束,因此您已经过度确定了解决方案。看看你的问题,我想至少最后三个约束是不平等的;解决方案向量的ie分量应全部大于0。其次,第二个等式似乎有点混乱。如果它是一个不等式约束,那么它与后三个约束是多余的。如果是相等约束,则与第一个约束冲突。也许它不应该在那里,或者应该以某种方式改变

------------编辑---------------------------------------------

我对你的第一篇文章的反应有点太快了,现在我明白了你所有的约束都是不平等约束,所以你可以使用默认的meq。在我看来,第二个约束与其余的约束是多余的,但这似乎没有引起任何问题,所以现在它并不重要。您的编辑也帮助我更好地理解了您的问题,我同意您的R矩阵示例应该在给定的约束条件下是可解的。可能是R中矩阵元素的大小可能导致solve.QP的解决方案出现问题,所以我尝试了一个更通用的非线性约束优化器constrOptim。这为R和R2矩阵提供了解决方案,R2解决方案与R2的solve.QP解决方案非常接近

R2 = matrix( c( 0.05365071,-0.06364421,-0.04102565, 0, 0.08423283,-0.04048879,0,0,0.09659707), ncol=3, byrow=T)
R = matrix( c( 2.231113e-05,-4.816095e-05,-5.115287e-05, 0,2.989584e-05,4.212173e-06,0,0, 5.504990e-05), ncol=3, byrow=T)
d = as.matrix(c(57621264,78057622,171342351),ncol=1)
start <- rep(1/(ncol(R)+1), ncol(R))
min_fn <- function(b, dvec, Dmat)  -t(dvec)%*%b +t(b)%*%Dmat%*%b/2
grad_min_fn <- function(b, dvec, Dmat) -dvec + Dmat%*%b
b = c(-1., 0, rep(0,ncol(R)))
C = cbind(rep(1,ncol(R)), diag(ncol(R)))
C = cbind(-rep(1,ncol(R)),C)
D <- t(solve(R))%*%solve(R)
constrOptim(theta=start, f=min_fn, grad=grad_min_fn, ui=t(C), ci=b,     control=list(reltol=10*.Machine$double.eps), 
        dvec=d, Dmat=D )

solve.QP solution for R2
$solution
[1] -1.025463e-10  0.000000e+00  1.000000e+00

constrOptim solution for R2
$par
[1] 2.479855e-15 1.178762e-14 1.000000e+00
constrOptim比solve.QP提供更多关于其解决方案路径的信息,因此可能对数值敏感问题更有帮助。

我不知道constrOptim是否可以替代solve.QP,但至少它可以帮助您调查问题解决方案的属性。

矩阵dvec中的元素非常庞大。矩阵R是
Dmat
的cholesky分解中上三角矩阵的逆矩阵,即Dmat=M^T M,其中M=R^{-1}。因此,以非系数形式:

M <- solve(R) 
Dmat <- t(M)%*%M
因此,您的问题可能是由于某种溢出错误造成的。要解决此问题,您可以缩放
Dmat
(非系数化)和
dvec

#  [,1]       [,2]       [,3]
#[1,] 2008893283 3236243201 1619059085
#[2,] 3236243201 6332319710 2522625866
#[3,] 1619059085 2522625866 1641403882
sc <- norm(Dmat,"2")
solve.QP(Dmat = Dmat/sc, dvec=d/sc, Amat=C, bvec=b, meq=0, factorized=FALSE )
这与
constrOptim
在另一个答案中找到的解决方案非常匹配

缩放
Dmat
dvec
很好,因为对于任何常数sc,
-d^tb+1/2b^tdb
的约束极小值与
sc*(-d^tb+1/2b^tdb)
的约束极小值相同

编辑: 要以分解形式解决此问题,可以尝试以下缩放方式:

nn2 = sqrt(norm(d,"2"))
H = solve.QP(Dmat = R*nn2, dvec = d/(nn2^2), Amat = C, bvec = b, factorized=TRUE)
#$solution
#[1] 0.0000000 0.0000000 0.1043877

非常感谢你的意见。我对这个问题稍加修改。所以,如果你改变R,它会毫无问题地运行。你知道为什么会这样吗?很好的诊断和简洁的解决方案。谢谢有人能帮我吗?非常感谢
# $solution
# [1] -1.220832e-17  0.000000e+00  1.043877e-01
nn2 = sqrt(norm(d,"2"))
H = solve.QP(Dmat = R*nn2, dvec = d/(nn2^2), Amat = C, bvec = b, factorized=TRUE)
#$solution
#[1] 0.0000000 0.0000000 0.1043877