【问题标题】:Find maximum value for x for a polynomial function为多项式函数找到 x 的最大值
【发布时间】:2021-04-27 16:47:50
【问题描述】:

我正在使用一个简单的多项式来拟合曲线。

poly <- function(a, b, c, x) a * x^2 + b * x + c

我想找到导致曲线最大值的 x 值。目前我创建了一个 x 范围从 20000 到 50000 的网格,为每一行运行该函数,然后在结果上使用 max()。它有效,但我有很多组,每次我这样做时都会创建一个大数据框。它非常笨拙,我觉得必须有更好的方法。

一些典型的系数是:

a <- -0.000000179
b <- 0.011153167
c <- 9.896420781

【问题讨论】:

  • 很想知道哪个答案有效
  • @Waldi,你的最适合这个问题,我将来会使用它,但我最终在我的工作中使用了optimize 答案,因为我的实际功能有点复杂比我发布的要多。

标签: r dplyr purrr


【解决方案1】:

如果你重新排列你的函数,让你想最大化的变量是第一个,然后你像这样设置默认值:

poly <- function(x, a, b, c) a * x^2 + b * x + c

formals(poly)$a <- -0.000000179
formals(poly)$b <- 0.011153167
formals(poly)$c <- 9.896420781

然后您可以使用optimize 函数在您的区间内最大化:

optimize(poly, c(20000, 50000), maximum = T)

$`maximum`
[1] 31154.1

$objective
[1] 183.6298

其中$maximum 是出现最大值的x 值,$objective 是高度。

【讨论】:

    【解决方案2】:

    如果a 为负数,则在-b/(2*a) 处达到a * x^2 + b * x + c 的最大抛物线:

    a<0
    #[1] TRUE
    
    -b/(2*a)
    #[1] 31154.1
    

    【讨论】:

    • @Nazer,很高兴收到反馈 ;-) “不要用大锤敲碎坚果”
    【解决方案3】:

    你可以使用优化。我认为这个帖子中回答的其他解决方案更具吸引力,但为了完整起见,我会写下来:

    
    a <- -0.000000179
    b <- 0.011153167
    c <- 9.896420781
    
    o <- optim(
        par=list(x=0),
        fn=function(x){ -poly(a,b,c,x=x) },
        method="Brent",
        lower=-50e3, upper=50e3
    )
    
    

    输出:

    
    > o
    $par
    [1] 31154.1
    
    $value
    [1] -183.6298
    
    $counts
    function gradient 
          NA       NA 
    
    $convergence
    [1] 0
    
    $message
    NULL
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多