# Plotting Implicit Functions using ImplicitEquations.jl

**URL:** <https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708>\
**Category:** Visualization\
**Tags:** question, package, plots, calculus, symbolic\
**Created:** [November 6, 2020, 10:00pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708 "2020-11-06T22:00:09Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 10:00pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/1 "2020-11-06T22:00:09Z")

</div>

I’m trying to plot an implicit function

```julia
using Plots, ImplicitEquations 
f(x,y)= sqrt((x^2+144)+(y^2+144))

```

and I get  
ERROR: Cannot convert Num to series data for plotting  
perhaps it’s because I have x and y as symbols

```julia
using ModelingToolkit, Plots, ImplicitEquations

@variables x y

f(x,y)= sqrt((x^2+144)+(y^2+144))

```

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [November 6, 2020, 10:01pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/2 "2020-11-06T22:01:39Z")

</div>

> [@brett\_knoss](#):
>
> perhaps it’s because I have x and y as symbols

Yes.

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 10:02pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/3 "2020-11-06T22:02:20Z")

</div>

Ok, how would I change the types, so that I have the right type for ploting?

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [November 6, 2020, 10:13pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/4 "2020-11-06T22:13:15Z")

</div>

You should use actual numbers rather than symbolic numbers.

```julia
julia> using Plots, ImplicitEquations

julia> f(x, y) = sqrt((x^2+144)+(y^2+144))
f (generic function with 1 method)

julia> plot(f ⩵ 20, xlims = (-15, 15), ylims=(-15, 15))

```

produces

![Screen Shot 2020-11-06 at 3.13.00 PM](https://global.discourse-cdn.com/julialang/original/3X/1/a/1aaa6ce9053558dbafc92fa1c1d03d48aa5519f7.png)

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 10:16pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/5 "2020-11-06T22:16:09Z")

</div>

I see thanks, I get that. the problem is that I’m doing derivatives, and need symbols for that, so I’d like to be able to change symbols back to numbers, so that I can plot with them.

---

<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:** [November 6, 2020, 10:25pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/6 "2020-11-06T22:25:04Z")

</div>

You’d use `build_function` to get the Julia function and then do the ImplicitEquations plot with that.

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 10:35pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/7 "2020-11-06T22:35:28Z")

</div>

> [@Mason](#):
>
> `f(x, y) = sqrt((x^2+144)+(y^2+144))`

I thought I had it

```julia
build_function(f,[x,y])
plot(f(x,y)

```

but it’s still a symbol

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [November 6, 2020, 10:44pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/8 "2020-11-06T22:44:38Z")

</div>

```julia
julia> using ModelingToolkit; @variables x y;

julia> f(x,y)= sqrt((x^2+144)+(y^2+144))
f (generic function with 1 method)

julia> let ex = Differential(x)(f(x, y))
           func_ex = build_function(expand_derivatives(ex), x, y)
           @eval ∂xf(x, y) = ($func_ex)(x,y)
       end
∂xf (generic function with 1 method)

julia> using Plots, ImplicitEquations

julia> plot(∂xf ⩵ 0.1, xlims=(0, 10), ylims=(-100, 100))

```

produces

![Screen Shot 2020-11-06 at 3.44.22 PM](https://global.discourse-cdn.com/julialang/original/3X/b/7/b7cffa4caa54a1d44ed89c0d93e8e215c4986548.png)

In the future, people will have an easier time helping you if you actually show the code that produces the error. It’s a lot harder to help if we have to guess what you’re actually doing.

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [November 6, 2020, 10:47pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/9 "2020-11-06T22:47:12Z")

</div>

> [@brett\_knoss](#):
>
> I thought I had it
> 
> ```julia
> build_function(f,[x,y])
> plot(f(x,y)
> 
> ```
> 
> but it’s still a symbol

You’re not building the right function (or even using the right syntax for `build_function`). What Chris suggested was to use `build_function` to get a julia native function representation of the derivative, not the original function `f`.

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 10:51pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/10 "2020-11-06T22:51:30Z")

</div>

> [@Mason](#):
>
> `ex = Differential(x)(f(x, y))`

Ok, I see, so I use Differential(x), to do a n implicit derivative as a f of x and y, then I use @eval to save the function as a Julia function.

---

<div class="post-metadata">

**Author:** ![j\_verzani](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/j_verzani/32/8551_2.png) [@j\_verzani](https://discourse.julialang.org/u/j_verzani)\
**Post date:** [November 6, 2020, 10:52pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/11 "2020-11-06T22:52:51Z")

</div>

There are a few issues:

1. The predicate function in `ImplicitEquations` are too tightly typed
2. build\_function as called return an expression. You can get a function by passing `expression=Val{false}` but that is of type `ggfunc` and then see 1)
3. You can call `eval` on an expression but that returns a function taking a single argument so needs some massaging, e.g.:

g(x,y) = eval(build\_function(f(x,y), [x,y])((x,y)))

That’s a bit cumbersome, the fix should be addressing 1). (Though @Mason makes it look more elegant in his solution)

In the interim, there are some other possibilities. This page has an example with IntervalConstraintProgramming:

[https://juliahub.com/docs/CalculusWithJulia/AZHbv/0.0.5/derivatives/implicit\_differentiation.html](https://juliahub.com/docs/CalculusWithJulia/AZHbv/0.0.5/derivatives/implicit_differentiation.html)

This page shows how Makie + MDBM could be used.

[https://github.com/jverzani/CalculusWithJulia.jl/blob/master/src/implicit\_equation.jl](https://github.com/jverzani/CalculusWithJulia.jl/blob/master/src/implicit_equation.jl)

It would require a bit of adjusment to work with Plots, but not so much.

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [November 6, 2020, 11:00pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/12 "2020-11-06T23:00:06Z")

</div>

> [@j\_verzani](#):
>
> g(x,y) = eval(build\_function(f(x,y), [x,y])((x,y)))

Just a little nitpick, this will run `eval` every time you call `g`, so it is different from what I wrote in more than aesthetics. My version doesn’t use `eval` at runtime.

---

<div class="post-metadata">

**Author:** ![j\_verzani](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/j_verzani/32/8551_2.png) [@j\_verzani](https://discourse.julialang.org/u/j_verzani)\
**Post date:** [November 6, 2020, 11:11pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/13 "2020-11-06T23:11:44Z")

</div>

Thanks for the clarification!

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 11:28pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/14 "2020-11-06T23:28:12Z")

</div>

```julia
@variables μ x y u
@derivatives δx'~x δy'~y δu'~u δμ~μ 
expand_derivatives(δu(sqrt(u))*δx((x^2+144)) +δμ(sqrt(μ))*δy(y^2+144))

```

but I get 0 for some reason.  
this is how I originally did the expand part

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [November 6, 2020, 11:35pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/15 "2020-11-06T23:35:14Z")

</div>

I don’t get zero when I run the code you showed. First, I got an error because you write `δμ~μ ` instead of `δμ'~μ `, but after fixing that, I get

```julia
julia> using ModelingToolkit

julia> @variables μ x y u
(μ, x, y, u)

julia> @derivatives δx'~x δy'~y δu'~u δμ'~μ
((D'~x), (D'~y), (D'~u), (D'~μ))

julia> expand_derivatives(δu(sqrt(u))*δx((x^2+144)) +δμ(sqrt(μ))*δy(y^2+144)) |> simplify
(2 * inv(2 * sqrt(u)) * x) + (2 * y * inv(2 * sqrt(μ)))

```

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 11:36pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/16 "2020-11-06T23:36:51Z")

</div>

Ok, I’m going to restart everything, I think that’s my problem.

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 6, 2020, 11:50pm UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/17 "2020-11-06T23:50:33Z")

</div>

Yes, that’s my problem. I need to know how to clean my regestries, I’m also not sure how to sub a function for u or μ

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 7, 2020, 12:04am UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/18 "2020-11-07T00:04:52Z")

</div>

What did you use to simplify?

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [November 7, 2020, 12:07am UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/19 "2020-11-07T00:07:27Z")

</div>

That `simplify` was not necessary, I just put it in there to check if `expand_derivatives` had any simplifications left over, but it didn’t. I forgot to remove it.

To answer your question though, `simplify` is exported by `ModelingToolkit`. The code I posted was self contained.

---

<div class="post-metadata">

**Author:** ![brett\_knoss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brett_knoss/32/13050_2.png) [@brett\_knoss](https://discourse.julialang.org/u/brett_knoss)\
**Post date:** [November 7, 2020, 12:09am UTC](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708/20 "2020-11-07T00:09:05Z")

</div>

Ok, I was having trouble with ModelingToolkit’s simplify, but it might be I wasn’t using it right.

[Next page](https://discourse.julialang.org/t/plotting-implicit-functions-using-implicitequations-jl/49708.md?page=2)
