hello

can you provide me with an example or link to an example on NL optimization with Ipopt

Thank you

hello

can you provide me with an example or link to an example on NL optimization with Ipopt

Thank you

From my book Julia Quick Syntax Reference (Apress)

The only differences of non-linear problems are that: (1) we have to provide good starting points for the variables (try running the following example with `0`

as starting point !); (2) we define the (non-linear) constraints with the specific `@NLconstraints`

macro and (3) the (non-linear) objective with `@NLobjective`

macro.

Note how we donâ€™t need to provide any other further information (in particular no derivatives are needed).

A student has to choose how to allocate its weekly budget of 80 dollars. She can choose only between pizzas (*p*) or sandwiches (*s*). Pizzas cost 10$, while sandwiches are cheap and cost only 4$.

Her â€śutility functionâ€ť (how much she is happy with any given combination of pizzas and sandwiches) is 100p - 2p^2 + 70s - 2 s^2 -3ps . She likes both, with preferences for pizza, but without excesses!

We use a simple problem of a maximisation of a non-linear function of 2 variables subject to a single constraints. To make the example simple we donâ€™t use sets here (i.e. both variables and constraints are just scalar).

\max\limits_{p,s} {100p - 2p^2 + 70s - 2 s^2 -3ps }

subject to:

10p+4s \leq 80

Where the first equation is the utility function and the second one is what the economists call the â€śbudget constraintâ€ť, i.e. we canâ€™t spend more money that what we have .

As we deal with a non-linear model we need to select a solver engine capable to handle such class of problem. IPOPT does the job:

```
using JuMP, Ipopt
m = Model(with_optimizer(Ipopt.Optimizer, print_level=0))
```

Being physical quantities, on top of the explicit constraint, we need to add a lower bound of `0`

to our variables (lower and upper bounds can be specified in one expression as `lB <= var <= uB`

).

```
@variable(m, 0 <= p, start=1, base_name="Quantities of pizzas")
@variable(m, 0 <= s, start=1, base_name="Quantities of sandwiches")
@constraint(m, budget, 10p + 4s <= 80 )
@NLobjective(m, Max, 100*p - 2*p^2 + 70*s - 2*s^2 - 3*p*s)
```

We interpret the problem as the optimal â€śweekly averageâ€ť, so it is ok if the optimal result is half pizza. Otherwise we should limit the variables to be integer adding the option `integer=true`

on their declaration, but then the class of the problem would change to Mixed Integer NonLinear Programming (MINLP) and we would have to change also the solver engine (`bonmin`

is a good solver for MINLP problems).

Given that the problem is non-linear, the solution is reported as a â€ślocal optimaâ€ť. It is up to us then decide if (like in this case) the nature of the problem guarantees that the local optima is also a global one.

```
optimize!(m)
status = termination_status(m)
if (status == MOI.OPTIMAL || status == MOI.LOCALLY_SOLVED || status == MOI.TIME_LIMIT) && has_values(m)
if (status == MOI.OPTIMAL)
println("** Problem solved correctly **")
else
println("** Problem returned a (possibly suboptimal) solution **")
end
println("- Objective value : ", objective_value(m))
println("- Optimal solutions:")
println("pizzas: $(value.(p))")
println("sandwitches: $(value.(s))")
println("- Dual (budget): $(dual.(budget))")
else
println("The model was not solved correctly.")
println(status)
end
# Expected output:
# ** Problem returned a (possibly suboptimal) solution **
# - Objective value : 750.8928616403513
# - Optimal solutions:
# pizzas: 4.642857242997538
# sandwitches: 8.39285709239478
# - Dual (budget): -5.624999975248088
```

3 Likes

Thanks so so much !

I have a question to you pls

If I am dealing with a big system where for each item there are four variables and there are 5 items for exampleâ€¦cant I divide my work by making functions to check constraints and call the these functions one by one in my file where I declared the modelâ€¦I have faaced problems when I tried to make so