@@ -19,18 +19,20 @@ Takes a Nth order ODESystem and returns a new ODESystem written in first order
19
19
form by defining new variables which represent the N-1 derivatives.
20
20
"""
21
21
function ode_order_lowering (sys:: ODESystem )
22
- eqs_lowered, new_vars = ode_order_lowering (sys. eqs , sys. iv)
23
- ODESystem (eqs_lowered, sys. iv, vcat ( new_vars, states (sys)) , sys. ps)
22
+ eqs_lowered, new_vars = ode_order_lowering (equations ( sys) , sys. iv, states (sys) )
23
+ return ODESystem (eqs_lowered, sys. iv, new_vars, sys. ps)
24
24
end
25
25
26
- function ode_order_lowering (eqs, iv)
26
+ function ode_order_lowering (eqs, iv, states )
27
27
var_order = Dict {Variable,Int} ()
28
28
vars = Variable[]
29
29
new_eqs = Equation[]
30
30
new_vars = Variable[]
31
+ D = Differential (iv ())
31
32
32
- for (i, eq) ∈ enumerate (eqs)
33
+ for (i, (eq, ss)) ∈ enumerate (zip ( eqs, states) )
33
34
if isequal (eq. lhs, Constant (0 ))
35
+ push! (new_vars, ss)
34
36
push! (new_eqs, eq)
35
37
else
36
38
var, maxorder = var_from_nested_derivative (eq. lhs)
@@ -40,7 +42,8 @@ function ode_order_lowering(eqs, iv)
40
42
end
41
43
var′ = lower_varname (var, iv, maxorder - 1 )
42
44
rhs′ = rename_lower_order (eq. rhs)
43
- push! (new_eqs,Differential (iv ())(var′ (iv ())) ~ rhs′)
45
+ push! (new_vars, var′)
46
+ push! (new_eqs, D (var′ (iv ())) ~ rhs′)
44
47
end
45
48
end
46
49
@@ -49,7 +52,7 @@ function ode_order_lowering(eqs, iv)
49
52
for o in (order- 1 ): - 1 : 1
50
53
lvar = lower_varname (var, iv, o- 1 )
51
54
rvar = lower_varname (var, iv, o)
52
- push! (new_vars, rvar )
55
+ push! (new_vars, lvar )
53
56
54
57
rhs = rvar (iv ())
55
58
eq = Differential (iv ())(lvar (iv ())) ~ rhs
0 commit comments