# DiffEqDiffTools - addtional variables in objective function

#1

Hi, I have found DiffEqDiffTools.finite_difference_jacobian to be quite useful, thanks to the devs

I just have a question regarding passing additional variables in the objective function. The standard format would be:

``````function f(fvec,x)
fvec[1] = (x[1]+3)*(x[2]^3-7)+18
fvec[2] = sin(x[2]*exp(x[1])-1)
end
``````

which would work with e.g.:

``````J = DiffEqDiffTools.finite_difference_jacobian(f, x)
``````

however, what if I needed to pass additional variables into the function:

``````function f(fvec,x,constants)
fvec[1] = (x[1]+3)*(x[2]^3-7)+18 + constants[1]*x[1] + constants[2]
fvec[2] = sin(x[2]*exp(x[1])-1) - constants[3]
end
``````

This function definition does not work with DiffEqDiffTools.finite_difference_jacobian since it expects f((::Array{Float64,1}, ::Array{Float64,1})). In the above case without making “constants” global, is there a way to pass the variable to the function and still be compatible with DiffEqDiffTools.finite_difference_jacobian? Note, in my actual usage case there are a large number of structs being passed into the objective function and since it is computing a relatively large Jacobian the function calls need to be as efficient as possible.

Thanks

#2

Use a closure:

``````J = DiffEqDiffTools.finite_difference_jacobian((fvec,x)->f(fvec,x,constants), x)
``````

#3

Thanks a lot for the answer (to a probably a trivial question)