! This example demonstrates the solver sensitibility to errors introduced by
! numerical derivatives
!
! This model should be run twice, with different settings for XNLP_SOLVER
! This example is a version of the Polygon4 example.
!
! This example demonstrates a particular non-linear optimization concept as related
! to Xpress NonLinear.
! The version of the example is for Xpress 7.5.
!
! (c) 2013 Fair Isaac Corporation
model "Polygon 4"
uses "mmxnlp"
parameters
N=5 ! Number of vertices
SOLVER=0 ! 0: SLP, 1: Knitro
end-parameters
declarations
RN = 1..N
Area: nlctr
rho : array(RN) of mpvar ! Distance of vertex from the base point
theta : array(RN) of mpvar ! Angle from x-axis
D: array(RN,RN) of nlctr ! Limit on side length
FunctionArg: list of nlctr ! User function arguments
AreaFunction: userfunc ! User function definition
end-declarations
! Objective: sum of areas. Definition of a user function
AreaFunction := userfuncExcel("polygonsheet.xls", "Sheet1")
! Create function arguments
! Excel functions use their first columns as input: use a list to ensure correct order
forall (i in 1..N-1) do
FunctionArg += [nlctr(rho(i))]
FunctionArg += [nlctr(theta(i))]
end-do
! Use the Excel user function in a formula for the objective
Area := F(AreaFunction,FunctionArg)
! Bounds and start values for decision variables
forall (i in 1..N-1) do
rho(i) >= 0.1
rho(i) <= 1
setinitval(rho(i),4*i*(N + 1 - i)/((N+1)^2))
setinitval(theta(i),M_PI*i/N)
end-do
! Third side of all triangles <= 1
forall (i in 1..N-2, j in i+1..N-1)
D(i,j) := rho(i)^2 + rho(j)^2 - rho(i)*rho(j)*2*cos(theta(j)-theta(i)) <= 1
! Vertices in increasing order
forall (i in 2..N-1) theta(i) >= theta(i-1) +.01
! Boundary conditions (last vertex above x-axis)
theta(N-1) <= M_PI
! Uncomment to display user function info
! userfuncinfo(AreaFunction)
! Optional parameter settings
setparam("xnlp_verbose", true) ! Enable XNLP output log
setparam("xnlp_solver", SOLVER) ! Select the solver
setparam("xslp_excelvisible", true)
! Solve the problem
maximise(Area)
! Solution output
writeln("Area = ", getobjval)
forall (i in 1..N-1)
writeln("V",i,": r=",getsol(rho(i))," theta=",getsol(theta(i)))
end-model
|