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 за указание на это в комментариях.)
optim(c(5, 20), fn = f, control = list(fnscale = -1))
Однако для функции, указанной в вопросе, вывод optim
показывает, что алгоритм не сходится ($convergence != 0
) (Спасибо @alistaire за указание на это в комментариях.):
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
В данном случае $convergence
из 1
означает, что максимальное количество итераций было достигнуто. Можно решить эту проблему, увеличив максимальное число итераций, например, установив control = list(..., maxit = 500))
. Однако это не решит проблему, так как optim
все еще не сходится.