# Symbolic derivation of complex valued functions with Symbolics.jl

**URL:** <https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230>\
**Category:** New to Julia\
**Tags:** symbolics, complex-numbers\
**Created:** [March 21, 2022, 6:26pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230 "2022-03-21T18:26:42Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vahid\_Hosseinzadeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vahid_hosseinzadeh/32/33293_2.png) [@Vahid\_Hosseinzadeh](https://discourse.julialang.org/u/Vahid_Hosseinzadeh)\
**Post date:** [March 21, 2022, 6:26pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/1 "2022-03-21T18:26:42Z")

</div>

when there is im (the imaginery number i) in the function I get zero for the derivative which is obviously wrong. We can replace im with a symbol like I and then differentiate, but I was wondering  
maybe there is a better way to do it.

```julia
using Symbolics
@variables t
D = Differential(t)
z = im*t 
D(z)
expand_derivatives(D(z)) #gives 0!

```

---

<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:** [March 22, 2022, 12:13am UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/2 "2022-03-22T00:13:27Z")

</div>

@shashi

---

<div class="post-metadata">

**Author:** ![goerch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerch/32/29122_2.png) [@goerch](https://discourse.julialang.org/u/goerch)\
**Post date:** [March 22, 2022, 11:04am UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/3 "2022-03-22T11:04:55Z")

</div>

I played a bit with this

```julia
using Symbolics
@variables x::Float64
D = Differential(x)
@show D
@show D(x) 
@show expand_derivatives(D(x))

@variables z::Complex{Float64}
D = Differential(z)
@show D
@show D(z)
@show expand_derivatives(D(z))

```

yielding

```julia
D = Differential(x)
D(x) = Differential(x)(x)
expand_derivatives(D(x)) = 1
D = Differential(z)
D(z) = Differential(z)(z)
expand_derivatives(D(z)) = 0

```

Bug?

---

<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:** [March 22, 2022, 7:11pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/4 "2022-03-22T19:11:04Z")

</div>

That definitely looks like one.

---

<div class="post-metadata">

**Author:** ![goerch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerch/32/29122_2.png) [@goerch](https://discourse.julialang.org/u/goerch)\
**Post date:** [March 22, 2022, 7:18pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/5 "2022-03-22T19:18:59Z")

</div>

@Vahid_Hosseinzadeh: are you going to report it? Else I’ll do.

---

<div class="post-metadata">

**Author:** ![Vahid\_Hosseinzadeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vahid_hosseinzadeh/32/33293_2.png) [@Vahid\_Hosseinzadeh](https://discourse.julialang.org/u/Vahid_Hosseinzadeh)\
**Post date:** [March 22, 2022, 7:39pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/6 "2022-03-22T19:39:59Z")

</div>

This is a more nice way to see it. Thank you.

---

<div class="post-metadata">

**Author:** ![Vahid\_Hosseinzadeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vahid_hosseinzadeh/32/33293_2.png) [@Vahid\_Hosseinzadeh](https://discourse.julialang.org/u/Vahid_Hosseinzadeh)\
**Post date:** [March 22, 2022, 7:41pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/7 "2022-03-22T19:41:14Z")

</div>

You mean issue on Github? Anyway be free to report it. Thanks @goerch

---

<div class="post-metadata">

**Author:** ![goerch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerch/32/29122_2.png) [@goerch](https://discourse.julialang.org/u/goerch)\
**Post date:** [March 22, 2022, 7:46pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/8 "2022-03-22T19:46:17Z")

</div>

> [@Vahid\_Hosseinzadeh](#):
>
> You mean issue on Github?

[Done](https://github.com/JuliaSymbolics/Symbolics.jl/issues/558).

---

<div class="post-metadata">

**Author:** ![shashi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shashi/32/1824_2.png) [@shashi](https://discourse.julialang.org/u/shashi)\
**Post date:** [March 29, 2022, 8:34pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/9 "2022-03-29T20:34:05Z")

</div>

This happens because we sneakily represent `@variables z::Complex` as `Complex{Num}(term(real, z), term(imag, z))` in order to be able to call functions restricted to `Complex{<:Real}`…

---

<div class="post-metadata">

**Author:** ![shashi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shashi/32/1824_2.png) [@shashi](https://discourse.julialang.org/u/shashi)\
**Post date:** [March 29, 2022, 8:41pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/10 "2022-03-29T20:41:47Z")

</div>

It’s also unclear to me what form the answer should take in this case. @YingboMa pointed out it is possible to convert C into R^2 and differentiate, but the result is not a complex number…

---

<div class="post-metadata">

**Author:** ![goerch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerch/32/29122_2.png) [@goerch](https://discourse.julialang.org/u/goerch)\
**Post date:** [March 29, 2022, 8:59pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/11 "2022-03-29T20:59:16Z")

</div>

You are not alone in this. [Here](https://juliadiff.org/ChainRulesCore.jl/stable/maths/complex.html) is a different view of the same problem.

---

<div class="post-metadata">

**Author:** ![YingboMa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yingboma/32/2181_2.png) [@YingboMa](https://discourse.julialang.org/u/YingboMa)\
**Post date:** [March 29, 2022, 9:03pm UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/12 "2022-03-29T21:03:56Z")

</div>

Check [Complex numbers · ChainRules](https://juliadiff.org/ChainRulesCore.jl/stable/maths/complex.html)

If we use ChainRules in Symbolics, then we can propagate `Union{Jacobian2x2, Complex}`, and if we are propagating `Jacobian2x2` then convert it to `Complex` if `du_dx == du_dy` and `-du_dy == dv_dx`. We can have a list of holomorphic functions so that we don’t compute `Jacobian2x2` unnecessarily. The return type of `derivative` would be `Union{Jacobian2x2, Complex}`. Maybe we want to error if not all the elements are `Complex` when computing Jacobian and gradient.

---

<div class="post-metadata">

**Author:** ![shashi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/shashi/32/1824_2.png) [@shashi](https://discourse.julialang.org/u/shashi)\
**Post date:** [March 30, 2022, 2:19am UTC](https://discourse.julialang.org/t/symbolic-derivation-of-complex-valued-functions-with-symbolics-jl/78230/13 "2022-03-30T02:19:57Z")

</div>

Thanks, that makes sense. Maybe @stevengj has a good idea for this… It would be nice to have differentiation with respect to complex numbers work in a usable way.
