# Q: Optimization.jl | Passing fixed parameters to an analytic derivative \[gradient\] for univariate \[multivariate\] optimization?

**URL:** https://discourse.julialang.org/t/q-optimization-jl-passing-fixed-parameters-to-an-analytic-derivative-gradient-for-univariate-multivariate-optimization/101605
**Category:** Optimization (Mathematical)
**Tags:** question, package
**Created:** [July 14, 2023, 7:13am UTC](https://discourse.julialang.org/t/q-optimization-jl-passing-fixed-parameters-to-an-analytic-derivative-gradient-for-univariate-multivariate-optimization/101605 "2023-07-14T07:13:59Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![Audrius-St](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/audrius-st/32/24175_2.png) [@Audrius-St](https://discourse.julialang.org/u/Audrius-St)
#### Post date: [July 14, 2023, 7:13am UTC](https://discourse.julialang.org/t/q-optimization-jl-passing-fixed-parameters-to-an-analytic-derivative-gradient-for-univariate-multivariate-optimization/101605/1 "2023-07-14T07:13:59Z")

</div>

The Optimization.jl [documentation](https://docs.sciml.ai/Optimization/stable/getting_started/#Controlling-Gradient-Calculations-(Automatic-Differentiation)) states " Defining gradients can be done in two ways. One way is to manually provide a gradient definition in the `OptimizationFunction` constructor. However, the more convenient way to obtain gradients is to provide an AD backend type."

As I have worked out the analytic gradient, using Symbolics.jl, I would like to use it rather than perform automatic differentiation.

Reading the `OptimizationFunction` constructor [specification](https://docs.sciml.ai/Optimization/stable/API/optimization_function/), it is far from clear to me how to do this.

So, in the following MWE, how does one replace `Optimization.AutoForwardDiff()` in `OptimizationFunction` with the analytic gradient?

```julia
# test_scalar_Optimization.jl

using Optimization
using OptimizationOptimJL
using ForwardDiff

function f(x, p)
    f_x = (x[1] - p[1])^2
    return f_x
end

# Analytic gradient
function grad(G, x, p)
    G[1] = 2.0*(x[1] - p[1])
    return G[1]
end

begin
    x0 = zeros(1)
    p = [1.0]

    opt_f = OptimizationFunction(f, Optimization.AutoForwardDiff())
    opt_prob = OptimizationProblem(opt_f, x0, p)
    sol = solve(opt_prob, Optim.BFGS())
end

```

---

<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: [July 14, 2023, 12:49pm UTC](https://discourse.julialang.org/t/q-optimization-jl-passing-fixed-parameters-to-an-analytic-derivative-gradient-for-univariate-multivariate-optimization/101605/2 "2023-07-14T12:49:13Z")

</div>

> [@Audrius-St](#):
>
> As I have worked out the analytic gradient, using Symbolics.jl, I would like to use it rather than perform automatic differentiation.

`AutoModelingToolkit` is equivalent to using Symbolics.jl for symbolic gradients.

---

<div class="post-metadata">

### Author: ![Audrius-St](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/audrius-st/32/24175_2.png) [@Audrius-St](https://discourse.julialang.org/u/Audrius-St)
#### Post date: [July 14, 2023, 7:41pm UTC](https://discourse.julialang.org/t/q-optimization-jl-passing-fixed-parameters-to-an-analytic-derivative-gradient-for-univariate-multivariate-optimization/101605/3 "2023-07-14T19:41:12Z")

</div>

Thank you for your suggestion.  
Will read ` AutoModelingToolkit` documentation and give it a go.
