为多项式函数找到 x 的最大值
Find maximum value for x for a polynomial function
我正在使用一个简单的多项式来拟合曲线。
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
您可以使用 optim。我认为此线程中回答的其他解决方案更具吸引力,但为了完整起见,我将把它写下来:
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
如果重新排列函数,使要最大化的变量排在第一位,然后像这样设置默认值:
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
是高度。
如果 a
为负,抛物线 a * x^2 + b * x + c
的最大值在 -b/(2*a)
处达到:
a<0
#[1] TRUE
-b/(2*a)
#[1] 31154.1
我正在使用一个简单的多项式来拟合曲线。
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
您可以使用 optim。我认为此线程中回答的其他解决方案更具吸引力,但为了完整起见,我将把它写下来:
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
如果重新排列函数,使要最大化的变量排在第一位,然后像这样设置默认值:
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
是高度。
如果 a
为负,抛物线 a * x^2 + b * x + c
的最大值在 -b/(2*a)
处达到:
a<0
#[1] TRUE
-b/(2*a)
#[1] 31154.1