我熟悉R中的优化函数。我尝试了三种不同的方法:
library(optimx)
library(optimr)
f = function(par){20*par[1] - 3*par[1]^2 + par[1] * par[2]}
# First try wiht optim()
result1 = optim(par = c(0,0), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B", control = list(fnscale = -1))
coef(result1) # Null
# Second try with optimr
result2 = optimr(par = c(0,0), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B", control = list(maximize = TRUE))
coef(result2) # Null
# Third try with optimx
result3 = optimx(par = c(0,0), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B", control = list(maximize = TRUE))
coef(result3)
p1 : 3.666667
p2 : 2
为什么optim()和optimr()在optimx()成功的地方失败?
您的建议将不胜感激。
答案 0 :(得分:0)
首先,你的f
采用两个参数而不是长度为2的向量(你需要后者)。第二,它不是coef
给出结果的东西;我怀疑你想要result$par
。因此,
library(optimr)
f <- function(x) -(20 * x[1] - 3 * x[1]^2 + x[2] / 2)
result <- optimr(par = c(1, 1), fn = f, upper = c(5, 2), lower = c(0, 0),
method = "L-BFGS-B")
result$par
# [1] 3.333333 2.000000
我向f
添加减号以最小化函数,optimr
无法以某种方式无法最大化它。
答案 1 :(得分:0)
这是一个具有基本optim
功能的解决方案,可实现最大化。您遇到的问题是它应该是一个包含您想要解决的所有参数的向量2,而不是独立的参数。我尝试使用optimr
,但出于某种原因,它最大化了。
f = function(x){-1*(20*x[1] - 3*x[1]^2 + x[2]/2)}
result = optim(par = c(1,1), fn = f, upper = c(5, 2), lower = c(0, 0), method = "L-BFGS-B")
答案 2 :(得分:0)
不需要{optimr}包,基本R就可以了:
optim(
c(1, 1),
function (x) -f(x[1], x[2]),
method = 'L-BFGS-B'
)
$par
[1] 3.325034e+00 1.682724e+13
$value
[1] -8.413622e+12
$counts
function gradient
40 40
$convergence
[1] 0
$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
请注意,我们需要调整函数的参数arity(optim
使用单个参数向量),并且,由于我们想要最大化,我们反转目标函数的符号。因此,我们将function (x) -f(x[1], x[2])
作为fn
传递,而不仅仅是f
。