Пакет R BB - нет возможности передать параметры целевой функции?

Я очень хочу использовать пакет R BB для решения системы нелинейных уравнений, но синтаксис, похоже, не позволяет передавать параметры в систему уравнений. Очень странно, так как это серьезно ограничит то, что в остальном кажется очень привлекательной и мощной альтернативой nleqslv().

Чтобы было ясно: «Обычно» вы ожидаете, что решатель будет иметь пространство для передачи параметров базовой целевой функции. Например. в нлекслв:

out <- nleqslv(in_x, obj_fn, jac = NULL, other_pars1, other_pars2, method = "Broyden")

Где «in_x» — это вектор начальных догадок решения, а «other_pars1, other_pars2» — дополнительные фиксированные параметры (могут быть скалярами, векторами, матрицами и т. д.), требуемые «obj_fn».

С другой стороны, в BBsolve у вас есть

out <- BBsolve(in_x, obj_fn)

Не хватает места для размещения всех «other_pars1, other_pars2», необходимых для obj_fn.


person ben    schedule 01.12.2017    source источник
comment
Когда я читаю документацию BBsolve, я вижу, что BBsolve определенно принимает дополнительные аргументы через конструкцию .... Так что я не совсем понимаю, что вы имеете в виду и что именно вы делаете.   -  person Bhas    schedule 01.12.2017


Ответы (2)


Создайте функцию, которая «прикрепляет» дополнительные параметры к вашей целевой функции. Ключевой концепцией здесь является то, что возвращаемое значение само по себе является функцией:

gen_obj_fn <- function( obj_fn, other_pars1, other_pars2 )
{
  function(x) { obj_fn( x, other_pars1, other_pars2 ) }
}

Вывод gen_obj_fn теперь может быть передан непосредственно в BBsolve:

## Previous call using nleqslv():
out <- nleqslv( in_x, myFun, jac = NULL, myParam1, myParam2, ... )

## Equivalent call using BBsolve():
myObjF <- gen_obj_fn( myFun, myParam1, myParam2 )
is.function( myObjF )  ## TRUE
out <- BBsolve( in_x, myObjF )
person Artem Sokolov    schedule 01.12.2017
comment
Спасибо! Дополнительный вопрос: BBsolve не останавливается, когда находит решение. Иными словами, для 4 уравнений он находит решение, которое дает c(0,001, 0,002, -0,001, 0,001) — достаточно близкое для меня к корням! отказ. Тол поменял на 1е-02, но это, видимо, не помогает. - person ben; 01.12.2017

Вы не показали, как вы используете BBsolve. Как я уже сказал в своем комментарии, BBsolve определенно принимает дополнительные аргументы функции. Но вы должны назвать эти аргументы.

Посмотрите этот пример, чтобы узнать, как сделать то, что вы хотите:

library(nleqslv)

f <- function(x,p1=3,p2=2) {
  y <- numeric(2)
  y[1] <- 10*x[1]+3*x[2]^2 - p1
  y[2] <- x[1]^2 -exp(x[2]) -p2
  y
}

xstart <- c(1,1)
nleqslv(xstart, f)

library(BB)
BBsolve(xstart,f)

Попробуйте немного разные значения для p1 и p2:

nleqslv(xstart,f,p1=2.7,p2=2.1)
BBsolve(xstart,f,p1=2.7,p2=2.1)

Обе функции находят одно и то же решение.

person Bhas    schedule 01.12.2017
comment
Да, но для этого требуется встроенная функция. Моя функция слишком большая и грязная для этого. - person ben; 02.12.2017
comment
Я не понимаю что ты имеешь в виду. Если вы можете сделать это так, как показано с nleqslv, то вы можете сделать это так же и с BBsolve. - person Bhas; 02.12.2017