【问题标题】:Optimize function in R with constraints使用约束优化 R 中的函数
【发布时间】:2018-06-21 00:43:21
【问题描述】:

我有这个功能

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

我正在尝试使用 optimize() 通过改变 diam 的值来最小化 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() 函数设置约束。

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    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
    

    【讨论】:

    • 您好 Wibeasley,感谢您的回答。它工作得很好。我的下一个问题是如何将您的函数应用于数据帧,例如:structure(list(leng = c(100, 200, 300, 100, 200, 300, 100, 200, 300), flow = c(100) , 100, 100, 150, 150, 150, 200, 200, 200)), out.attrs = list( dim = c(leng = 3L, flow = 3L), dimnames = list(leng = c("leng=100 ", "leng=200", "leng=300"), flow = c("flow=100", "flow=150", "flow=200"))), class= "data.frame", 行。 names = c(NA, -9L )) 我试过 apply() 没有成功
    • 我不明白您将其应用于整个数据集是什么意思。您想一次改变三个预测变量吗?如果是这样,我认为您需要明确定义输入之间的权衡(例如,如果它们具有大致相同的 PSI,您更愿意使用 100'x4" 管道还是 150'x5' 管道)。
    • 只有少数离散点,通过函数手动运行它们可能是最简单的,然后在 2 PSI 以下的那些中做出决定。
    • 在您的回答中,我们有 100 个流量和 400 个长度。我想在由 3 个流值(100、150、200)和 3 个长度值(100,200 和 300)组成的数据集上运行 uniroot 函数。我正在尝试使用 uniroot() 和 apply() 在我的数据集中的 flow 和 leng 的每个组合上运行你的函数。最终,我将在 10 个 flow 值和 10 个 leng 值上运行该函数,因此手动运行它们是不可行的。再次感谢
    • 你必须使用 mapply()purrr 包中的函数来循环 uniroot()。这足以成为它自己的问题。如果您愿意,请标记我。考虑说明您将如何处理这 100 个值(例如,您是否找到最佳的单一选项?如何?)
    猜你喜欢
    • 2011-07-23
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多