Получение того же значения, что и начальное значение после оптимизации с помощью nloptr - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь оптимизировать нелинейную функцию с помощью пакета nlopt r. В процессе оптимизации у меня не было ошибок. Но, к сожалению, параметр, который я хотел бы оптимизировать, принимает такое же значение, как и исходное значение. Ниже я привожу код, который я выполнил. Мне нужно оптимизировать только одну переменную - x. Остальные значения переменных мне известны. Было бы очень полезно, если бы кто-нибудь мог сообщить мне, где я ошибаюсь. Любая помощь будет большим подспорьем. Спасибо

#Values
m = c(49097837, 13439992, 10774394)
q = c(34368486,  9407994,  7542076)
p = c(63827188, 17471990, 14006712)
x = c(49097837, 13439992, 10774394) #initializing with value same as m
y = c(4933.40, 2186.75, 1772.09)
z = c(4e-10, 8e-10, 9e-10)
l = c( 0.941, 0.826, 0.750)
n = c(3888896969,  675243453,  419131190)
o = c(822899795, 740956828,  90622037)
r = 73312223


eval_f = function( x, y, z, l, m, n, o,p, q,t) {
  sum((y *  (z ^ (l ^ (((((x/12)/(m/n))/o))*100)))))
}

# constraint functions

# inequalities

eval_g_ineq = function(x, p, q,y, z, l, m, n, o,t) {
  return(rbind(c(x-p),
               c(q-x),
               c(0-y),  
               c(0-z),
               c(0-l),
               c(0-m),
               c(0-n),
               c(0-o),
               c(0-t),
               c(0-q),
               c(sum(x)-t),
               c(0-p)))
}

# Equality constraint

eval_g_eq = function(x, t, p, q,y, z, l, m, n, o) {
  return(sum(x) -t)
}

# initial values

x0 = as.numeric(x)

# lower and upper bounds of control

lb = q
ub = p

local_opts = list( "algorithm" = "NLOPT_GN_ISRES",
                   "xtol_rel" = 1.0e-8 )
opts = list( "algorithm" = "NLOPT_GN_ISRES",
             "xtol_rel" = 1.0e-8,
             "maxeval" = 10,
             "local_opts" = local_opts
)

res = nloptr( x0=x0,
              eval_f=eval_f,
              lb=q,
              ub=p,
              eval_g_ineq = eval_g_ineq,
              eval_g_eq = eval_g_eq,
              opts=opts,
              y=y, z=z, l=l, m=m, n=n,
              o = o, q=q, p=p, t=t
)
...