# Nonlinear programming function calls involving sine and cosine

**URL:** <https://discourse.julialang.org/t/nonlinear-programming-function-calls-involving-sine-and-cosine/86153>\
**Category:** Optimization (Mathematical)\
**Tags:** question, jump\
**Created:** [August 22, 2022, 8:41pm UTC](https://discourse.julialang.org/t/nonlinear-programming-function-calls-involving-sine-and-cosine/86153 "2022-08-22T20:41:54Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![sky](https://avatars.discourse-cdn.com/v4/letter/s/f4b2a3/32.png) [@sky](https://discourse.julialang.org/u/sky)\
**Post date:** [August 22, 2022, 8:41pm UTC](https://discourse.julialang.org/t/nonlinear-programming-function-calls-involving-sine-and-cosine/86153/1 "2022-08-22T20:41:54Z")

</div>

Dear all,  
I’m trying to build a nonlinear optimization problem and solve it by Ipopt. I have the following code

```julia
using MosekTools
using JuMP
using Ipopt
model = Model(Ipopt.Optimizer)
@variable(model,x1)
cons = [
    (x) -> sin(x) + 1
    (x) -> x + 1
]
expr = @NLexpression(model, cons[1](x1))

```

I got error

```julia
LoadError: Unsupported function cons[1]. All function calls must be `Symbol`s.
in expression starting at In[4]:7

Stacktrace:
 [1] error(s::String)
   @ Base ./error.jl:33
 [2] _parse_nonlinear_expression_inner(code::Expr, x::Expr, operators::Set{Tuple{Symbol, Int64}})
   @ JuMP ~/.julia/packages/JuMP/bm7X3/src/macros.jl:1928
 [3] _parse_nonlinear_expression(model::Expr, x::Expr)
   @ JuMP ~/.julia/packages/JuMP/bm7X3/src/macros.jl:1841
 [4] var"@NLexpression"( __source__ ::LineNumberNode, __module__ ::Module, args::Vararg{Any, N} where N)
   @ JuMP ~/.julia/packages/JuMP/bm7X3/src/macros.jl:2419
 [5] eval
   @ ./boot.jl:360 [inlined]
 [6] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base ./loading.jl:1116

```

If I change the last line to

```julia
using MosekTools
using JuMP
using Ipopt
model = Model(Ipopt.Optimizer)
@variable(model,x1)
cons = [
    (x) -> sin(x) + 1
    (x) -> x + 1
]
expr = @NLexpression(model, sin(x1) + 1)

```

I got normal output

```julia
subexpression[1]: sin(x1) + 1.0

```

How to fix the first case? Thank you so much for the help.

---

<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:** [August 22, 2022, 9:22pm UTC](https://discourse.julialang.org/t/nonlinear-programming-function-calls-involving-sine-and-cosine/86153/2 "2022-08-22T21:22:01Z")

</div>

To use a user-defined function in a nonlinear expression, you first need to register it:  
[https://jump.dev/JuMP.jl/stable/manual/nlp/#User-defined-Functions](https://jump.dev/JuMP.jl/stable/manual/nlp/#User-defined-Functions)

But even then, all functions must be symbols, so you can’t look up a function using `cons[1]`.

I’d strongly suggest you re-structure your code to write out the expressions instead of using the `cons` vector (just like you did in the second example).

But if you must, you can use the (advanced) capability to construct the expressions:  
[https://jump.dev/JuMP.jl/stable/manual/nlp/#More-complicated-examples](https://jump.dev/JuMP.jl/stable/manual/nlp/#More-complicated-examples)
