@@ -99,10 +99,10 @@ function generate_jacobian(sys::ODESystem; version::FunctionVersion = ArrayFunct
9999 return build_function (jac, sys. dvs, sys. ps, (sys. iv. name,); version = version)
100100end
101101
102- struct DiffEqToExpr
102+ struct ODEToExpr
103103 sys:: ODESystem
104104end
105- function (f:: DiffEqToExpr )(O:: Operation )
105+ function (f:: ODEToExpr )(O:: Operation )
106106 if isa (O. op, Variable)
107107 isequal (O. op, f. sys. iv) && return O. op. name # independent variable
108108 O. op ∈ f. sys. dvs && return O. op. name # dependent variables
@@ -111,41 +111,39 @@ function (f::DiffEqToExpr)(O::Operation)
111111 end
112112 return build_expr (:call , Any[O. op; f .(O. args)])
113113end
114- (f:: DiffEqToExpr )(x) = convert (Expr, x)
114+ (f:: ODEToExpr )(x) = convert (Expr, x)
115115
116116function generate_function (sys:: ODESystem , dvs, ps; version:: FunctionVersion = ArrayFunction)
117117 rhss = [deq. rhs for deq ∈ sys. eqs]
118118 dvs′ = [clean (dv) for dv ∈ dvs]
119119 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)
121121end
122122
123123
124- function generate_ode_iW (sys:: ODESystem , simplify= true ; version:: FunctionVersion = ArrayFunction)
124+ function generate_factorized_W (sys:: ODESystem , simplify= true ; version:: FunctionVersion = ArrayFunction)
125125 jac = calculate_jacobian (sys)
126126
127127 gam = Variable (:gam ; known = true )()
128128
129129 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
132131
133132 if simplify
134- iW = simplify_constants .(iW )
133+ Wfact = simplify_constants .(Wfact )
135134 end
136135
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
140138 if simplify
141- iW_t = simplify_constants .(iW_t )
139+ Wfact_t = simplify_constants .(Wfact_t )
142140 end
143141
144142 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)
147145
148- return (iW_func, iW_t_func )
146+ return (Wfact_func, Wfact_t_func )
149147end
150148
151149function DiffEqBase. ODEFunction (sys:: ODESystem , dvs, ps; version:: FunctionVersion = ArrayFunction)
0 commit comments