Initializing help system before first use

Example: using nlsolv for Nonlinear Programming

The following example that calculates the shape of a hanging chain with N chainlinks and fixed endpoints is the same model as in Section Mosel model using myqxprs. Since nlsolv does not include any solver, the parameter NL_solver needs to be set to the (external) solver that is to be used. This may be any nonlinear solver supporting the .nl format and providing the functionality required by the particular model. If the name of the executable is different from the name of the solver prefix, its name needs to be specified via the parameter NL_solverpath as shown in this example for Xpress Optimizer.—Please note that the NL interface for Xpress only supports LP, MIP, and QCQP.

Other features shown by this model are the setting of initial values for decision variables and the retrieval of solution information at the end of the solver run—these functionalities are provided by the module mmnl that is included by nlsolv (see Chapter mmnl of the Mosel Language Reference Manual for the full documentation of mmnl).

model "catenary - NL version"
 uses "nlsolv"

 parameters
   SOLVER="xpress"
   SOLVERPATH="amplxpress"
   SOLVEROPTIONS=""

   N = 100                       ! Number of chainlinks
   L = 1                         ! Difference in x-coordinates of endlinks
   H = 2*L/N                     ! Length of each link
 end-parameters

 declarations
   RN = 0..N
   x: array(RN) of mpvar         ! x-coordinates of endpoints of chainlinks
   y: array(RN) of mpvar         ! y-coordinates of endpoints of chainlinks
   PotentialEnergy: linctr       ! Objective function
   Link: array(range) of nlctr   ! Constraints
 end-declarations

 forall(i in RN) x(i) is_free
 forall(i in RN) y(i) is_free

! Objective: minimise the potential energy
 PotentialEnergy:= sum(j in 1..N) (y(j-1)+y(j))/2

! Bounds: positions of endpoints
 x(0) = 0; y(0) = 0; x(N) = L; y(N) = 0

! Constraints: positions of chainlinks
 forall(j in 1..N)
   Link(j):= (x(j)-x(j-1))^2+(y(j)-y(j-1))^2 <= H^2

! Setting start values
 forall(j in RN) setinitval(x(j), j*L/N)
 forall(j in RN) setinitval(y(j), 0)

! Configuration of the solver
 setparam("nl_verbose", true)
 setparam("nl_solver", SOLVER)
 if SOLVERPATH<>"" then
   setparam("nl_solverpath", SOLVERPATH)
 end-if
 if SOLVEROPTIONS<>"" then
   setparam("nl_options", SOLVEROPTIONS)
 end-if

! Solve the problem
 minimise(PotentialEnergy)

! Solution reporting
 if getprobstat<>NL_OPT and getprobstat<>NL_UNF then
   writeln("No solution available. Solver status: ", getparam("NL_STATUS"))
 else
   writeln("Solution: ", getobjval)
   forall(j in RN)
     writeln(strfmt(getsol(x(j)),10,5), " ", strfmt(getsol(y(j)),10,5))
 end-if

end-model