# How to implement a piece-wise defined function in JuMP

**URL:** https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095
**Category:** Optimization (Mathematical)
**Tags:** jump
**Created:** [February 9, 2022, 3:52pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095 "2022-02-09T15:52:55Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![Jian\_ZUO](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jian_zuo/32/33738_2.png) [@Jian\_ZUO](https://discourse.julialang.org/u/Jian_ZUO)
#### Post date: [February 9, 2022, 3:52pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/1 "2022-02-09T15:52:55Z")

</div>

I have an optimization problem simplified as:

> function α(x)  
> global Lmin, Lnom, Lmax, α\_0 # values calculated outside  
> a = 0.0019727939  
> b = 0.0078887  
> if Lmin \<= x \< Lnom  
> return a \* (x-Lnom)^2 + α\_0  
> elseif Lnom \<= x \<= Lmax  
> return (b \* (x-Lnom)^2 + α\_0)  
> end  
> end

> model = Model(Ipopt.Optimizer)  
> @variable(model, Lmax\>=x[1:2]\>=Lmin)  
> @constraint(model, sum(x)==1)  
> @objective(model, Min, α(x))  
> optimize!(model)  
> I have two decision variables: x[1], x[2].  
> How to implement α(x) in JuMP and solve this optimization?

---

<div class="post-metadata">

### Author: ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)
#### Post date: [February 9, 2022, 5:59pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/2 "2022-02-09T17:59:36Z")

</div>

You probably will want to see [this section](https://jump.dev/JuMP.jl/dev/manual/expressions/#Nonlinear-expressions) and links therein, but the `if...else` may further complicate your model. Can’t you eliminate it somehow?

---

<div class="post-metadata">

### Author: ![tbeason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbeason/32/15898_2.png) [@tbeason](https://discourse.julialang.org/u/tbeason)
#### Post date: [February 9, 2022, 6:35pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/3 "2022-02-09T18:35:59Z")

</div>

Can you write it as a single expression with a dummy variable?

```julia
(a*(x<Lnom) + b*(x>=Lnom)) *(x-Lnom)^2 + α_0

```

EDIT: Also it looks like `x` is a vector but your objective function is treating it as a scalar so I’m not certain you’re giving a clear picture of your actual problem.

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [February 9, 2022, 6:40pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/4 "2022-02-09T18:40:38Z")

</div>

Option 1:

```julia
using JuMP, Ipopt
α_0 = 1.0
Lmin = -1.0
Lnom = 0.0
Lmax = 1.0
a = 0.0019727939
b = 0.0078887

model = Model(Ipopt.Optimizer)
@variable(model, Lmin <= x[1:2] <= Lmax)
@constraint(model, sum(x) == 1)
@NLobjective(
    model, 
    Min,
    ifelse(
        x[1] < Lnom,
        a * (x[1]-Lnom)^2 + α_0,
        b * (x[1]-Lnom)^2 + α_0,
    ),
)
optimize!(model)

```

Option 2:

```julia
using JuMP, Ipopt
Lmin = -1.0
Lmax = 1.0
function α(x...)
    α_0 = 1.0
    Lnom = 0.0
    a = 0.0019727939
    b = 0.0078887
    if Lmin <= x[1] < Lnom
        return a * (x[1]-Lnom)^2 + α_0
    else
        return (b * (x[1]-Lnom)^2 + α_0)
    end
end        
model = Model(Ipopt.Optimizer)
@variable(model, Lmin <= x[1:2] <= Lmax)
@constraint(model, sum(x) == 1)
register(model, :α, 2, α; autodiff = true)
@NLobjective(model, Min, α(x...))
optimize!(model)

```

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [February 9, 2022, 6:41pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/5 "2022-02-09T18:41:31Z")

</div>

> `(a*(x<Lnom) + b*(x>=Lnom)) *(x-Lnom)^2 + α_0`

You can’t write expressions like this in JuMP, but also yes, there are some vector/scalar problems going on.

---

<div class="post-metadata">

### Author: ![Jian\_ZUO](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jian_zuo/32/33738_2.png) [@Jian\_ZUO](https://discourse.julialang.org/u/Jian_ZUO)
#### Post date: [February 9, 2022, 7:56pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/6 "2022-02-09T19:56:19Z")

</div>

In my problem I have several decision variables, in the small example I  
mean decision variables: x[1] and x[2].

---

<div class="post-metadata">

### Author: ![Jian\_ZUO](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jian_zuo/32/33738_2.png) [@Jian\_ZUO](https://discourse.julialang.org/u/Jian_ZUO)
#### Post date: [February 9, 2022, 7:59pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/7 "2022-02-09T19:59:24Z")

</div>

Hello, can you help to clarify the vector/scalar problem? In the example, I have two decision variables: x[1], x[2]. This is what I needed.

---

<div class="post-metadata">

### Author: ![Jian\_ZUO](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jian_zuo/32/33738_2.png) [@Jian\_ZUO](https://discourse.julialang.org/u/Jian_ZUO)
#### Post date: [February 9, 2022, 8:04pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/8 "2022-02-09T20:04:55Z")

</div>

Thank you very much for the two examples. I will adapt them in my program.

---

<div class="post-metadata">

### Author: ![Jian\_ZUO](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jian_zuo/32/33738_2.png) [@Jian\_ZUO](https://discourse.julialang.org/u/Jian_ZUO)
#### Post date: [February 9, 2022, 8:06pm UTC](https://discourse.julialang.org/t/how-to-implement-a-piece-wise-defined-function-in-jump/76095/9 "2022-02-09T20:06:08Z")

</div>

Hello. Thank you for the reply. I will read the document.
