在约束条件下优化R中的功能

时间:2018-06-21 00:43:21

标签: r optimization

我有这个功能

hazwil2 <- function(diam, flow, leng){
  psi2=((1/(2.31*100))*1050*((flow/140)^1.852)*leng*diam^-4.87)
  return(psi2)
}

我正在尝试使用optimize()通过改变直径的值来最小化psi2。 我并不是在寻找绝对最小值,而是在寻找将psi2保持在2以下的最小直径。此外,我应该提到diam是管道的直径,因此只能是离散值2、3、4、5或6。

当我使用时:

optimize(
  f = hazwil2,
  interval = c(0.1,12),
  flow = 100,
  leng = 400
)

我得到的最大可能值为diam(11.9),而很小的值为psi2。我的函数是单调的,因此psi2的最小化将始终导致最大的diam。我想我正在为optimize()函数设置约束。

1 个答案:

答案 0 :(得分:0)

uniroot()查找曲线/函数过零的位置。从PSI中减去2以找到最小允许直径。交叉点为3.564,因此4是将psi保持在2以下的最小整数。

intercept   <- 2L
uniroot(
  function(x) hazwil2(x, 100, 400) - intercept ,
  interval = c(3, 4)
)

curve(expr=hazwil2(x, 100, 400), from=2.5, to=5)
abline(a=intercept, b=0, col="blue")

curve()图影响了3到4之间搜索直径的任意决定。

Result of `uniroot()`:
$`root`
[1] 3.564091

$f.root
[1] -5.618425e-05

$iter
[1] 6

$init.it
[1] NA

$estim.prec
[1] 6.103516e-05

enter image description here