@@ -29,20 +29,21 @@ D = Differential(t)
29
29
30
30
test_equal (a, b) = @test isequal (simplify (a, polynorm= true ), simplify (b, polynorm= true ))
31
31
32
- eqs = [D (x) ~ σ* (y- x),
33
- D (y) ~ x* (ρ- z)- y + β,
34
- 0 ~ sin (z) - x + y,
35
- sin (u) ~ x + y,
36
- 2 β ~ 2 ,
37
- x ~ a,
32
+ eqs = [
33
+ D (x) ~ σ* (y- x)
34
+ D (y) ~ x* (ρ- z)- y + β
35
+ 0 ~ sin (z) - x + y
36
+ sin (u) ~ x + y
37
+ 2 β ~ 2
38
+ x ~ a
38
39
]
39
40
40
- lorenz1 = ODESystem (eqs,t,[u,x,y,z,a],[σ,ρ,β], name= :lorenz1 )
41
+ lorenz1 = ODESystem (eqs,t,name= :lorenz1 )
41
42
42
43
lorenz1_aliased = alias_elimination (lorenz1)
43
44
reduced_eqs = [
44
45
D (x) ~ σ * (y - x),
45
- D (y) ~ x* (ρ- z)- y + 1 ,
46
+ D (y) ~ x* (ρ- z)- y + β ,
46
47
0 ~ sin (z) - x + y,
47
48
0 ~ x + y - sin (u),
48
49
]
@@ -62,63 +63,57 @@ eqs1 = [
62
63
u ~ x + y - z,
63
64
]
64
65
65
- lorenz1 = ODESystem (eqs1,pins= [F],name= :lorenz1 )
66
-
67
- eqs2 = [
68
- D (x) ~ F,
69
- D (y) ~ x* (ρ- z)- x,
70
- D (z) ~ x* y - β* z,
71
- u ~ x - y - z
72
- ]
73
-
74
- lorenz2 = ODESystem (eqs2,pins= [F],name= :lorenz2 )
66
+ lorenz = name -> ODESystem (eqs1,t,pins= [F],name= name)
67
+ lorenz1 = lorenz (:lorenz1 )
68
+ lorenz2 = lorenz (:lorenz2 )
75
69
76
- connected = ODESystem ([lorenz2. y ~ a + lorenz1. x,
77
- lorenz1. F ~ lorenz2. u,
78
- lorenz2. F ~ lorenz1. u],t,[a],[],systems= [lorenz1,lorenz2])
70
+ connected = ODESystem ([s ~ a + lorenz1. x
71
+ lorenz2. y ~ s
72
+ lorenz1. F ~ lorenz2. u
73
+ lorenz2. F ~ lorenz1. u],t,systems= [lorenz1,lorenz2])
79
74
80
75
# Reduced Flattened System
81
76
82
77
flattened_system = ModelingToolkit. flatten (connected)
83
78
84
79
aliased_flattened_system = alias_elimination (flattened_system)
85
80
86
- @test isequal (states (aliased_flattened_system), [
81
+ @test setdiff (states (aliased_flattened_system), [
87
82
a
88
83
lorenz1. x
89
84
lorenz1. y
90
85
lorenz1. z
91
86
lorenz2. x
92
87
lorenz2. y
93
88
lorenz2. z
94
- ])
89
+ ]) |> isempty
95
90
96
91
@test setdiff (parameters (aliased_flattened_system), [
97
92
lorenz1. σ
98
93
lorenz1. ρ
99
94
lorenz1. β
100
- lorenz1. F
101
- lorenz2. F
95
+ lorenz2. σ
102
96
lorenz2. ρ
103
97
lorenz2. β
104
98
]) |> isempty
105
99
106
100
reduced_eqs = [
107
- 0 ~ a + lorenz1 . x - lorenz2. y, # irreducible by alias elimination
108
- D (lorenz1. x) ~ lorenz1. σ* (lorenz1. y- lorenz1 . x) + lorenz2 . x - lorenz2 . y - lorenz2 . z,
109
- D (lorenz1. y) ~ lorenz1. x* (lorenz1. ρ- lorenz1 . z) - (lorenz1 . x + lorenz1 . y - lorenz1 . z),
110
- D (lorenz1. z) ~ lorenz1. x* lorenz1. y - lorenz1 . β* lorenz1. z,
111
- D (lorenz2. x) ~ lorenz1 . x + lorenz1 . y - lorenz1 . z,
112
- D (lorenz2. y) ~ lorenz2. x* (lorenz2. ρ- lorenz2 . z)- lorenz2 . x,
113
- D (lorenz2. z) ~ lorenz2. x* lorenz2. y - lorenz2 . β* lorenz2. z
101
+ 0 ~ s - lorenz2. y
102
+ D (lorenz1. x) ~ lorenz1. F + lorenz1 . σ* (lorenz1. y + - 1 lorenz1 . x)
103
+ D (lorenz1. y) ~ - 1 lorenz1 . u + lorenz1. x* (lorenz1. ρ + - 1 lorenz1 . z)
104
+ D (lorenz1. z) ~ lorenz1. x* lorenz1. y + - 1 lorenz1 . β* lorenz1. z
105
+ D (lorenz2. x) ~ lorenz2 . F + lorenz2 . σ * (lorenz2 . y + - 1 lorenz2 . x)
106
+ D (lorenz2. y) ~ - 1 lorenz2 . u + lorenz2. x* (lorenz2. ρ + - 1 lorenz2 . z)
107
+ D (lorenz2. z) ~ lorenz2. x* lorenz2. y + - 1 lorenz2 . β* lorenz2. z
114
108
]
115
109
test_equal .(equations (aliased_flattened_system), reduced_eqs)
116
110
117
111
observed_eqs = [
118
- lorenz1. F ~ lorenz2. u,
119
- lorenz2. F ~ lorenz1. u,
120
- lorenz1. u ~ lorenz1. x + lorenz1. y - lorenz1. z,
121
- lorenz2. u ~ lorenz2. x - lorenz2. y - lorenz2. z,
112
+ s ~ a + lorenz1. x
113
+ lorenz1. u ~ lorenz1. x + lorenz1. y - lorenz1. z
114
+ lorenz2. u ~ lorenz2. x + lorenz2. y - lorenz2. z
115
+ lorenz2. F ~ lorenz1. u
116
+ lorenz1. F ~ lorenz2. u
122
117
]
123
118
test_equal .(observed (aliased_flattened_system), observed_eqs)
124
119
@@ -131,10 +126,10 @@ let
131
126
D (x) ~ x + y
132
127
x ~ y
133
128
]
134
- sys = ODESystem (eqs, t, [x], [] )
129
+ sys = ODESystem (eqs, t)
135
130
asys = alias_elimination (flatten (sys))
136
131
137
- test_equal .(asys. eqs, [D (x) ~ 2 x ])
132
+ test_equal .(asys. eqs, [D (x) ~ x + y ])
138
133
test_equal .(asys. observed, [y ~ x])
139
134
end
140
135
@@ -149,17 +144,17 @@ let
149
144
@parameters k_P
150
145
pc = ODESystem (Equation[u_c ~ k_P * y_c], t, pins= [y_c], name= :pc )
151
146
connections = [
152
- ol. u ~ pc. u_c,
147
+ ol. u ~ pc. u_c
153
148
pc. y_c ~ ol. y
154
149
]
155
150
connected = ODESystem (connections, t, systems= [ol, pc])
156
151
@test equations (connected) isa Vector{Equation}
157
152
sys = flatten (connected)
158
153
reduced_sys = alias_elimination (sys)
159
154
ref_eqs = [
160
- D (ol. x) ~ ol. a* ol. x + ol. b* pc . u_c
161
- 0 ~ ol. c* ol. x + ol. d* pc . u_c - ol . y
162
- 0 ~ pc. k_P* ol . y - pc . u_c
155
+ D (ol. x) ~ ol. a* ol. x + ol. b* ol . u
156
+ 0 ~ ol. c* ol. x + ol. d* ol . u + - 1 ol . y
157
+ 0 ~ pc. k_P* pc . y_c + - 1 pc . u_c
163
158
]
164
159
@test ref_eqs == equations (reduced_sys)
165
160
end
0 commit comments