# Error using Sundials and JuMP

**URL:** <https://discourse.julialang.org/t/error-using-sundials-and-jump/42272>\
**Category:** General Usage\
**Tags:** package, jump\
**Created:** [June 29, 2020, 9:24pm UTC](https://discourse.julialang.org/t/error-using-sundials-and-jump/42272 "2020-06-29T21:24:06Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jorge\_Silva](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jorge_silva/32/14976_2.png) [@Jorge\_Silva](https://discourse.julialang.org/u/Jorge_Silva)\
**Post date:** [June 29, 2020, 9:24pm UTC](https://discourse.julialang.org/t/error-using-sundials-and-jump/42272/1 "2020-06-29T21:24:06Z")

</div>

First I ve defined a function that uses Sundials solver.

> function rheo(czz0)  
> …  
> prob = DAEProblem(filament,du₀,u₀,tspan,differential\_vars=differential\_vars)  
> sol = Sundials.solve(prob, IDA(), reltol=1e-8, abstol=1e-8)  
> Dr=sol[4,end]  
> …  
> return Dr  
> end

The function works well. Thus, I tried to use JuMP.jl to optimization.

Somethink like

> model = Model(GLPK.Optimizer)  
> @variable(model, 1 \<= x \<= 3.6)  
> @objective(model, Min, abs(10-rheo(x)))  
> optimize!(model)

Thus, I obtained the error

> ERROR: MethodError: no method matching Sundials.FunJac(::Sundials.var"#82#86"{DAEProblem{Array{GenericAffExpr{Float64,VariableRef},1},Array{Float64,1},Tuple{Float64,Float64},true,DiffEqBase.NullParameters,DAEFunction{true,var"#filament#3"{Float64,Float64,Float64,Float64,Float64,Float64,Float64,Int64,Float64,Float64,Float64,Float64,Float64,Float64,Float64,Float64},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Array{Bool,1}},Tuple{Int64},Tuple{Int64}}, ::Nothing, ::Nothing, ::DiffEqBase.NullParameters, ::Nothing, ::Nothing, ::Nothing, ::Nothing, ::Array{GenericAffExpr{Float64,VariableRef},1}, ::Array{Float64,1}, ::Array{Float64,1})  
> Closest candidates are:  
> Sundials.FunJac(::F, ::F2, ::J, ::P, ::M, ::J2, ::Prec, ::PS, ::uType, ::uType, ::uType2) where {F, F2, J, P, M, J2, uType, uType2, Prec, PS} at C:\Users\jorgem63.julia\packages\Sundials\LzbrB\src\common\_interface\function\_types.jl:3  
> Sundials.FunJac(::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) at C:\Users\jorgem63.julia\packages\Sundials\LzbrB\src\common\_interface\function\_types.jl:16  
> Sundials.FunJac(::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) at C:\Users\jorgem63.julia\packages\Sundials\LzbrB\src\common\_interface\function\_types.jl:15  
> Stacktrace:  
> [1] Sundials.FunJac(::Function, ::Nothing, ::DiffEqBase.NullParameters, ::Nothing, ::Nothing, ::Nothing, ::Nothing, ::Array{GenericAffExpr{Float64,VariableRef},1}, ::Array{Float64,1}, ::Array{Float64,1}) at C:\Users\jorgem63.julia\packages\Sundials\LzbrB\src\common\_interface\function\_types.jl:16  
> [2] \_\_init(::DAEProblem{Array{GenericAffExpr{Float64,VariableRef},1},Array{Float64,1},Tuple{Float64,Float64},true,DiffEqBase.NullParameters,DAEFunction{true,var"#filament#3"{Float64,Float64,Float64,Float64,Float64,Float64,Float64,Int64,Float64,Float64,Float64,Float64,Float64,Float64,Float64,Float64},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Array{Bool,1}}, ::IDA{:Dense,Nothing,Nothing}, ::Array{Any,1}, ::Array{Any,1}, ::Array{Any,1}; verbose::Bool, dt::Nothing, dtmax::Float64, save\_on::Bool, save\_start::Bool, callback::Nothing, abstol::Float64, reltol::Float64, saveat::Array{Float64,1}, tstops::Array{Float64,1}, maxiters::Int64, timeseries\_errors::Bool, dense\_errors::Bool, save\_everystep::Bool, dense::Bool, save\_timeseries::Nothing, save\_end::Bool, progress::Bool, progress\_name::String, progress\_message::typeof(DiffEqBase.ODE\_DEFAULT\_PROG\_MESSAGE), advance\_to\_tstop::Bool, stop\_at\_next\_tstop::Bool, userdata::Nothing, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at C:\Users\jorgem63.julia\packages\Sundials\LzbrB\src\common\_interface\solve.jl:897  
> [3] init\_call(::DAEProblem{Array{GenericAffExpr{Float64,VariableRef},1},Array{Float64,1},Tuple{Float64,Float64},true,DiffEqBase.NullParameters,DAEFunction{true,var"#filament#3"{Float64,Float64,Float64,Float64,Float64,Float64,Float64,Int64,Float64,Float64,Float64,Float64,Float64,Float64,Float64,Float64},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Array{Bool,1}}, ::IDA{:Dense,Nothing,Nothing}, ::Vararg{Any,N} where N; kwargs::Base.Iterators.Pairs{Symbol,Float64,Tuple{Symbol,Symbol},NamedTuple{(:reltol, :abstol),Tuple{Float64,Float64}}}) at C:\Users\jorgem63.julia\packages\DiffEqBase\smkNe\src\solve.jl:14  
> [4] init(::DAEProblem{Array{GenericAffExpr{Float64,VariableRef},1},Array{Float64,1},Tuple{Float64,Float64},true,DiffEqBase.NullParameters,DAEFunction{true,var"#filament#3"{Float64,Float64,Float64,Float64,Float64,Float64,Float64,Int64,Float64,Float64,Float64,Float64,Float64,Float64,Float64,Float64},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Array{Bool,1}}, ::IDA{:Dense,Nothing,Nothing}, ::Vararg{Any,N} where N; kwargs::Base.Iterators.Pairs{Symbol,Float64,Tuple{Symbol,Symbol},NamedTuple{(:reltol, :abstol),Tuple{Float64,Float64}}}) at C:\Users\jorgem63.julia\packages\DiffEqBase\smkNe\src\solve.jl:33  
> [5] \_\_solve(::DAEProblem{Array{GenericAffExpr{Float64,VariableRef},1},Array{Float64,1},Tuple{Float64,Float64},true,DiffEqBase.NullParameters,DAEFunction{true,var"#filament#3"{Float64,Float64,Float64,Float64,Float64,Float64,Float64,Int64,Float64,Float64,Float64,Float64,Float64,Float64,Float64,Float64},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Array{Bool,1}}, ::IDA{:Dense,Nothing,Nothing}, ::Array{Any,1}, ::Array{Any,1}, ::Array{Any,1}, ::Type{Val{true}}; kwargs::Base.Iterators.Pairs{Symbol,Float64,Tuple{Symbol,Symbol},NamedTuple{(:reltol, :abstol),Tuple{Float64,Float64}}}) at C:\Users\jorgem63.julia\packages\Sundials\LzbrB\src\common\_interface\solve.jl:10  
> [6] solve\_call(::DAEProblem{Array{GenericAffExpr{Float64,VariableRef},1},Array{Float64,1},Tuple{Float64,Float64},true,DiffEqBase.NullParameters,DAEFunction{true,var"#filament#3"{Float64,Float64,Float64,Float64,Float64,Float64,Float64,Int64,Float64,Float64,Float64,Float64,Float64,Float64,Float64,Float64},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Array{Bool,1}}, ::IDA{:Dense,Nothing,Nothing}; merge\_callbacks::Bool, kwargs::Base.Iterators.Pairs{Symbol,Float64,Tuple{Symbol,Symbol},NamedTuple{(:reltol, :abstol),Tuple{Float64,Float64}}}) at C:\Users\jorgem63.julia\packages\DiffEqBase\smkNe\src\solve.jl:60  
> [7] #solve\_up#444 at C:\Users\jorgem63.julia\packages\DiffEqBase\smkNe\src\solve.jl:85 [inlined]  
> [8] #solve#443 at C:\Users\jorgem63.julia\packages\DiffEqBase\smkNe\src\solve.jl:69 [inlined]  
> [9] rheotens(::VariableRef) at C:\Users\jorgem63\rheotens2.jl:79  
> [10] top-level scope at C:\Users\jorgem63.julia\packages\MutableArithmetics\NuiNA\src\rewrite.jl:227  
> [11] top-level scope at C:\Users\jorgem63.julia\packages\JuMP\YXK4e\src\macros.jl:800

Any idea about this?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [June 29, 2020, 11:33pm UTC](https://discourse.julialang.org/t/error-using-sundials-and-jump/42272/2 "2020-06-29T23:33:37Z")

</div>

JuMP assumes differentiability, and the Sundials solvers are not differentiable. You’ll want to use DiffEqFlux for this kind of thing, or directly define the gradient of the ODE via [Local Sensitivity Analysis (Automatic Differentiation) · DifferentialEquations.jl](https://diffeq.sciml.ai/latest/analysis/sensitivity/)
