I am now diving into another interesting Julia 0.6.2 area—non-linear non-quadratic (unconstrained) optimization with JuMP 0.18.1. The documentation is partly nice and easy, partly difficult. This is because the different optimizers are external—and there are many of them, so I am not even sure which one I am supposed to chase down. Beginner’s help appreciated.
Logically, why does
getvaluenot require the model’s name?
What packages are recommended for no-derivatives simplex, steepest-descent, conjugate priors, and Newton-Raphson (which seem to be the standard workhorses). I would like to start with the dumbest, slowest, most robust optimizers first, and then work my way up.
I think there is something wrong with KNITRO 0.4.0 under macOS. despite successful
Pkg.add("KNITRO"), I get ERROR: LoadError: error compiling loadproblem!: error compiling Type: could not load library “libknitro” dlopen(libknitro.dylib, 1): image not found
I have had better luck with Ipopt. At least I could get it to run! Alas, I could not figure out a method that would allow autodiff=FALSE. In the simple example below, because my function (
nearneghyperbola) has two kinks, IPopt probably gets confused. more worrisome, it does not seem to recognize that it has gotten it wrong—I think it claims to have found a minimum, which it has not. A check around the optimum should tell it this.
using JuMP, Ipopt nearneghyperbola( a... ) = prod( -1.0./(abs.( collect(a) .+ 3) + 1e-2) ) function learn_nl_jump(userfun, n) mymdl = JuMP.Model( solver=Ipopt.IpoptSolver() ) JuMP.register( mymdl, :userfun, n, userfun, autodiff=true ) @JuMP.variable( mymdl, -100 <= x[1:n] <= 100 ) JuMP.setNLobjective( mymdl, :Min, Expr(:call, :userfun, [x[i] for i=1:n]...) ) JuMP.solve( mymdl ) return [ getvalue(x[i]) for i=1:n ] ## why does getvalue not refer to mymdl?? end xopt= learn_nl_jump(nearneghyperbola, 3) println( "x^* =: ", xopt, "\n") println( "minimum f(x^*)= ", nearneghyperbola(xopt...) ) println( "f(neg 3s)= ", nearneghyperbola(-3, -3, -3) )
output on my machine is
... EXIT: Solved To Acceptable Level. x^* =: [-99.9897, -99.9897, 94.0] minimum f(x^*)= -1.0955764466765225e-6 f(neg 3s)= -1.0e6