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
© 2001-2019 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.