@@ -99,10 +99,10 @@ function generate_jacobian(sys::ODESystem; version::FunctionVersion = ArrayFunct
99
99
return build_function (jac, sys. dvs, sys. ps, (sys. iv. name,); version = version)
100
100
end
101
101
102
- struct DiffEqToExpr
102
+ struct ODEToExpr
103
103
sys:: ODESystem
104
104
end
105
- function (f:: DiffEqToExpr )(O:: Operation )
105
+ function (f:: ODEToExpr )(O:: Operation )
106
106
if isa (O. op, Variable)
107
107
isequal (O. op, f. sys. iv) && return O. op. name # independent variable
108
108
O. op ∈ f. sys. dvs && return O. op. name # dependent variables
@@ -111,41 +111,39 @@ function (f::DiffEqToExpr)(O::Operation)
111
111
end
112
112
return build_expr (:call , Any[O. op; f .(O. args)])
113
113
end
114
- (f:: DiffEqToExpr )(x) = convert (Expr, x)
114
+ (f:: ODEToExpr )(x) = convert (Expr, x)
115
115
116
116
function generate_function (sys:: ODESystem , dvs, ps; version:: FunctionVersion = ArrayFunction)
117
117
rhss = [deq. rhs for deq ∈ sys. eqs]
118
118
dvs′ = [clean (dv) for dv ∈ dvs]
119
119
ps′ = [clean (p) for p ∈ ps]
120
- return build_function (rhss, dvs′, ps′, (sys. iv. name,), DiffEqToExpr (sys); version = version)
120
+ return build_function (rhss, dvs′, ps′, (sys. iv. name,), ODEToExpr (sys); version = version)
121
121
end
122
122
123
123
124
- function generate_ode_iW (sys:: ODESystem , simplify= true ; version:: FunctionVersion = ArrayFunction)
124
+ function generate_factorized_W (sys:: ODESystem , simplify= true ; version:: FunctionVersion = ArrayFunction)
125
125
jac = calculate_jacobian (sys)
126
126
127
127
gam = Variable (:gam ; known = true )()
128
128
129
129
W = LinearAlgebra. I - gam* jac
130
- W = SMatrix {size(W,1),size(W,2)} (W)
131
- iW = inv (W)
130
+ Wfact = lu (W, Val (false ), check= false ). factors
132
131
133
132
if simplify
134
- iW = simplify_constants .(iW )
133
+ Wfact = simplify_constants .(Wfact )
135
134
end
136
135
137
- W = inv (LinearAlgebra. I/ gam - jac)
138
- W = SMatrix {size(W,1),size(W,2)} (W)
139
- iW_t = inv (W)
136
+ W_t = LinearAlgebra. I/ gam - jac
137
+ Wfact_t = lu (W_t, Val (false ), check= false ). factors
140
138
if simplify
141
- iW_t = simplify_constants .(iW_t )
139
+ Wfact_t = simplify_constants .(Wfact_t )
142
140
end
143
141
144
142
vs, ps = sys. dvs, sys. ps
145
- iW_func = build_function (iW , vs, ps, (:gam ,:t ); version = version)
146
- iW_t_func = build_function (iW_t , vs, ps, (:gam ,:t ); version = version)
143
+ Wfact_func = build_function (Wfact , vs, ps, (:gam ,:t ), ODEToExpr (sys ); version = version)
144
+ Wfact_t_func = build_function (Wfact_t , vs, ps, (:gam ,:t ), ODEToExpr (sys ); version = version)
147
145
148
- return (iW_func, iW_t_func )
146
+ return (Wfact_func, Wfact_t_func )
149
147
end
150
148
151
149
function DiffEqBase. ODEFunction (sys:: ODESystem , dvs, ps; version:: FunctionVersion = ArrayFunction)
0 commit comments