#r #optimization
#r #оптимизация
Вопрос:
У меня есть функция:
f(x1, x2) = (x2-x1)/(c-x1),
where 0<x1,x2<1 and c = 0, 1
Теперь мне нужно оптимизировать функцию таким образом, чтобы f (x1, x2) оставалось в диапазоне [-1, 1]. Я пытаюсь решить эту проблему, используя следующий R-код.
require("stats")
# c=0
f <- function(x) { (x[2] - x[1]) / (0 - x[1]) }
initial_x <- c(0.1, 0.1)
x_optimal <- optim(initial_x, f, method="CG")
x_min <- x_optimal$par
x_min
x_optimal$value
# c=1
f <- function(x) { (x[2] - x[1]) / (1 - x[1]) }
initial_x <- c(0.1, 0.1)
x_optimal <- optim(initial_x, f, method="CG")
x_min <- x_optimal$par
x_min
x_optimal$value
Но это не работает. Кто-нибудь может помочь мне решить это? Заранее спасибо.
Ответ №1:
Вот решение с nloptr
пакетом. Я рассматриваю случай c=1
.
library(nloptr)
# c = 1
# objective function (to minimize)
f <- function(x) (x[2]-x[1]) / (1-x[1])
# constraints
# f(x) < 1 <=> x2-x1 < 1-x1 <=> x2 < 1
# f(x) > -1 <=> x2-x1 > x1 - 1 <=> 2*x1 - x2 - 1 < 0
# => constraint function
g <- function(x) 2*x[1] - x[2] - 1
# run optimization
opt <- nloptr(
x0 = c(0.5, 0.5),
eval_f = f,
lb = c(0, 0),
ub = c(1, 1),
eval_g_ineq = g,
opts = list(algorithm = "NLOPT_LN_COBYLA")
)
Мы получаем:
> # solution
> opt$solution
[1] 0.7569765 0.5139531
> # value of objective function
> opt$objective
[1] -1
Теперь о деле c=0
.
library(nloptr)
# c = 0
# objective function (to minimize)
f <- function(x) (x[1]-x[2]) / x[1]
# constraints
# f(x) < 1 <=> x1-x2 < x1 <=> x2 > 0
# f(x) > -1 <=> x1-x2 > -x1 <=> x2 - 2*x1 < 0
# => constraint function
g <- function(x) x[2] - 2*x[1]
# run optimization
opt <- nloptr(
x0 = c(0.5, 0.5),
eval_f = f,
lb = c(0, 0),
ub = c(1, 1),
eval_g_ineq = g,
opts = list(algorithm = "NLOPT_LN_COBYLA")
)
Мы получаем:
> # solution
> opt$solution
[1] 0.5 1.0
> # value of objective function
> opt$objective
[1] -1
Комментарии:
1. Спасибо. Но когда я пытаюсь получить c = 0, в целевой функции отображается -Inf.