! 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