我认为您需要在该表达式中使用另一个右括号才能最大化。不清楚你是要 fn 还是 fn2:
fn = function(x1,x2){ (b1*(1-exp(-a1*x1))) + (b2*(1-exp(-a2*x2))) }
fn2 = function(x1,x2){ (b1*(1-exp(-a1*x1)) + (b2*(1-exp(-a2*x2)))) }
施加约束的一种方法是在边界处减去较大的值:
optim(par=list(10000, 10000), fn=function(x){
# starting values inside constraint boundaries
( b1*(1-exp(-a1*x[1]))+(b2*(1-exp(-a2*x[2]))) -
200000*( ( x[1]+x[2])> 20000) -
200000*(x[1]>15000) -
200000*(x[2] < 9000) )},
control=list(fnscale=-1) # to make max
)
#---------
$par
[1] 2215.306 17784.694
$value
[1] 89.65546
$counts
function gradient
197 NA
$convergence
[1] 0
$message
NULL
> 2215.306 + 17784.694
[1] 20000
您可以看到,对于fn2,我建议的 R 方法优于 Excel 结果:
> fn2( x1 = 5695 , x2 = 14305)
[1] 86.22543
> fn2(2215.306 , 17784.694)
[1] 89.65546
还可以对敏感性进行图形检查,将值设置在边界之外会抑制绘图中的出现:
vals <- outer(X=seq(5000,20000,by=1000), Y=seq(5000,20000,by=1000), FUN=function(x,y) ( b1*(1-exp(-a1*x))+(b2*(1-exp(-a2*y))) ) )
constr1 <- outer(X=seq(5000,20000,by=1000), Y=seq(5000,20000,by=1000), FUN=function(x,y) ( x+y >20000 ) )
constr2 <- outer(X=seq(5000,20000,by=1000), Y=seq(5000,20000,by=1000), FUN=function(x,y) ( x >15000 ) )
constr3 <- outer(X=seq(5000,20000,by=1000), Y=seq(5000,20000,by=1000), FUN=function(x,y) ( y < 9000 ) )
vals[constr1] <- NA
vals[constr2] <- NA
vals[constr3] <- NA
persp(x=seq(5000,20000,by=1000), y=seq(5000,20000,by=1000),z=vals,ticktype="detailed", las=3,ylab="",theta=-45)