Аргумент ...
для slsqp
позволяет передавать произвольные аргументы в целевую функцию. Итак, определите новую целевую функцию, которая принимает indices
в качестве аргумента:
eval_f2 <- function(x,indices){
return(sum(x[indices]^2))
}
... и включают indices=c(4,7,9)
(чтобы соответствовать определению вашей предыдущей целевой функции):
res2 <- slsqp(x0=x0,fn=eval_f2, hin = hin,heq = heq, indices=c(4,7,9))
Проверьте решение:
all.equal(res$par,res2$par) ## TRUE
заводы
В более общем смысле вы можете определить factory - функцию, которая возвращает функцию. Это работает, потому что функции связаны с средами , в которых могут храниться переменные (например, индексы). Это будет работать даже в тех случаях, когда функция верхнего уровня не позволяет передавать произвольные аргументы (и, например, может быть важна, если вы хотите использовать различные наборы индексов для ваших целевых и ограничивающих функций. ..)
eval_factory <- function(indices) {
fun <- function(x) {
return(sum(x[indices]^2))
}
return(fun)
}
res3 <- slsqp(x0=x0, fn=eval_factory(indices=c(4,7,9)),
hin = hin,heq = heq)
all.equal(res$par,res3$par) ## TRUE
фабрика для хин
hin_factory <- function(A,b) {
fun <- function(x) {
return((A %*% x) + b)
}
return(fun)
}
A0 <- matrix(c(1, -1, 0, 1,-1, 0, 0, 0, 0,
1, 0, -1, 1, 0, -1, 0, 0, 0,
0, 1, -1, 0, 1, -1, 0, 0, 0,
-1, 1, 0, 0, 0, 0,-1, 1, 0,
0, 1, -1, 0, 0, 0, 0, 1, -1,
1, 0, -1, 0, 0, 0, 1, 0, -1),
byrow=TRUE,ncol=9)
all.equal(c(hin_factory(A0,-0.01)(x0)),hin(x0))
res4 <- slsqp(x0=x0, fn=eval_factory(indices=c(4,7,9)),
hin = hin_factory(A0,b=-0.01), heq = heq)
all.equal(res$par, res4$par)