@@ -119,28 +119,34 @@ function ODESystem(eqs, iv=nothing; kwargs...)
119
119
end
120
120
iv === nothing && throw (ArgumentError (" Please pass in independent variables." ))
121
121
for eq in eqs
122
- for var in vars (eq. rhs for eq ∈ eqs)
123
- if isparameter (var) || isparameter (var. op)
124
- isequal (var, iv) || push! (ps, var)
125
- else
126
- push! (allstates, var)
127
- end
128
- end
129
- if ! (eq. lhs isa Symbolic)
130
- push! (algeeq, eq)
131
- else
132
- diffvar = first (var_from_nested_derivative (eq. lhs))
122
+ collect_vars! (allstates, ps, eq. lhs, iv)
123
+ collect_vars! (allstates, ps, eq. rhs, iv)
124
+ if isdiffeq (eq)
125
+ diffvar, _ = var_from_nested_derivative (eq. lhs)
133
126
isequal (iv, iv_from_nested_derivative (eq. lhs)) || throw (ArgumentError (" An ODESystem can only have one independent variable." ))
134
127
diffvar in diffvars && throw (ArgumentError (" The differential variable $diffvar is not unique in the system of equations." ))
135
128
push! (diffvars, diffvar)
136
129
push! (diffeq, eq)
130
+ else
131
+ push! (algeeq, eq)
137
132
end
138
133
end
139
134
algevars = setdiff (allstates, diffvars)
140
135
# the orders here are very important!
141
136
return ODESystem (append! (diffeq, algeeq), iv, vcat (collect (diffvars), collect (algevars)), ps; kwargs... )
142
137
end
143
138
139
+ function collect_vars! (states, parameters, expr, iv)
140
+ for var in vars (expr)
141
+ if isparameter (var) || isparameter (var. op)
142
+ isequal (var, iv) || push! (parameters, var)
143
+ else
144
+ push! (states, var)
145
+ end
146
+ end
147
+ return nothing
148
+ end
149
+
144
150
Base.:(== )(sys1:: ODESystem , sys2:: ODESystem ) =
145
151
_eq_unordered (sys1. eqs, sys2. eqs) && isequal (sys1. iv, sys2. iv) &&
146
152
_eq_unordered (sys1. states, sys2. states) && _eq_unordered (sys1. ps, sys2. ps)
0 commit comments