0% found this document useful (0 votes)
191 views22 pages

Julia Ode

This document discusses ODE solvers available in Julia and compares their performance to MATLAB solvers. It introduces the ODE.jl and Sundials.jl packages, describing the solvers each provides and how to use their APIs. Code examples are given to demonstrate solving ODEs and DAEs. Benchmark results show the Julia solvers outperform MATLAB, with ODE.jl and Sundials.jl solving a test ODE over 10 times faster than MATLAB's ode23s solver.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
191 views22 pages

Julia Ode

This document discusses ODE solvers available in Julia and compares their performance to MATLAB solvers. It introduces the ODE.jl and Sundials.jl packages, describing the solvers each provides and how to use their APIs. Code examples are given to demonstrate solving ODEs and DAEs. Benchmark results show the Julia solvers outperform MATLAB, with ODE.jl and Sundials.jl solving a test ODE over 10 times faster than MATLAB's ode23s solver.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 22

ODE solvers in Julia

Gabriel Ingesson

October 2, 2015

Motivation

General: Numerical methods for solving ODEs is important


for system simulations. Simulation is important for controller
design.
Personal: In my research project it is interesting to solve
ODEs fast, in the control loop. For this purpose, Julia seems
to be an interesting alternative.

1 / 21

This Presentation Covers

ODE solver packages in Julia.


How to use them, what functionality they contain.
Code examples and a comparison to Matlab solvers w.r.t.
speed and functionality.

2 / 21

Essentially two packages available

ODE.jl - Various basic Ordinary Differential Equation solvers


implemented in Julia, used to be a part of Base. Supports
fixed step, adaptive and stiff solvers.
Sundials.jl - package that interfaces to the Sundials C library.
SUite of Nonlinear and DIfferential/Algebraic equation
Solvers.

3 / 21

ODE.jl

Supports the following solvers


ode23: 2nd order adaptive solver with 3rd order error control,
using the BogackiShampine coefficients.
ode45: 4th order adaptive solver with 5th order error control,
using the Dormand Prince coefficients. Fehlberg and
Cash-Karp coefficients are also available.
ode78: 7th order adaptive solver with 8th order error control,
using the Fehlberg coefficients.
ode23s: 2nd/3rd order adaptive solver for stiff problems, using
a modified Rosenbrock triple.

4 / 21

ODE.jl

Supports the following solvers


ode23: 2nd order adaptive solver with 3rd order error control,
using the BogackiShampine coefficients.
ode45: 4th order adaptive solver with 5th order error control,
using the Dormand Prince coefficients. Fehlberg and
Cash-Karp coefficients are also available.
ode78: 7th order adaptive solver with 8th order error control,
using the Fehlberg coefficients.
ode23s: 2nd/3rd order adaptive solver for stiff problems, using
a modified Rosenbrock triple.

5 / 21

ODE.jl - API

All of which have the following basic API:


tout, yout = odeXX(F, y0, tspan; keywords...)
For solving the following ODE at the instants of tspan
dy
= f (t, y ), y (0) = y0
dt

(1)

6 / 21

ODE.jl - Keywords
norm: user-supplied norm for determining the error E (default
Base.vecnorm),
abstol and/or reltol: an integration step is accepted if
E <= abstol||E <= reltol abs(y )
maxstep, minstep and initstep: determine the maximal,
minimal and initial integration step.
points=:all (default): output is given for each value in tspan
as well as for each intermediate point the solver used.
points=:specified: output is given only for each value in tspan.
Additionally, ode23s solver supports jacobian = G(t, y ):
user-supplied Jacobian G(t, y ) = dF (t, y )/dy .
Note: There are currently discussions about how the Julian
API for ODE solvers should look like, and the current
documentation is more like a wishlist than a documentation.
7 / 21

Example: Van Der Pool Oscillator


using ODE
using Winston
function f(t, y)
mu = 2.5
ydot = similar(y)
ydot[1] = y[2]
ydot[2] = mu*(1-y[1]2)*y[2]-y[1]
ydot
end
t = [0:.1:10.0;]
y0 = [1.0, 3.0]
t,y=ODE.ode23s(f, y0, t)
y1 = [ a[1] for a in y] # Rearranging the output,
y2 = [ a[2] for a in y] # more convenient
plot(float(y1),float(y2))
8 / 21

Example: Van Der Pool Oscillator

9 / 21

Sundials.jl

Containts:
CVODES - for integration and sensitivity analysis of ODEs.
CVODES treats stiff and nonstiff ODE systems of the form
y 0 = f (t, y , p), y (t0) = y 0(p), where p is a set of parameters.
IDAS - for integration and sensitivity analysis of DAEs. IDAS
treats DAE systems of the form
F (t, y , y 0 , p) = 0, y (t0) = y 0(p), y 0 (t0) = y 00 (p).
KINSOL - for solution of nonlinear algebraic systems.
KINSOL treats nonlinear systems of the form F (u) = 0.

10 / 21

CVODES
dy
= f (t, y ), y (0) = y0
dt
using Sundials
using Winston
function f(t,y,ydot)
mu = 2.5
ydot[1] = y[2]
ydot[2] = mu*(1-y[1]2)*y[2]-y[1]
ydot
end
t = [0:.1:10.0;]
y0 = [1.0, 3.0]
res = Sundials.cvode(f, y0, t)
plot(res[:,1],res[:,2])
11 / 21

Example: Van Der Pool Oscillator

12 / 21

IDAS

F (dy /dt, y , t) = 0

(2)

using Sundials
function resrob(tres, y, yp, r)
r[1] = -0.04*y[1] + 1.0e4*y[2]*y[3]
r[2] = -r[1] - 3.0e7*y[2]*y[2] - yp[2]
r[1] -= yp[1]
r[3] = y[1] + y[2] + y[3] - 1.0
end
# yp is here the derivative vector.
t = [0.0, 4 * logspace(-1., 5., 100)]
yout, ypout =
Sundials.idasol(resrob,[1.0,0,0],[-0.04,0.04,0.0],t)

13 / 21

IDAS Example

14 / 21

KINSOL
F (y ) = 0

(3)

import Sundials
function sysfn(y, fy)
fy[1] = y[1]2 + y[2]2 - 1.0
fy[2] = y[2] - y[1]2
end
sol = Sundials.kinsol(sysfn, ones(2))
julia> sol
2-element Ar
0.786153
0.618035

15 / 21

More code examples can be found at


https://github.com/JuliaLang/Sundials.jl
https://github.com/JuliaLang/Ode.jl

16 / 21

A small comparison between


ODE.jl ode23s, Sundials CVODE and Matlabs ode23s
With the conditions
t = [0:.01:10.0;]
y0 = [1.0, 3.0]
abstol=1e-8; reltol=1e-8;
function f(t, y) # Van Der Pool Oscillator
mu = 3.0
ydot = similar(y)
ydot[1] = y[2]
ydot[2] = mu*(1-y[1]2)*y[2]-y[1]
ydot
end

17 / 21

Results

ODE.jl ode23s
elapsed time: 3.539e-6 seconds (80 bytes allocated)
Sundials CVODEs
elapsed time: 4.954e-6 seconds (80 bytes allocated)
Matlab ode23s
Elapsed time is 1.099103 seconds.

18 / 21

Results, ODE.jl ode23s (blue), Sundials CVODEs (red),


Matlabs ode23s (green)

19 / 21

Summary

ODE.jl is a work in progress, will probably be the main


choice in the future.
Sundials.jl has a lot more functionality, might be a better
short term solution.

20 / 21

Homework (Not Mandatory)

Check out the Three-Body Problem Sundials.jl Julia Code at


http://nbviewer.ipython.org/github/pjpmarques/Julia-Modelingthe-World/blob/master/Three-Body%20Problem.ipynb
and generate your own plots.

21 / 21

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy