1
- struct DiffEqSystem <: AbstractSystem
1
+ mutable struct DiffEqSystem <: AbstractSystem
2
2
eqs:: Vector{Operation}
3
3
ivs:: Vector{Variable}
4
4
dvs:: Vector{Variable}
@@ -7,13 +7,14 @@ struct DiffEqSystem <: AbstractSystem
7
7
iv_name:: Symbol
8
8
dv_name:: Symbol
9
9
p_name:: Symbol
10
+ jac:: Matrix{Expression}
10
11
end
11
12
12
13
function DiffEqSystem (eqs, ivs, dvs, vs, ps)
13
14
iv_name = ivs[1 ]. subtype
14
15
dv_name = dvs[1 ]. subtype
15
16
p_name = isempty (ps) ? :Parameter : ps[1 ]. subtype
16
- DiffEqSystem (eqs, ivs, dvs, vs, ps, iv_name, dv_name, p_name)
17
+ DiffEqSystem (eqs, ivs, dvs, vs, ps, iv_name, dv_name, p_name, Matrix {Expression} ( 0 , 0 ) )
17
18
end
18
19
19
20
function DiffEqSystem (eqs; iv_name = :IndependentVariable ,
@@ -23,7 +24,7 @@ function DiffEqSystem(eqs; iv_name = :IndependentVariable,
23
24
targetmap = Dict (iv_name => iv_name, dv_name => dv_name, v_name => v_name,
24
25
p_name => p_name)
25
26
ivs, dvs, vs, ps = extract_elements (eqs, targetmap)
26
- DiffEqSystem (eqs, ivs, dvs, vs, ps, iv_name, dv_name, p_name)
27
+ DiffEqSystem (eqs, ivs, dvs, vs, ps, iv_name, dv_name, p_name, Matrix {Expression} ( 0 , 0 ) )
27
28
end
28
29
29
30
function DiffEqSystem (eqs, ivs;
@@ -32,7 +33,7 @@ function DiffEqSystem(eqs, ivs;
32
33
p_name = :Parameter )
33
34
targetmap = Dict (dv_name => dv_name, v_name => v_name, p_name => p_name)
34
35
dvs, vs, ps = extract_elements (eqs, targetmap)
35
- DiffEqSystem (eqs, ivs, dvs, vs, ps, ivs[1 ]. subtype, dv_name, p_name)
36
+ DiffEqSystem (eqs, ivs, dvs, vs, ps, ivs[1 ]. subtype, dv_name, p_name, Matrix {Expression} ( 0 , 0 ) )
36
37
end
37
38
38
39
function generate_ode_function (sys:: DiffEqSystem )
@@ -81,12 +82,42 @@ function generate_ode_jacobian(sys::DiffEqSystem,simplify=true)
81
82
diff_idxs = map (eq-> eq. args[1 ]. diff != nothing ,sys. eqs)
82
83
diff_exprs = sys. eqs[diff_idxs]
83
84
jac = calculate_jacobian (sys,simplify)
85
+ sys. jac = jac
84
86
jac_exprs = [:(J[$ i,$ j] = $ (Expr (jac[i,j]))) for i in 1 : size (jac,1 ), j in 1 : size (jac,2 )]
85
87
exprs = vcat (var_exprs,param_exprs,vec (jac_exprs))
86
88
block = expr_arr_to_block (exprs)
87
89
:((J,u,p,t)-> $ (block))
88
90
end
89
91
92
+ const _γ_ = Variable (:_γ_ )
93
+
94
+ function generate_ode_iW (sys:: DiffEqSystem ,simplify= true )
95
+ var_exprs = [:($ (sys. dvs[i]. name) = u[$ i]) for i in 1 : length (sys. dvs)]
96
+ param_exprs = [:($ (sys. ps[i]. name) = p[$ i]) for i in 1 : length (sys. ps)]
97
+ diff_idxs = map (eq-> eq. args[1 ]. diff != nothing ,sys. eqs)
98
+ diff_exprs = sys. eqs[diff_idxs]
99
+ jac = sys. jac
100
+ iW = inv (I - _γ_* jac)
101
+
102
+ if simplify
103
+ iW = simplify_constants .(iW)
104
+ end
105
+
106
+ iW_t = inv (I/ _γ_ - jac)
107
+ if simplify
108
+ iW_t = simplify_constants .(iW_t)
109
+ end
110
+
111
+ iW_exprs = [:(iW[$ i,$ j] = $ (Expr (iW[i,j]))) for i in 1 : size (iW,1 ), j in 1 : size (iW,2 )]
112
+ exprs = vcat (var_exprs,param_exprs,vec (iW_exprs))
113
+ block = expr_arr_to_block (exprs)
114
+
115
+ iW_t_exprs = [:(iW[$ i,$ j] = $ (Expr (iW_t[i,j]))) for i in 1 : size (iW_t,1 ), j in 1 : size (iW_t,2 )]
116
+ exprs = vcat (var_exprs,param_exprs,vec (iW_t_exprs))
117
+ block2 = expr_arr_to_block (exprs)
118
+ :((iW,u,p,_γ_,t)-> $ (block)),:((iW,u,p,_γ_,t)-> $ (block2))
119
+ end
120
+
90
121
function DiffEqBase. DiffEqFunction (sys:: DiffEqSystem )
91
122
expr = generate_ode_function (sys)
92
123
DiffEqFunction {true} (eval (expr))
0 commit comments