# Build\_function from differential equation

**URL:** https://discourse.julialang.org/t/build-function-from-differential-equation/58276
**Category:** Modelling & Simulations
**Tags:** question, symbolic
**Created:** [March 31, 2021, 7:05am UTC](https://discourse.julialang.org/t/build-function-from-differential-equation/58276 "2021-03-31T07:05:13Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![ohmsweetohm1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ohmsweetohm1/32/49126_2.png) [@ohmsweetohm1](https://discourse.julialang.org/u/ohmsweetohm1)
#### Post date: [March 31, 2021, 7:05am UTC](https://discourse.julialang.org/t/build-function-from-differential-equation/58276/1 "2021-03-31T07:05:13Z")

</div>

I tried the example from [Symbolics.jl](https://symbolics.juliasymbolics.org/stable/tutorials/converting_to_C/) but ran into a problem:

```julia
using Symbolics
function lotka_volterra!(du, u, p, t)
  x, y = u
  α, β, δ, γ = p
  du[1] = dx = α*x - β*x*y
  du[2] = dy = -δ*y + γ*x*y
end
@variables t du[1:2] u[1:2] p[1:4]
lotka_volterra!(du, u, p, t)
D = Differential(t)
f = build_function((@. D(u) ~ du), u, p, t, target=Symbolics.JuliaTarget())

```

It seems that `build_function` can not handle the `Differential(t)` terms:

```julia
julia> Base.remove_linenums!(f[1])
:(function (var"##arg#312", var"##arg#313", t)
      let u₁ = var"##arg#312"[1], u₂ = var"##arg#312"[2], p₁ = var"##arg#313"[1], p₂ = var"##arg#313"[2], p₃ = var"##arg#313"[3], p₄ = var"##arg#313"[4]
          (SymbolicUtils.Code.create_array)(typeof(var"##arg#312"), nothing, Val{(2,)}(), Differential(t)(u₁) ~ p₁*u₁ - (p₂*u₁*u₂), Differential(t)(u₂) ~ p₄*u₁*u₂ - (p₃*u₂))
      end
  end)

```

The generated function can not be evaluated:

```julia
julia> eval(f[1])(rand(2),rand(4),rand())
2-element Array{Equation,1}:
 Differential(t)(u₁) ~ p₁*u₁ - (p₂*u₁*u₂)
 Differential(t)(u₂) ~ p₄*u₁*u₂ - (p₃*u₂)

```

If I just use the RHS

```julia
f = build_function(du, u, p, t, target=Symbolics.JuliaTarget())

```

it can be

```julia
julia> eval(f[1])(rand(2),rand(4),rand())
2-element Array{Float64,1}:
  0.1351112517260627
 -0.00769245404130421

```

The `MATLABTarget` seems to cope with this:

```julia
julia> f = build_function((@. D(u) ~ du), u, p, t, target=Symbolics.MATLABTarget())
┌ Warning: build_function(::Array{<:Equation}...) is deprecated. Use build_function(::AbstractArray...) instead.
└ @ Symbolics .julia\packages\Symbolics\cO1c0\src\build_function.jl:677
"diffeqf = @(t,internal_var___u) [internal_var___p(1) * internal_var___u(1) + -1 * internal_var___p(2) * internal_var___u(1) * internal_var___u(2); -1 * internal_var___p(3) * internal_var___u(2) + internal_var___p(4) * internal_var___u(1) * internal_var___u(2)];"

```

And also the `CTaret`:

````julia
julia> f = build_function((@. D(u) ~ du), u, p, t, target=Symbolics.CTarget())
┌ Warning: build_function(::Array{<:Equation}...) is deprecated. Use build_function(::AbstractArray...) instead.
└ @ Symbolics .julia\packages\Symbolics\cO1c0\src\build_function.jl:463
"void diffeqf(double* du, double* RHS1, double* RHS2, double RHS3) {\n du[0] = RHS2[0] * RHS1[0] + -1 * RHS2[1] * RHS1[0] * RHS1[1];\n du[1] = -1 * RHS2[2] * RHS1[1] + RHS2[3] * RHS1[0] * RHS1[1];\n}\n"
```
````

---

<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: [April 1, 2021, 12:41pm UTC](https://discourse.julialang.org/t/build-function-from-differential-equation/58276/2 "2021-04-01T12:41:48Z")

</div>

The warning that is being thrown is that `MATLABTarget` and `CTarget` are not going to allow that in the future because it’s not necessarily correct.

---

<div class="post-metadata">

### Author: ![ohmsweetohm1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ohmsweetohm1/32/49126_2.png) [@ohmsweetohm1](https://discourse.julialang.org/u/ohmsweetohm1)
#### Post date: [April 1, 2021, 8:19pm UTC](https://discourse.julialang.org/t/build-function-from-differential-equation/58276/3 "2021-04-01T20:19:15Z")

</div>

So it should be only the RHS of the equations: `du`.
