@@ -7,55 +7,52 @@ using ModelingToolkit, OrdinaryDiffEq, Test
77test_equal (a, b) = @test isequal (simplify (a, polynorm= true ), simplify (b, polynorm= true ))
88
99eqs = [D (x) ~ σ* (y- x),
10- D (y) ~ x* (ρ- z)- y,
11- D (z) ~ a* y - β* z,
12- β ~ 2 ,
13- x ~ a]
10+ D (y) ~ x* (ρ- z)- y + β,
11+ 0 ~ sin (z) - x + y,
12+ sin (u) ~ x + y,
13+ 2 β ~ 2 ,
14+ x ~ a,
15+ ]
1416
15- lorenz1 = ODESystem (eqs,t,[x,y,z,a],[σ,ρ,β],name= :lorenz1 )
17+ lorenz1 = ODESystem (eqs,t,[u, x,y,z,a],[σ,ρ,β],name= :lorenz1 )
1618
1719lorenz1_aliased = alias_elimination (lorenz1)
18- @test length (equations (lorenz1_aliased)) == 3
19- @test length (states (lorenz1_aliased)) == 3
20-
21- eqs = [D (x) ~ σ* (y- x),
22- D (y) ~ x* (ρ- z)- y,
23- D (z) ~ x* y - 2 * z]
24-
25- # TODO : maybe remove β from ps, or maybe don't allow this example on params
26- @test lorenz1_aliased == ODESystem (eqs,t,[x,y,z],[σ,ρ,β],observed= [β ~ 2 , a ~ x],name= :lorenz1 )
20+ reduced_eqs = [
21+ D (x) ~ σ * (y - x),
22+ D (y) ~ x* (ρ- z)- y + 1 ,
23+ 0 ~ sin (z) - x + y,
24+ sin (u) ~ x + y,
25+ ]
26+ test_equal .(equations (lorenz1_aliased), reduced_eqs)
27+ test_equal .(states (lorenz1_aliased), [u, x, y, z])
28+ test_equal .(observed (lorenz1_aliased), [
29+ β ~ 1 ,
30+ a ~ x,
31+ ])
2732
2833# Multi-System Reduction
2934
30- eqs1 = [D (x) ~ σ* (y- x) + F,
31- D (y) ~ x* (ρ- z)- u,
32- D (z) ~ x* y - β* z]
33-
34- aliases = [u ~ x + y - z]
35+ eqs1 = [
36+ D (x) ~ σ* (y- x) + F,
37+ D (y) ~ x* (ρ- z)- u,
38+ D (z) ~ x* y - β* z,
39+ u ~ x + y - z,
40+ ]
3541
36- lorenz1 = ODESystem (eqs1,pins= [F],observed = aliases, name= :lorenz1 )
42+ lorenz1 = ODESystem (eqs1,pins= [F],name= :lorenz1 )
3743
38- eqs2 = [D (x) ~ F,
39- D (y) ~ x* (ρ- z)- x,
40- D (z) ~ x* y - β* z]
44+ eqs2 = [
45+ D (x) ~ F,
46+ D (y) ~ x* (ρ- z)- x,
47+ D (z) ~ x* y - β* z,
48+ u ~ x - y - z
49+ ]
4150
42- aliases2 = [u ~ x - y - z]
51+ lorenz2 = ODESystem (eqs2,pins = [F],name = :lorenz2 )
4352
44- lorenz2 = ODESystem (eqs2,pins= [F],observed= aliases2,name= :lorenz2 )
45-
46- connections = [lorenz1. F ~ lorenz2. u,
47- lorenz2. F ~ lorenz1. u]
48-
49- connected = ODESystem ([lorenz2. y ~ a + lorenz1. x],t,[a],[],observed= connections,systems= [lorenz1,lorenz2])
50-
51- # Reduced Unflattened System
52- #=
53-
54- connections2 = [lorenz1.F ~ lorenz2.u,
55- lorenz2.F ~ lorenz1.u,
56- a ~ -lorenz1.x + lorenz2.y]
57- connected = ODESystem(Equation[],t,[],[],observed=connections2,systems=[lorenz1,lorenz2])
58- =#
53+ connected = ODESystem ([lorenz2. y ~ a + lorenz1. x,
54+ lorenz1. F ~ lorenz2. u,
55+ lorenz2. F ~ lorenz1. u],t,[a],[],systems= [lorenz1,lorenz2])
5956
6057# Reduced Flattened System
6158
@@ -64,6 +61,7 @@ flattened_system = ModelingToolkit.flatten(connected)
6461aliased_flattened_system = alias_elimination (flattened_system)
6562
6663@test isequal (states (aliased_flattened_system), [
64+ a
6765 lorenz1. x
6866 lorenz1. y
6967 lorenz1. z
@@ -83,25 +81,24 @@ aliased_flattened_system = alias_elimination(flattened_system)
8381 ]) |> isempty
8482
8583reduced_eqs = [
86- D (lorenz1. x) ~ lorenz1. σ* (lorenz1. y- lorenz1. x) + lorenz2. x - (a + lorenz1. x) - lorenz2. z,
84+ lorenz2. y ~ a + lorenz1. x, # irreducible by alias elimination
85+ D (lorenz1. x) ~ lorenz1. σ* (lorenz1. y- lorenz1. x) + lorenz2. x - lorenz2. y - lorenz2. z,
8786 D (lorenz1. y) ~ lorenz1. x* (lorenz1. ρ- lorenz1. z)- (lorenz1. x + lorenz1. y - lorenz1. z),
8887 D (lorenz1. z) ~ lorenz1. x* lorenz1. y - lorenz1. β* lorenz1. z,
8988 D (lorenz2. x) ~ lorenz1. x + lorenz1. y - lorenz1. z,
9089 D (lorenz2. y) ~ lorenz2. x* (lorenz2. ρ- lorenz2. z)- lorenz2. x,
91- D (lorenz2. z) ~ lorenz2. x* (a + lorenz1 . x) - lorenz2. β* lorenz2. z
90+ D (lorenz2. z) ~ lorenz2. x* lorenz2 . y - lorenz2. β* lorenz2. z
9291 ]
9392test_equal .(equations (aliased_flattened_system), reduced_eqs)
9493
9594observed_eqs = [
96- lorenz2. y ~ a + lorenz1. x,
9795 lorenz1. F ~ lorenz2. u,
9896 lorenz2. F ~ lorenz1. u,
9997 lorenz1. u ~ lorenz1. x + lorenz1. y - lorenz1. z,
10098 lorenz2. u ~ lorenz2. x - lorenz2. y - lorenz2. z,
10199 ]
102100test_equal .(observed (aliased_flattened_system), observed_eqs)
103101
104-
105102# issue #578
106103
107104let
0 commit comments