@@ -7,55 +7,52 @@ using ModelingToolkit, OrdinaryDiffEq, Test
7
7
test_equal (a, b) = @test isequal (simplify (a, polynorm= true ), simplify (b, polynorm= true ))
8
8
9
9
eqs = [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
+ ]
14
16
15
- lorenz1 = ODESystem (eqs,t,[x,y,z,a],[σ,ρ,β],name= :lorenz1 )
17
+ lorenz1 = ODESystem (eqs,t,[u, x,y,z,a],[σ,ρ,β],name= :lorenz1 )
16
18
17
19
lorenz1_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
+ ])
27
32
28
33
# Multi-System Reduction
29
34
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
+ ]
35
41
36
- lorenz1 = ODESystem (eqs1,pins= [F],observed = aliases, name= :lorenz1 )
42
+ lorenz1 = ODESystem (eqs1,pins= [F],name= :lorenz1 )
37
43
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
+ ]
41
50
42
- aliases2 = [u ~ x - y - z]
51
+ lorenz2 = ODESystem (eqs2,pins = [F],name = :lorenz2 )
43
52
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])
59
56
60
57
# Reduced Flattened System
61
58
@@ -64,6 +61,7 @@ flattened_system = ModelingToolkit.flatten(connected)
64
61
aliased_flattened_system = alias_elimination (flattened_system)
65
62
66
63
@test isequal (states (aliased_flattened_system), [
64
+ a
67
65
lorenz1. x
68
66
lorenz1. y
69
67
lorenz1. z
@@ -83,25 +81,24 @@ aliased_flattened_system = alias_elimination(flattened_system)
83
81
]) |> isempty
84
82
85
83
reduced_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,
87
86
D (lorenz1. y) ~ lorenz1. x* (lorenz1. ρ- lorenz1. z)- (lorenz1. x + lorenz1. y - lorenz1. z),
88
87
D (lorenz1. z) ~ lorenz1. x* lorenz1. y - lorenz1. β* lorenz1. z,
89
88
D (lorenz2. x) ~ lorenz1. x + lorenz1. y - lorenz1. z,
90
89
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
92
91
]
93
92
test_equal .(equations (aliased_flattened_system), reduced_eqs)
94
93
95
94
observed_eqs = [
96
- lorenz2. y ~ a + lorenz1. x,
97
95
lorenz1. F ~ lorenz2. u,
98
96
lorenz2. F ~ lorenz1. u,
99
97
lorenz1. u ~ lorenz1. x + lorenz1. y - lorenz1. z,
100
98
lorenz2. u ~ lorenz2. x - lorenz2. y - lorenz2. z,
101
99
]
102
100
test_equal .(observed (aliased_flattened_system), observed_eqs)
103
101
104
-
105
102
# issue #578
106
103
107
104
let
0 commit comments