[R] Non linear optimization with nloptr package fail to produce true optimal result
John Fox
j|ox @end|ng |rom mcm@@ter@c@
Fri Dec 13 20:44:10 CET 2024
Dear Daniel et al.,
Following on Duncan's remark and examining the message produced by
nloptr(), I simply tried increasing the maximum number of function
evaluations:
------ snip -------
> nloptr(rep(0, 4), f, eval_g_ineq = hin, eval_g_eq = Hx, opts =
+ list("algorithm" = "NLOPT_LN_COBYLA", "xtol_rel" = 1.0e-8,
+ maxeval = 1e5)
+ )
Call:
nloptr(x0 = rep(0, 4), eval_f = f, eval_g_ineq = hin, eval_g_eq = Hx,
opts = list(algorithm = "NLOPT_LN_COBYLA", xtol_rel = 1e-08,
maxeval = 1e+05))
Minimization using NLopt version 2.7.1
NLopt solver status: 4 ( NLOPT_XTOL_REACHED: Optimization stopped
because xtol_rel or xtol_abs (above) was reached. )
Number of Iterations....: 46317
Termination conditions: xtol_rel: 1e-08 maxeval: 1e+05
Number of inequality constraints: 1
Number of equality constraints: 1
Optimal value of objective function: 1287.71725107671
Optimal value of controls: 1.576708 6.456606 6.195305 -19.008
---------- snip ----------
That produces a solution closer to, and better than, the one that you
suggested (which you obtained how?):
> f(c(0.222, 6.999, 6.17, -19.371))
[1] 1325.076
I hope this helps,
John
--
John Fox, Professor Emeritus
McMaster University
Hamilton, Ontario, Canada
web: https://www.john-fox.ca/
--
On 2024-12-13 1:45 p.m., Duncan Murdoch wrote:
> Caution: External email.
>
>
> You posted a version of this question on StackOverflow, and were given
> advice there that you ignored.
>
> nloptr() clearly indicates that it is quitting without reaching an
> optimum, but you are hiding that message. Don't do that.
>
> Duncan Murdoch
>
> On 2024-12-13 12:52 p.m., Daniel Lobo wrote:
>> library(nloptr)
>>
>> set.seed(1)
>> A <- 1.34
>> B <- 0.5673
>> C <- 6.356
>> D <- -1.234
>> x <- seq(0.5, 20, length.out = 500)
>> y <- A + B * x + C * x^2 + D * log(x) + runif(500, 0, 3)
>>
>> #Objective function
>>
>> X <- cbind(1, x, x^2, log(x))
>> f <- function(theta) {
>> sum(abs(X %*% theta - y))
>> }
>>
>> #Constraint
>>
>> eps <- 1e-4
>>
>> hin <- function(theta) {
>> abs(sum(X %*% theta) - sum(y)) - 1e-3 + eps
>> }
>>
>> Hx <- function(theta) {
>> X[100, , drop = FALSE] %*% theta - (120 - eps)
>> }
>>
>> #Optimization with nloptr
>>
>> Sol = nloptr(rep(0, 4), f, eval_g_ineq = hin, eval_g_eq = Hx, opts =
>> list("algorithm" = "NLOPT_LN_COBYLA", "xtol_rel" = 1.0e-8))$solution
>> # -0.2186159 -0.5032066 6.4458823 -0.4125948
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list