Нелинейная оптимизация, как исправить «NLOPT_FAILURE: Общий код ошибки». - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь минимизировать вектор входных данных для нелинейной функции, используя функцию 'mlsl' из 'nloptr'.Я продолжаю получать сообщение об ошибке «NLOPT_FAILURE: универсальный код ошибки».

Я пытался настроить мои начальные условия, мои нижние и верхние границы, xtol_rel, ftol_rel и ftol_abs.Я также попытался предоставить градиенты.Сообщение об ошибке всегда одно и то же.

# Objective function
Gneg <- function(u) {
    with (as.list(params1), {
        u1r <- u[1]; u1l <- u[2]; u1s <- u[3]
        u2r <- u[4]; u2l <- u[5]; u2s <- u[6]

        -1*(((((Wn*a1r*u1r)/((Wn*a1r*u1r)+(Wn*a2r*u2r)))*(N*(1-exp(-((Wn*a1r*u1r)+(Wn*a2r*u2r))))) - (c1rn*u1r + c1ln*u1l + c1sn*u1s))^alpha1)*((((((a1l*u1l)^zl1)*(u1s^zs1))/(((a1l*u1l)^zl1)*(u1s^zs1) + ((a2l*u2l)^zl2)*(u2s^zs2)))*(Wc*C*(1-exp(-((a1l*u1l)+(a2l*u2l))))) - (c1rc*u1r + c1lc*u1l + c1sc*u1s))^beta1))
})}

# initial conditions
x0 <- rep(1, 6)

# lower and upper bounds. Vector u should have only positive elements (because they represent biomass of plant tissues)
lb <- rep(0, 6)
ub <- rep(10000, 6)

# Fixed parameters for function Gneg
params1 <- c(N = 535, Wn = 0.8, Wc = 0.8, a1r=1, a1l=1, a2r=1, a2l=1, c1rn=0.03, c2rn=0.03, c1ln=0.25, c2ln=0.25, c1sn=0.03, c2sn=0.03, c1rc=1.1, c2rc=1.1, c1lc=1.3, c2lc=1.3, c1sc=1.1, c2sc=1.1, C=1000, alpha1=0.99, beta1=0.01, alpha2=0.99, beta2=0.01, zl1 = 1.1, zl2 = 1.1, zs1=1.5, zs2=1.5)

# MLSL/nloptr 
solution = mlsl(x0 = x0, fn = Gneg, lower = lb, upper = ub, local.method = "LBFGS", low.discrepancy = TRUE, control = list(xtol_rel = 1e-8, maxeval = 10000))
print(solution)`

Я ожидаю получить вектор минимальных значений для вас, но вывод, который я получал, был тем, что я вставил для своих начальных условий.Вот вывод:

$par
[1] 1 1 1 1 1 1

$value
[1] -214.195

$iter
[1] 6

$convergence
[1] -1

$message
[1] "NLOPT_FAILURE: Generic failure code."
...