Skip to content

JuliaHolomorphic/ComplexPhasePortrait.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ComplexPhasePortrait.jl

Build Status Coverage

This package is a Julia implementation of the phase portrait ideas presented in Elias Wegert's book "Visual Complex Functions".

Installation

From the Julia command prompt:

] add ComplexPhasePortrait

Examples

There is so far one exported function, portrait, and here I will try to detail its use. First we need function data over a grid.

using ComplexPhasePortrait

nx = 1000
x = range(-1, stop=1, length=nx)
Z = x' .+ reverse(x)*im

f = z -> (z - 0.5im)^2 * (z + 0.5+0.5im)/z
fz = f.(Z)

Now a basic phase plot.

img = portrait(fz)

proper phase plot

Now for a basic plot using NIST coloring.

img = portrait(fz, ctype="nist")

nist coloring

Lines of constant phase are given by

img = portrait(fz, PTstepphase)

constant phase

Lines of constant modulus are given by

img = portrait(fz, PTstepmod)

constant modulus

Finally, a conformal grid is given by

img = portrait(fz, PTcgrid)

conformal grid

Plot recipes

ComplexPhasePortrait.jl has support for plotting recipes for Plots.jl and Makie.jl.

Plots.jl:

using Plots
using LaTeXStrings

using ComplexPhasePortrait
using IntervalSets

f = z -> (z - 0.5im)^2 * (z + 0.5+0.5im)/z

phaseplot(-1..1, -1..1, f, PTcgrid, :ctype=>"nist";
          xlabel=L"\Re\{z\}", ylabel=L"\Im\{z\}")

Plots.jl example

Makie.jl

Makie.jl is an optional dependency via package extensions, and the functionality to plot phase portraits becomes available if Makie.jl or one of its front-end packages is loaded before ComplexPhasePortrait.jl:

using GLMakie

using ComplexPhasePortrait
using IntervalSets

f = z -> (z - 0.5im)^2 * (z + 0.5+0.5im)/z

fig = Figure()
ax = Axis(fig[1, 1], aspect=1)
phase!(ax, -1..1, -1..1, f, portrait_type=PTcgrid, ctyle="nist")
display(fig)

Makie.jl example

Alternatively, one can use the function phase:

phase(x, y, f; kwargs...)

x and y can be vectors or ClosedIntervals; in the former case f can be a matrix of appropriate size or a Function, in the latter case, only a Function is possible.