【问题标题】:Find the local maximum of a function that takes two input variables, each with a different interval求取两个输入变量的函数的局部最大值,每个变量的区间不同
【发布时间】:2020-03-08 23:12:40
【问题描述】:

如果两个输入具有不同的间隔,您如何找到以下函数的局部最大值?

f <- function(x, y) {
  y/50*(100*x)^0.9 + (50-y)/y*(80*(10-x))^0.8
}
# interval for y = (0, 50)
# interval for x = (0, 10)

我研究过使用 optim 函数,但我不知道如何为两个输入变量设置“par”、间隔和其他参数。

【问题讨论】:

  • f(0, 0) 等于 Inf
  • 使用没有无限范围的函数,你可以设置optim的参数,比如method = "L-BFGS-B", lower = c(0, 0), upper = c(10, 50)
  • @G.Grothendieck 非常感谢您的评论!
  • @alistaire 感谢您的评论!设置下限和上限尤其有用。

标签: r optimization minimize


【解决方案1】:

optim 需要一个带有vector 参数(+ 可选参数)的函数,即要使问题中给出的函数与optim 一起工作,必须稍微改变函数或使用某种包装函数,像这样:

# Function of two scalar inputs
f_xy <- function(x, y) {
  y / 50 * (100 * x)^0.9 + (50 - y) / y * (80 * (10 - x))^0.8
}

# Wrapper or helper function with vector argument
f <- function(x) {
  y <- x[2]
  x <- x[1]

  f_xy(x, y)
}

# Default optim with starting value c(x = 5, y = 20)

optim(c(5, 20), fn = f)

注意:默认情况下optim 执行最小化。

最大化:设置control = list(fnscale = -1)(感谢@alistaire 在cmets 中指出这一点。)

optim(c(5, 20), fn = f, control = list(fnscale = -1))

但是,对于问题中给出的函数,optim 输出显示算法尚未收敛 ($convergence != 0)(感谢 @alistaire 在 cmets 中指出这一点。):

optim(c(5, 20), fn = f, control = list(fnscale = -1))
#> $par
#> [1] 1.591824e+00 3.861200e-34
#> 
#> $value
#> [1] 2.368542e+37
#> 
#> $counts
#> function gradient 
#>      501       NA 
#> 
#> $convergence
#> [1] 1
#> 
#> $message
#> NULL

1 中给定$convergence 的情况下,意味着达到了最大迭代次数。可以通过增加最大迭代次数来解决这个问题,例如设置control = list(..., maxit = 500))。但是,这并不能解决问题,因为optim 仍然无法收敛。

【讨论】:

  • 如果您查看?optim,收敛代码为 1 意味着它达到了最大迭代次数,因此可能需要进一步调整。
  • 也来自文档,By default optim performs minimization, but it will maximize if control$fnscale is negative.(尽管您也可以否定结果)。但正如 Gabor 上面指出的那样,这在 0、0 处趋于无穷大,所以优化会变得很奇怪。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2021-09-29
  • 2023-03-17
  • 2020-08-21
  • 1970-01-01
相关资源
最近更新 更多