我有这个功能
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()
函数设置约束。
答案 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