# Results NLP problem

**URL:** <https://discourse.julialang.org/t/results-nlp-problem/71673>\
**Category:** Optimization (Mathematical)\
**Tags:** question, jump, nonlinear\
**Created:** [November 17, 2021, 4:48pm UTC](https://discourse.julialang.org/t/results-nlp-problem/71673 "2021-11-17T16:48:56Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Francisco\_Javier\_Mar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/francisco_javier_mar/32/24679_2.png) [@Francisco\_Javier\_Mar](https://discourse.julialang.org/u/Francisco_Javier_Mar)\
**Post date:** [November 17, 2021, 4:48pm UTC](https://discourse.julialang.org/t/results-nlp-problem/71673/1 "2021-11-17T16:48:56Z")

</div>

Hello. Could you clarify a question for me. I am having certain problems with my mathematical model, this model is non-linear and the ipopt is the solver chosen for the resolution of the problem. My model has its minimum and maximum limits, pmin and pmax, when using the solver it partially respects them since it reaches an optimal solution but certain values ​​minimally exceed the maximum limits, such as pmax = 180 but some values ​​reach 180.0000018 . How can I do to limit these variables to values ​​without decimals, how can I do so that if the limits are reached, these are integer values?

```julia
using JuMP,Ipopt,XLSX

us = ["Jacui","Ita","Xingo","Salto Santiago","Lajeado","Itaparica","GP Souza","Canoas II","Capivara","Chavante","Funil","Camargos","Estreito","Manso"
,"Volta Grande","Porto Primavera","Marimbondo","Agua Vermelha","Samuel","Nova Ponte"]

d=[11924 9823 9539 9396 9254 9681 10735 11931 12813 13713 14308 13127 14892 16686 16458 16088 13411 11674 11105 11674 12244 11390 10535 9823]
metas=[108 870 1581 760 543 889 157 33 319 228 108 27 662 124 228 924 701 838 132 307]

pmin = [
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140
    250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250
    170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170
    89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89
    113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113
    22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
    3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
    30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
    19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
    9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
    79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79
    19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
    29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29
    29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29
    62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
    4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
    24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
    33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
    ]
pmax = [
    180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180
    1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450 1450
    2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635 2635
    1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268 1268
    905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905 905
    1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482 1482
    262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262
    56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56
    532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532 532
    380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380
    180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180
    46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
    1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104 1104
    208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208
    380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380
    1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540 1540
    1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169 1169
    1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398 1398
    220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220
    513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513 513
    ]

valor_agua = [0.0036*304,0.0036*517,0.0036*351,0.0036*887,0.0036*434,0.0036*914,0.0036*2436,0.0036*804,0.0036*695,0.0036*1070,0.0036*715,0.0036*2242,0.0036*1496,0.0036*194,0.0036*1235,0.0036*472,0.0036*1073,0.0036*878,0.0036*106.5,0.0036*2129]

μ = 0.02
c_00=[7.654052483048688,40.62910891274373,31.96800105675084,9.530406772017962,115.0049118998941,48.386870152983235,2.34354793711202,2.627036394848996,18.63093278809548,4.07890572514291,5.099703248503789,10.549371263936779,10.904689524486393,7.459857028022684,10.694499834932483,40.11398550553216,63.36789930537633,25.18352774321871,14.144017305549545,10.84673263581038]
c_10=[0.892362529923684,0.9432654477458005,0.8218848297576222,1.053776436577942,2.7366057154026873,1.9400889416028784,0.15268218429693264,6.67235493471428,2.5023123226385535,1.448444294223902,1.6969986757777689,3.8816000432889375,1.5940558126085134,1.6798486102276515,3.4983288807513486,4.677474604738309,1.6809127962695842,1.7959703284343882,3.1968915809440226,0.9556199774266778]
c_20=[0.0015737422140654617,0.00013596507465868818,5.607056623632372e-05,0.00017923047649544608,0.0007023209416358729,0.00027822366537762276,0.0001455034168815677,0.020963716840235052,0.0010175800823603272,0.00083654906236899,0.0020053516881876014,0.014807233540011597,0.0003250711763358595,0.0017329078541697622,0.0019636755066780617,0.0010966877092086073,0.00042246653492786397,0.0002968271707442997,0.004750879880736467,0.0003930043398122151]

model = Model(Ipopt.Optimizer)

nus = length(us)
nd = length(d)

@variables(model, begin
    p[i=1:nus, t=1:nd]
    z[t=1:nd] >= 0
end)

@NLobjective(
    model,
    Min,
    sum(
        sum(
            valor_agua[i] * (
                c_00[i] +
                c_10[i] * p[i, t] +
                c_20[i] * p[i, t]^2)
            for i = 1:nus
        ) + μ * z[t]^2
        for t = 1:nd
    )
)
@constraints(model, begin
[i=1:nus, t=1:nd], pmin[i, t] <= p[i, t]
[i=1:nus, t=1:nd], p[i, t] <= pmax[i, t]
    [t=1:nd], sum(p[:, t]) + z[t] == d[t]
    [i=1:nus], sum(p[i, :]) == 24 * metas[i]
end)

print(model)
optimize!(model)
@show value.(p)
@show value.(p)
@show value.(n)
@show value.(z)

```

---

<div class="post-metadata">

**Author:** ![blob](https://avatars.discourse-cdn.com/v4/letter/b/ebca7d/32.png) [@blob](https://discourse.julialang.org/u/blob)\
**Post date:** [November 17, 2021, 5:49pm UTC](https://discourse.julialang.org/t/results-nlp-problem/71673/2 "2021-11-17T17:49:58Z")

</div>

From Ipopt’s perspective these two numbers `180` and `180.0000018` are identical. You can check:  
`isapprox(180,180.0000018;atol=1e-5)`  
gives `true`, but  
`isapprox(180,180.0000018;atol=1e-6) `  
gives `false`.  
You can probably play around with tolerances in Ipopt using `set_optimizer_attribute` ([Models · JuMP](https://jump.dev/JuMP.jl/stable/reference/models/#JuMP.set_optimizer_attribute)) - most of the options (all of them) available for ipopt should be accessible from JuMP ([Ipopt: Ipopt Options](https://coin-or.github.io/Ipopt/OPTIONS.html)), but Ipopt doesn’t support integer variables, so you may always end up with x.00000000xx
