【问题标题】:Find a value that gives the local maximum of a function that takes two input variables找到一个值,该值给出一个函数的局部最大值,该函数采用两个输入变量
【发布时间】:2020-03-09 06:13:06
【问题描述】:

我之前问过一个类似的问题,但我的问题并不清楚。这是另一个尝试。

假设您有以下函数,它接受两个输入,a 和 b。

inputs <- c(a, b)

y <- function(inputs) {
  a <- inputs[1]
  b <- inputs[2]
  output <- a/100 * (20 * b)^0.8 + (100 - a) / 100 * (10 * (100 - b))^0.8
  return(output)
}

对于 [0, 100] 范围内 a 的所有可能值,我想找到使上述函数的输出最大化的 b 的值,但限制 b 也必须是 [0, 100] 范围内的值0, 100]。

换句话说,我想将 b 绘制为 a 的函数,这样对于给定的 a 值,b 最大化上述函数的输出值。

您将如何为此编写代码?

【问题讨论】:

    标签: r optimization maximization


    【解决方案1】:

    首先,我将函数重写为两个参数的函数,按照这个顺序,ba。这是因为 R 基函数 optimize 对其第一个参数进行了优化。来自文档:

    函数optimize在区间从低到高搜索一个 函数f 相对于其第一个函数的最小值或最大值 争论。

    默认是最小化,最大化设置各自的参数为TRUE
    然后,为了在区间[0, 100] 中最大化a 的值,运行a 值序列的优化函数。结果存储在列表中,强制转换为 data.frame 并绘制。

    y <- function(b, a) {
      output <- a/100 * (20 * b)^0.8 + (100 - a) / 100 * (10 * (100 - b))^0.8
      output
    }
    
    a <- seq(0, 100, by = 0.1)
    max_list <- lapply(a, function(.a){
      optimize(y, interval = c(0, 100), .a, maximum = TRUE, tol = .Machine$double.eps^0.5)
    })
    
    max_data <- do.call(rbind.data.frame, max_list)
    row.names(max_data) <- NULL
    head(max_data)
    #       maximum objective
    #1 9.302363e-09  251.1886
    #2 9.302363e-09  250.9375
    #3 9.302363e-09  250.6863
    #4 9.302363e-09  250.4351
    #5 9.302363e-09  250.1839
    #6 9.302363e-09  249.9327
    
    
    plot(objective ~ maxima, max_data)
    

    【讨论】:

    • 感谢您的回答!这很有帮助。你能告诉我“。”是什么吗? lapply函数里面的函数呢? max_list
    • @johnc 它的名字不同,仅此而已。循环在a,所以我更喜欢调用循环变量.a。它可以是任何其他名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多