@@ -3,7 +3,7 @@ $(TYPEDSIGNATURES)
3
3
4
4
Generate `NonlinearSystem` which initializes an ODE problem from specified initial conditions of an `ODESystem`.
5
5
"""
6
- function generate_initializesystem (sys:: ODESystem ;
6
+ function generate_initializesystem (sys:: AbstractSystem ;
7
7
u0map = Dict (),
8
8
pmap = Dict (),
9
9
initialization_eqs = [],
@@ -12,28 +12,36 @@ function generate_initializesystem(sys::ODESystem;
12
12
algebraic_only = false ,
13
13
check_units = true , check_defguess = false ,
14
14
name = nameof (sys), extra_metadata = (;), kwargs... )
15
- trueobs, eqs = unhack_observed (observed (sys), equations (sys))
15
+ eqs = equations (sys)
16
+ eqs = filter (x -> x isa Equation, eqs)
17
+ trueobs, eqs = unhack_observed (observed (sys), eqs)
16
18
vars = unique ([unknowns (sys); getfield .(trueobs, :lhs )])
17
19
vars_set = Set (vars) # for efficient in-lookup
18
20
19
- idxs_diff = isdiffeq .(eqs)
20
- idxs_alge = .! idxs_diff
21
-
22
- # prepare map for dummy derivative substitution
23
- eqs_diff = eqs[idxs_diff]
24
- D = Differential (get_iv (sys))
25
- diffmap = merge (
26
- Dict (eq. lhs => eq. rhs for eq in eqs_diff),
27
- Dict (D (eq. lhs) => D (eq. rhs) for eq in trueobs)
28
- )
29
-
30
- # 1) process dummy derivatives and u0map into initialization system
31
- eqs_ics = eqs[idxs_alge] # start equation list with algebraic equations
21
+ eqs_ics = Equation[]
32
22
defs = copy (defaults (sys)) # copy so we don't modify sys.defaults
33
23
additional_guesses = anydict (guesses)
34
24
guesses = merge (get_guesses (sys), additional_guesses)
35
- schedule = getfield (sys, :schedule )
36
- if ! isnothing (schedule)
25
+ idxs_diff = isdiffeq .(eqs)
26
+
27
+ # 1) Use algebraic equations of time-dependent systems as initialization constraints
28
+ if has_iv (sys)
29
+ idxs_alge = .! idxs_diff
30
+ append! (eqs_ics, eqs[idxs_alge]) # start equation list with algebraic equations
31
+
32
+ eqs_diff = eqs[idxs_diff]
33
+ D = Differential (get_iv (sys))
34
+ diffmap = merge (
35
+ Dict (eq. lhs => eq. rhs for eq in eqs_diff),
36
+ Dict (D (eq. lhs) => D (eq. rhs) for eq in trueobs)
37
+ )
38
+ else
39
+ diffmap = Dict ()
40
+ end
41
+
42
+ if has_schedule (sys) && (schedule = get_schedule (sys); ! isnothing (schedule))
43
+ # 2) process dummy derivatives and u0map into initialization system
44
+ # prepare map for dummy derivative substitution
37
45
for x in filter (x -> ! isnothing (x[1 ]), schedule. dummy_sub)
38
46
# set dummy derivatives to default_dd_guess unless specified
39
47
push! (defs, x[1 ] => get (guesses, x[1 ], default_dd_guess))
@@ -61,9 +69,14 @@ function generate_initializesystem(sys::ODESystem;
61
69
process_u0map_with_dummysubs (y, x)
62
70
end
63
71
end
72
+ else
73
+ # 2) System doesn't have a schedule, so dummy derivatives don't exist/aren't handled (SDESystem)
74
+ for (k, v) in u0map
75
+ defs[k] = v
76
+ end
64
77
end
65
78
66
- # 2 ) process other variables
79
+ # 3 ) process other variables
67
80
for var in vars
68
81
if var ∈ keys (defs)
69
82
push! (eqs_ics, var ~ defs[var])
@@ -74,7 +87,7 @@ function generate_initializesystem(sys::ODESystem;
74
87
end
75
88
end
76
89
77
- # 3 ) process explicitly provided initialization equations
90
+ # 4 ) process explicitly provided initialization equations
78
91
if ! algebraic_only
79
92
initialization_eqs = [get_initialization_eqs (sys); initialization_eqs]
80
93
for eq in initialization_eqs
@@ -83,7 +96,7 @@ function generate_initializesystem(sys::ODESystem;
83
96
end
84
97
end
85
98
86
- # 4 ) process parameters as initialization unknowns
99
+ # 5 ) process parameters as initialization unknowns
87
100
paramsubs = Dict ()
88
101
if pmap isa SciMLBase. NullParameters
89
102
pmap = Dict ()
@@ -138,7 +151,7 @@ function generate_initializesystem(sys::ODESystem;
138
151
end
139
152
end
140
153
141
- # 5 ) parameter dependencies become equations, their LHS become unknowns
154
+ # 6 ) parameter dependencies become equations, their LHS become unknowns
142
155
# non-numeric dependent parameters stay as parameter dependencies
143
156
new_parameter_deps = Equation[]
144
157
for eq in parameter_dependencies (sys)
@@ -153,20 +166,18 @@ function generate_initializesystem(sys::ODESystem;
153
166
push! (defs, varp => guessval)
154
167
end
155
168
156
- # 6 ) handle values provided for dependent parameters similar to values for observed variables
169
+ # 7 ) handle values provided for dependent parameters similar to values for observed variables
157
170
for (k, v) in merge (defaults (sys), pmap)
158
171
if is_variable_floatingpoint (k) && has_parameter_dependency_with_lhs (sys, k)
159
172
push! (eqs_ics, paramsubs[k] ~ v)
160
173
end
161
174
end
162
175
163
176
# parameters do not include ones that became initialization unknowns
164
- pars = vcat (
165
- [get_iv (sys)], # include independent variable as pseudo-parameter
166
- [p for p in parameters (sys) if ! haskey (paramsubs, p)]
167
- )
177
+ pars = Vector {SymbolicParam} (filter (p -> ! haskey (paramsubs, p), parameters (sys)))
178
+ is_time_dependent (sys) && push! (pars, get_iv (sys))
168
179
169
- # 7 ) use observed equations for guesses of observed variables if not provided
180
+ # 8 ) use observed equations for guesses of observed variables if not provided
170
181
for eq in trueobs
171
182
haskey (defs, eq. lhs) && continue
172
183
any (x -> isequal (default_toterm (x), eq. lhs), keys (defs)) && continue
0 commit comments