Using GAIO with DynamicalSystems.jl
BoxMap
s can also be generated via the DynamicalSystems.jl
package:
julia> using GAIO
julia> c, r = (0.5, 0.5), (0.5, 0.5)
((0.5, 0.5), (0.5, 0.5))
julia> Q = Box(c, r)
Box{2, Float64}: center: [0.5, 0.5] radius: [0.5, 0.5]
julia> f((x,y)) = (1-1.4*x^2+y, 0.3*x) # the Hénon map
f (generic function with 1 method)
julia> using DynamicalSystems: DiscreteDynamicalSystem
julia> using StaticArrays
julia> dynamic_rule(u::Vec, p, t) where Vec = Vec( f(u) ) # DynamicalSystems.jl syntax
dynamic_rule (generic function with 1 method)
julia> u0 = SA_F64[0, 0] # this is dummy data
2-element SVector{2, Float64} with indices SOneTo(2): 0.0 0.0
julia> p0 = SA_F64[0, 0] # parameters, in case they are needed
2-element SVector{2, Float64} with indices SOneTo(2): 0.0 0.0
julia> system = DiscreteDynamicalSystem(dynamic_rule, u0, p0)
2-dimensional DeterministicIteratedMap deterministic: true discrete time: true in-place: false dynamic rule: dynamic_rule parameters: [0.0, 0.0] time: 0 state: [0.0, 0.0]
julia> F̃ = BoxMap(system, Q)
BoxMap over [0.0, 1.0) × [0.0, 1.0)
The same works for a continuous dynamical system.
Currently, you must hard-code your systems, and cannot rely on DifferentialEquations
or DynamicalSystems
for GPU-acceleration.
GAIO.jl ALWAYS performs integration over one time unit for ContinuousDynamicalSystem
s! To perform smaller steps, rescale your dynamical system accordingly!
julia> using DynamicalSystems: ContinuousDynamicalSystem
julia> using OrdinaryDiffEq
julia> function lorenz_dudx(u::Vec, p, t, Δt) where Vec x,y,z = u σ,ρ,β = p dudx = Vec(( σ*(y-x), ρ*x-y-x*z, x*y-β*z )) return Δt * dudx end
lorenz_dudx (generic function with 1 method)
julia> Δt = 0.2
0.2
julia> lorenz(u, p=p0, t=0) = lorenz_dudx(u, p, t, Δt)
lorenz (generic function with 3 methods)
julia> u0 = SA_F64[0, 0, 0]
3-element SVector{3, Float64} with indices SOneTo(3): 0.0 0.0 0.0
julia> p0 = SA_F64[10, 28, 0.4]
3-element SVector{3, Float64} with indices SOneTo(3): 10.0 28.0 0.4
julia> diffeq = (alg = RK4(), dt = 1/20, adaptive = false)
(alg = OrdinaryDiffEqLowOrderRK.RK4{typeof(OrdinaryDiffEqCore.trivial_limiter!), typeof(OrdinaryDiffEqCore.trivial_limiter!), Static.False}(OrdinaryDiffEqCore.trivial_limiter!, OrdinaryDiffEqCore.trivial_limiter!, static(false)), dt = 0.05, adaptive = false)
julia> lorenz_system = ContinuousDynamicalSystem(lorenz, u0, p0; diffeq)
3-dimensional CoupledODEs deterministic: true discrete time: false in-place: false dynamic rule: lorenz ODE solver: RK4 ODE kwargs: (dt = 0.05, adaptive = false) parameters: [10.0, 28.0, 0.4] time: 0.0 state: [0.0, 0.0, 0.0]
julia> Q̄ = Box((0,0,25), (30,30,30))
Box{3, Float64}: center: [0.0, 0.0, 25.0] radius: [30.0, 30.0, 30.0]
julia> F̄ = BoxMap(lorenz_system, Q̄)
BoxMap over [-30.0, 30.0) × [-30.0, 30.0) × [-5.0, 55.0)