使用 R 进行线性优化



我试图通过 x[1]、x[2] 来最大化函数:

(a - 1) * x[1] * c + (a - 1) * x[2] * b * d

其中 a、b、c、d 是已知的正常数,并且

0 < x[1] < 1, 0 < x[2] < 1, x[1] + x[2] = 1

使用 NlcOptim,我做到了:

solver_1 <- function(a, b, c, d){
obj = function(x){
return((a - 1) * x[1] * c + (a - 1) * x[2] * b * d )
}
con = function(x){
f = NULL
f = rbind(f, x[1] + x[2] - 1)
return(list(ceq = f, c = NULL))
}
x0 = c(1, 0)
solnl(x0, objfun = obj, confun = con)
}
solver_1(1.2, 5.2, 0.8, 0.1) 

但它给了我:

Error in if (norm(H, "I") == 0) { : missing value where TRUE/FALSE needed 

有谁知道我做错了什么?

使用优化包是巨大的矫枉过正。

无论是通过跟进@Roland的评论并进行一些基本的微积分,还是使用线性规划的角点定理,您的目标函数在x[1] = 0x[2] = 1时都会得到优化,反之亦然。因此,您只需在a,b,c,d中计算两个常量表达式,并从中选择较大的一个:

max(c*(a-1), b*d*(a-1)) 

对于除 1 以外的任何a,哪个更大将取决于是否c > a*b

最新更新