@@ -7,53 +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- 0 ~ 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+ ]
1316
14- lorenz1 = ODESystem (eqs,t,[x,y,z,a],[σ,ρ,β],name= :lorenz1 )
17+ lorenz1 = ODESystem (eqs,t,[u, x,y,z,a],[σ,ρ,β],name= :lorenz1 )
1518
1619lorenz1_aliased = alias_elimination (lorenz1)
17- @test length (equations (lorenz1_aliased)) == 3
18- @test length (states (lorenz1_aliased)) == 3
19-
20- eqs = [D (x) ~ σ* (y- x),
21- D (y) ~ x* (ρ- z)- y,
22- D (z) ~ x* y - β* z]
23-
24- @test lorenz1_aliased == ODESystem (eqs,t,[x,y,z],[σ,ρ,β],observed= [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+ ])
2532
2633# Multi-System Reduction
2734
28- eqs1 = [D (x) ~ σ* (y- x) + F,
29- D (y) ~ x* (ρ- z)- u,
30- D (z) ~ x* y - β* z]
31-
32- aliases = [u ~ x + y - z]
33-
34- lorenz1 = ODESystem (eqs1,pins= [F],observed= aliases,name= :lorenz1 )
35-
36- eqs2 = [D (x) ~ F,
37- D (y) ~ x* (ρ- z)- x,
38- D (z) ~ 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+ ]
3941
40- aliases2 = [u ~ x - y - z]
42+ lorenz1 = ODESystem (eqs1,pins = [F],name = :lorenz1 )
4143
42- lorenz2 = ODESystem (eqs2,pins= [F],observed= aliases2,name= :lorenz2 )
44+ eqs2 = [
45+ D (x) ~ F,
46+ D (y) ~ x* (ρ- z)- x,
47+ D (z) ~ x* y - β* z,
48+ u ~ x - y - z
49+ ]
4350
44- connections = [lorenz1. F ~ lorenz2. u,
45- lorenz2. F ~ lorenz1. u]
51+ lorenz2 = ODESystem (eqs2,pins= [F],name= :lorenz2 )
4652
47- connected = ODESystem ([0 ~ a + lorenz1. x - lorenz2. y],t,[a],[],observed= connections,systems= [lorenz1,lorenz2])
48-
49- # Reduced Unflattened System
50- #=
51-
52- connections2 = [lorenz1.F ~ lorenz2.u,
53- lorenz2.F ~ lorenz1.u,
54- a ~ -lorenz1.x + lorenz2.y]
55- connected = ODESystem(Equation[],t,[],[],observed=connections2,systems=[lorenz1,lorenz2])
56- =#
53+ connected = ODESystem ([lorenz2. y ~ a + lorenz1. x,
54+ lorenz1. F ~ lorenz2. u,
55+ lorenz2. F ~ lorenz1. u],t,[a],[],systems= [lorenz1,lorenz2])
5756
5857# Reduced Flattened System
5958
@@ -62,6 +61,7 @@ flattened_system = ModelingToolkit.flatten(connected)
6261aliased_flattened_system = alias_elimination (flattened_system)
6362
6463@test isequal (states (aliased_flattened_system), [
64+ a
6565 lorenz1. x
6666 lorenz1. y
6767 lorenz1. z
@@ -80,22 +80,24 @@ aliased_flattened_system = alias_elimination(flattened_system)
8080 lorenz2. β
8181 ]) |> isempty
8282
83- test_equal .(equations (aliased_flattened_system), [
84- D (lorenz1. x) ~ lorenz1. σ* (lorenz1. y- lorenz1. x) + lorenz2. x - lorenz2. y - lorenz2. z,
85- D (lorenz1. y) ~ lorenz1. x* (lorenz1. ρ- lorenz1. z)- (lorenz1. x + lorenz1. y - lorenz1. z),
86- D (lorenz1. z) ~ lorenz1. x* lorenz1. y - lorenz1. β* lorenz1. z,
87- D (lorenz2. x) ~ lorenz1. x + lorenz1. y - lorenz1. z,
88- D (lorenz2. y) ~ lorenz2. x* (lorenz2. ρ- lorenz2. z)- lorenz2. x,
89- D (lorenz2. z) ~ lorenz2. x* lorenz2. y - lorenz2. β* lorenz2. z])
90-
91- test_equal .(observed (aliased_flattened_system), [
92- lorenz1. F ~ lorenz2. x + - 1 * (lorenz2. y + lorenz2. z),
93- lorenz1. u ~ lorenz1. x + lorenz1. y + - 1 * lorenz1. z,
94- lorenz2. F ~ lorenz1. x + lorenz1. y + - 1 * lorenz1. z,
95- a ~ lorenz2. y + - 1 * lorenz1. x,
96- lorenz2. u ~ lorenz2. x + - 1 * (lorenz2. y + lorenz2. z),
97- ])
98-
83+ reduced_eqs = [
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,
86+ D (lorenz1. y) ~ lorenz1. x* (lorenz1. ρ- lorenz1. z)- (lorenz1. x + lorenz1. y - lorenz1. z),
87+ D (lorenz1. z) ~ lorenz1. x* lorenz1. y - lorenz1. β* lorenz1. z,
88+ D (lorenz2. x) ~ lorenz1. x + lorenz1. y - lorenz1. z,
89+ D (lorenz2. y) ~ lorenz2. x* (lorenz2. ρ- lorenz2. z)- lorenz2. x,
90+ D (lorenz2. z) ~ lorenz2. x* lorenz2. y - lorenz2. β* lorenz2. z
91+ ]
92+ test_equal .(equations (aliased_flattened_system), reduced_eqs)
93+
94+ observed_eqs = [
95+ lorenz1. F ~ lorenz2. u,
96+ lorenz2. F ~ lorenz1. u,
97+ lorenz1. u ~ lorenz1. x + lorenz1. y - lorenz1. z,
98+ lorenz2. u ~ lorenz2. x - lorenz2. y - lorenz2. z,
99+ ]
100+ test_equal .(observed (aliased_flattened_system), observed_eqs)
99101
100102# issue #578
101103
0 commit comments