Skip to content

Commit 507f7c4

Browse files
Merge pull request #154 from ChrisRackauckas-Claude/update-vanderpol-documentation
Remove ModelingToolkit dependency from ODEProblemLibrary for faster compilation
2 parents 27dbd53 + fb1b24e commit 507f7c4

File tree

4 files changed

+230
-193
lines changed

4 files changed

+230
-193
lines changed

lib/ODEProblemLibrary/Project.toml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,17 @@ version = "0.1.12"
44

55
[deps]
66
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
7-
Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
87
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
98
Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a"
10-
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
119
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
12-
RuntimeGeneratedFunctions = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47"
1310

1411
[compat]
1512
Aqua = "0.5"
1613
DiffEqBase = "6"
17-
Latexify = "0.16"
18-
ModelingToolkit = "10"
19-
RuntimeGeneratedFunctions = "0.5"
2014
julia = "1.10"
2115

2216
[extras]
2317
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
2418

2519
[targets]
26-
test = ["Aqua"]
20+
test = ["Aqua"]
Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
module ODEProblemLibrary
22

33
using DiffEqBase
4-
using Latexify
5-
using ModelingToolkit
6-
using ModelingToolkit: t_nounits as t, D_nounits as D
7-
84
using LinearAlgebra
95
using Markdown
106
using Random
117

12-
import RuntimeGeneratedFunctions
13-
RuntimeGeneratedFunctions.init(@__MODULE__)
14-
158
Random.seed!(100)
169

1710
#ODE Example Problems
@@ -30,19 +23,13 @@ export prob_ode_linear, prob_ode_bigfloatlinear, prob_ode_2Dlinear,
3023
prob_ode_chen, prob_ode_rossler, prob_ode_rabinovich_fabrikant, prob_ode_sprott,
3124
prob_ode_hindmarsh_rose
3225

33-
# For MTKv9 compatibility
34-
@static if !isdefined(ModelingToolkit, :mtkcompile)
35-
function mtkcompile(args...; kwargs...)
36-
structural_simplify(args...; kwargs...)
37-
end
38-
end
39-
26+
# Include all problem definitions
4027
include("ode_linear_prob.jl")
28+
include("nonlinchem.jl")
4129
include("ode_simple_nonlinear_prob.jl")
4230
include("brusselator_prob.jl")
4331
include("pollution_prob.jl")
4432
include("filament_prob.jl")
45-
include("nonlinchem.jl")
4633
include("strange_attractors.jl")
4734

48-
end # module
35+
end # module

lib/ODEProblemLibrary/src/ode_simple_nonlinear_prob.jl

Lines changed: 68 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ with initial condition ``v=w=1``
4848
prob_ode_fitzhughnagumo = ODEProblem(fitz, [1.0; 1.0], (0.0, 1.0),
4949
(0.7, 0.8, 1 / 12.5, 0.5))
5050

51-
#Van der Pol Equations
52-
@parameters μ
53-
@variables x(t) y(t)
51+
## Van der Pol Equations
5452

55-
eqs = [D(y) ~ μ * ((1 - x^2) * y - x),
56-
D(x) ~ y]
57-
van = System(eqs, t; name = :van_der_pol) |> mtkcompile
53+
function vanderpol(du, u, p, t)
54+
x = u[1]
55+
y = u[2]
56+
μ = p[1]
57+
du[1] = y
58+
du[2] = μ * ((1 - x^2) * y - x)
59+
end
5860

5961
"""
6062
Van der Pol Equations
@@ -66,12 +68,11 @@ Van der Pol Equations
6668
\\frac{dy}{dt} = μ((1-x^2)y -x)
6769
```
6870
69-
with ``μ=1.0`` and ``u_0=[x => \\sqrt{3}, y => 0]``
71+
with ``μ=1.0`` and ``u_0=[\\sqrt{3}, 0]`` (where ``u[1] = x``, ``u[2] = y``)
7072
7173
Non-stiff parameters.
7274
"""
73-
prob_ode_vanderpol = ODEProblem(van, [y => 0, x => sqrt(3), μ => 1.0], (0.0, 1.0),
74-
jac = true, eval_module = @__MODULE__)
75+
prob_ode_vanderpol = ODEProblem(vanderpol, [sqrt(3), 0.0], (0.0, 1.0), [1.0])
7576

7677
"""
7778
Van der Pol Equations
@@ -83,21 +84,25 @@ Van der Pol Equations
8384
\\frac{dy}{dt} = μ((1-x^2)y -x)
8485
```
8586
86-
with ``μ=10^6`` and ``u_0=[x => \\sqrt{3}, y => 0]``
87+
with ``μ=10^6`` and ``u_0=[\\sqrt{3}, 0]`` (where ``u[1] = x``, ``u[2] = y``)
8788
8889
Stiff parameters.
8990
"""
90-
prob_ode_vanderpol_stiff = ODEProblem(van, [y => 0, x => sqrt(3), μ => 1e6], (0.0, 1.0),
91-
jac = true, eval_module = @__MODULE__)
92-
93-
# ROBER
94-
@parameters k₁ k₂ k₃
95-
@variables y₁(t) y₂(t) y₃(t)
96-
97-
eqs = [D(y₁) ~ -k₁ * y₁ + k₃ * y₂ * y₃,
98-
D(y₂) ~ k₁ * y₁ - k₂ * y₂^2 - k₃ * y₂ * y₃,
99-
D(y₃) ~ k₂ * y₂^2]
100-
rober = System(eqs, t; name = :rober) |> mtkcompile
91+
prob_ode_vanderpol_stiff = ODEProblem(vanderpol, [sqrt(3), 0.0], (0.0, 1.0), [1e6])
92+
93+
## ROBER
94+
95+
function rober(du, u, p, t)
96+
y₁ = u[1]
97+
y₂ = u[2]
98+
y₃ = u[3]
99+
k₁ = p[1]
100+
k₂ = p[2]
101+
k₃ = p[3]
102+
du[1] = -k₁ * y₁ + k₃ * y₂ * y₃
103+
du[2] = k₁ * y₁ - k₂ * y₂^2 - k₃ * y₂ * y₃
104+
du[3] = k₂ * y₂^2
105+
end
101106

102107
"""
103108
The Robertson biochemical reactions: (Stiff)
@@ -118,9 +123,7 @@ Hairer Norsett Wanner Solving Ordinary Differential Equations I - Nonstiff Probl
118123
119124
Usually solved on ``[0,1e11]``
120125
"""
121-
prob_ode_rober = ODEProblem(
122-
rober, [[y₁, y₂, y₃] .=> [1.0; 0.0; 0.0]; [k₁, k₂, k₃] .=> (0.04, 3e7, 1e4)],
123-
(0.0, 1e11), jac = true, eval_module = @__MODULE__)
126+
prob_ode_rober = ODEProblem(rober, [1.0, 0.0, 0.0], (0.0, 1e11), [0.04, 3e7, 1e4])
124127

125128
# Three Body
126129
const threebody_μ = big(0.012277471);
@@ -174,15 +177,19 @@ prob_ode_threebody = ODEProblem(threebody,
174177
[0.994, 0.0, 0.0, big(-2.00158510637908252240537862224)],
175178
(big(0.0), big(17.0652165601579625588917206249)))
176179

177-
# Rigid Body Equations
178-
179-
@parameters I₁ I₂ I₃
180-
@variables y₁(t) y₂(t) y₃(t)
181-
182-
eqs = [D(y₁) ~ I₁ * y₂ * y₃,
183-
D(y₂) ~ I₂ * y₁ * y₃,
184-
D(y₃) ~ I₃ * y₁ * y₂]
185-
rigid = System(eqs, t; name = :rigid_body) |> mtkcompile
180+
## Rigid Body Equations
181+
182+
function rigidbody(du, u, p, t)
183+
y₁ = u[1]
184+
y₂ = u[2]
185+
y₃ = u[3]
186+
I₁ = p[1]
187+
I₂ = p[2]
188+
I₃ = p[3]
189+
du[1] = I₁ * y₂ * y₃
190+
du[2] = I₂ * y₁ * y₃
191+
du[3] = I₃ * y₁ * y₂
192+
end
186193

187194
"""
188195
Rigid Body Equations (Non-stiff)
@@ -207,10 +214,7 @@ or Hairer Norsett Wanner Solving Ordinary Differential Equations I - Nonstiff Pr
207214
208215
Usually solved from 0 to 20.
209216
"""
210-
prob_ode_rigidbody = ODEProblem(
211-
rigid, [[y₁, y₂, y₃] .=> [1.0, 0.0, 0.9]; [I₁, I₂, I₃] .=> (-2.0, 1.25, -0.5)],
212-
(0.0, 20.0),
213-
jac = true, eval_module = @__MODULE__)
217+
prob_ode_rigidbody = ODEProblem(rigidbody, [1.0, 0.0, 0.9], (0.0, 20.0), [-2.0, 1.25, -0.5])
214218

215219
# Pleiades Problem
216220

@@ -356,28 +360,27 @@ mm_f = ODEFunction(mm_linear; analytic = (u0, p, t) -> exp(inv(MM_linear) * mm_A
356360
mass_matrix = MM_linear)
357361
prob_ode_mm_linear = ODEProblem(mm_f, rand(4), (0.0, 1.0))
358362

359-
@parameters p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
360-
@variables y1(t) y2(t) y3(t) y4(t) y5(t) y6(t) y7(t) y8(t)
361-
362-
eqs = [D(y1) ~ -p1 * y1 + p2 * y2 + p3 * y3 + p4,
363-
D(y2) ~ p1 * y1 - p5 * y2,
364-
D(y3) ~ -p6 * y3 + p2 * y4 + p7 * y5,
365-
D(y4) ~ p3 * y2 + p1 * y3 - p8 * y4,
366-
D(y5) ~ -p9 * y5 + p2 * y6 + p2 * y7,
367-
D(y6) ~ -p10 * y6 * y8 + p11 * y4 + p1 * y5 -
368-
p2 * y6 + p11 * y7,
369-
D(y7) ~ p10 * y6 * y8 - p12 * y7,
370-
D(y8) ~ -p10 * y6 * y8 + p12 * y7]
371-
hires = System(eqs, t; name = :hires) |> mtkcompile
363+
## Hires Problem
364+
365+
function hires(du, u, p, t)
366+
y1, y2, y3, y4, y5, y6, y7, y8 = u
367+
p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 = p
368+
369+
du[1] = -p1 * y1 + p2 * y2 + p3 * y3 + p4
370+
du[2] = p1 * y1 - p5 * y2
371+
du[3] = -p6 * y3 + p2 * y4 + p7 * y5
372+
du[4] = p3 * y2 + p1 * y3 - p8 * y4
373+
du[5] = -p9 * y5 + p2 * y6 + p2 * y7
374+
du[6] = -p10 * y6 * y8 + p11 * y4 + p1 * y5 - p2 * y6 + p11 * y7
375+
du[7] = p10 * y6 * y8 - p12 * y7
376+
du[8] = -p10 * y6 * y8 + p12 * y7
377+
end
372378

373379
u0 = zeros(8)
374380
u0[1] = 1
375381
u0[8] = 0.0057
376382

377-
u0 = [y1, y2, y3, y4, y5, y6, y7, y8] .=> u0
378-
p = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11,
379-
p12] .=> (1.71, 0.43, 8.32, 0.0007, 8.75,
380-
10.03, 0.035, 1.12, 1.745, 280.0, 0.69, 1.81)
383+
p = (1.71, 0.43, 8.32, 0.0007, 8.75, 10.03, 0.035, 1.12, 1.745, 280.0, 0.69, 1.81)
381384

382385
"""
383386
Hires Problem (Stiff)
@@ -401,16 +404,18 @@ where ``f`` is defined by
401404
Reference: [demohires.pdf](http://www.radford.edu/~thompson/vodef90web/problems/demosnodislin/Demos_Pitagora/DemoHires/demohires.pdf)
402405
Notebook: [Hires.ipynb](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Hires.ipynb)
403406
"""
404-
prob_ode_hires = ODEProblem(
405-
hires, [u0; p], (0.0, 321.8122), jac = true, eval_module = @__MODULE__)
407+
prob_ode_hires = ODEProblem(hires, u0, (0.0, 321.8122), p)
406408

407-
@parameters p1 p2 p3
408-
@variables y1(t) y2(t) y3(t)
409+
## Orego Problem
409410

410-
eqs = [D(y1) ~ p1 * (y2 + y1 * (1 - p2 * y1 - y2)),
411-
D(y2) ~ (y3 - (1 + y1) * y2) / p1,
412-
D(y3) ~ p3 * (y1 - y3)]
413-
orego = System(eqs, t; name = :orego) |> mtkcompile
411+
function orego(du, u, p, t)
412+
y1, y2, y3 = u
413+
p1, p2, p3 = p
414+
415+
du[1] = p1 * (y2 + y1 * (1 - p2 * y1 - y2))
416+
du[2] = (y3 - (1 + y1) * y2) / p1
417+
du[3] = p3 * (y1 - y3)
418+
end
414419

415420
"""
416421
Orego Problem (Stiff)
@@ -430,6 +435,4 @@ where ``s=77.27``, ``w=0.161`` and ``q=8.375⋅10^{-6}``.
430435
Reference: [demoorego.pdf](http://www.radford.edu/~thompson/vodef90web/problems/demosnodislin/Demos_Pitagora/DemoOrego/demoorego.pdf)
431436
Notebook: [Orego.ipynb](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Orego.ipynb)
432437
"""
433-
prob_ode_orego = ODEProblem(
434-
orego, [[y1, y2, y3] .=> [1.0, 2.0, 3.0]; [p1, p2, p3] .=> [77.27, 8.375e-6, 0.161]],
435-
(0.0, 30.0), jac = true, eval_module = @__MODULE__)
438+
prob_ode_orego = ODEProblem(orego, [1.0, 2.0, 3.0], (0.0, 30.0), [77.27, 8.375e-6, 0.161])

0 commit comments

Comments
 (0)