@@ -2,6 +2,8 @@ using BoundaryValueDiffEq, OrdinaryDiffEq
22using ModelingToolkit
33using ModelingToolkit: t_nounits as t, D_nounits as D
44
5+ solvers = [MIRK4, RadauIIa5, LobattoIIIa3]
6+
57@parameters α = 7.5 β = 4. γ = 8. δ = 5.
68@variables x (t) = 1. y (t) = 2.
79
@@ -13,20 +15,26 @@ parammap = [:α => 7.5, :β => 4, :γ => 8., :δ => 5.]
1315tspan = (0. , 10. )
1416
1517@mtkbuild lotkavolterra = ODESystem (eqs, t)
18+ op = ODEProblem (lotkavolterra, u0map, tspan, parammap)
19+ osol = solve (op, Vern9 ())
1620
17- bvp = SciMLBase. BVProblem {true, SciMLBase.AutoSpecialize} (lotkavolterra, u0map, tspan, parammap)
18- sol = solve (bvp, MIRK4 (), dt = 0.01 );
21+ bvp = SciMLBase. BVProblem {true, SciMLBase.AutoSpecialize} (lotkavolterra, u0map, tspan, parammap; eval_expression = true )
1922
20- bvp2 = SciMLBase. BVProblem {false, SciMLBase.AutoSpecialize} (lotkavolterra, u0map, tspan, parammap)
21- sol2 = solve (bvp, MIRK4 (), dt = 0.01 );
23+ for solver in solvers
24+ println (" $solver " )
25+ sol = solve (bvp, solver (), dt = 0.01 )
26+ @test isapprox (sol. u[end ], osol. u[end ]; atol = 0.01 )
27+ @test sol. u[1 ] == [1. , 2. ]
28+ end
2229
23- op = ODEProblem (lotkavolterra, u0map, tspan, parammap)
24- osol = solve (op, Vern9 () )
30+ # Test out of place
31+ bvp2 = SciMLBase . BVProblem {false, SciMLBase.AutoSpecialize} (lotkavolterra, u0map, tspan, parammap; eval_expression = true )
2532
26- @test isapprox (sol. u[end ],osol. u[end ]; atol = 0.01 )
27- @test isapprox (sol2. u[end ],osol. u[end ]; atol = 0.01 )
28- @test sol. u[1 ] == [1. , 2. ]
29- @test sol2. u[1 ] == [1. , 2. ]
33+ for solver in solvers
34+ sol = solve (bvp2, solver (), dt = 0.01 )
35+ @test isapprox (sol. u[end ],osol. u[end ]; atol = 0.01 )
36+ @test sol. u[1 ] == [1. , 2. ]
37+ end
3038
3139# ## Testing on pendulum
3240
@@ -38,19 +46,24 @@ eqs = [D(D(θ)) ~ -(g / L) * sin(θ)]
3846@mtkbuild pend = ODESystem (eqs, t)
3947
4048u0map = [θ => π/ 2 , D (θ) => π/ 2 ]
41- parammap = [:L => 2 . , :g => 9.81 ]
49+ parammap = [:L => 1 . , :g => 9.81 ]
4250tspan = (0. , 10. )
4351
52+ op = ODEProblem (pend, u0map, tspan, parammap)
53+ osol = solve (op, Vern9 ())
54+
4455bvp = SciMLBase. BVProblem {true, SciMLBase.AutoSpecialize} (pend, u0map, tspan, parammap)
45- sol = solve (bvp, MIRK4 (), dt = 0.01 );
56+ for solver in solvers
57+ sol = solve (bvp2, solver (), dt = 0.01 )
58+ @test isapprox (sol. u[end ],osol. u[end ]; atol = 0.01 )
59+ @test sol. u[1 ] == [π/ 2 , π/ 2 ]
60+ end
4661
62+ # Test out-of-place
4763bvp2 = SciMLBase. BVProblem {false, SciMLBase.FullSpecialize} (pend, u0map, tspan, parammap)
48- sol2 = solve (bvp2, MIRK4 (), dt = 0.01 );
49-
50- op = ODEProblem (pend, u0map, tspan, parammap)
51- osol = solve (op, Vern9 ())
5264
53- @test isapprox (sol. u[end ], osol. u[end ]; atol = 0.01 )
54- @test sol. u[1 ] == [π/ 2 , π/ 2 ]
55- @test isapprox (sol2. u[end ], osol. u[end ]; atol = 0.01 )
56- @test sol2. u[1 ] == [π/ 2 , π/ 2 ]
65+ for solver in solvers
66+ sol = solve (bvp2, solver (), dt = 0.01 )
67+ @test isapprox (sol. u[end ],osol. u[end ]; atol = 0.01 )
68+ @test sol. u[1 ] == [π/ 2 , π/ 2 ]
69+ end
0 commit comments