@@ -141,8 +141,10 @@ function changeofvariables(sys::System, iv, forward_subs, backward_subs; simplif
141
141
return new_sys
142
142
end
143
143
144
- function change_of_variable_SDE (sys:: System , iv, nvs, forward_subs, backward_subs; simplify= false , t0= missing )
144
+ function change_of_variable_SDE (sys:: System , iv, forward_subs, backward_subs; simplify= true , t0= missing )
145
+ sys = mtkcompile (sys)
145
146
t = iv
147
+ @brownian B
146
148
147
149
old_vars = first .(backward_subs)
148
150
new_vars = last .(forward_subs)
@@ -151,13 +153,17 @@ function change_of_variable_SDE(sys::System, iv, nvs, forward_subs, backward_sub
151
153
# use: dY = (∂f/∂t + μ∂f/∂x + (1/2)*σ^2*∂2f/∂x2)dt + σ∂f/∂xdW
152
154
old_eqs = equations (sys)
153
155
old_noise = ModelingToolkit. get_noise_eqs (sys)
156
+
157
+ # Is there a function to find partial derivative?
154
158
∂f∂t = Symbolics. derivative ( first .(forward_subs), t )
155
- ∂f∂x = [Symbolics. derivative ( first (f_sub), old_var )]
156
- ∂2f∂x2 = Symbolics. derivative ( ∂f∂x, old_vars )
159
+ ∂f∂t = [substitute (f_t, Differential (t)(old_var) => 0 ) for (f_t, old_var) in zip (∂f∂t, old_vars)]
160
+
161
+ ∂f∂x = [Symbolics. derivative ( first (f_sub), old_var ) for (f_sub, old_var) in zip (forward_subs, old_vars)]
162
+ ∂2f∂x2 = Symbolics. derivative .( ∂f∂x, old_vars )
157
163
new_eqs = Equation[]
158
164
159
- for (new_var, eq, noise, nv, first, second, third) in zip (new_vars, old_eqs, old_noise, nvs , ∂f∂t, ∂f∂x, ∂2f∂x2)
160
- ex = first + eq. rhs * second + 1 / 2 * noise^ 2 * third + noise* second* nv
165
+ for (new_var, eq, noise, first, second, third) in zip (new_vars, old_eqs, old_noise, ∂f∂t, ∂f∂x, ∂2f∂x2)
166
+ ex = first + eq. rhs * second + 1 / 2 * noise^ 2 * third + noise* second* B
161
167
for eqs in old_eqs
162
168
ex = substitute (ex, eqs. lhs => eqs. rhs)
163
169
end
@@ -169,9 +175,28 @@ function change_of_variable_SDE(sys::System, iv, nvs, forward_subs, backward_sub
169
175
push! (new_eqs, Differential (t)(new_var) ~ ex)
170
176
end
171
177
172
- @named new_sys = System (new_eqs;
178
+ defs = get_defaults (sys)
179
+ new_defs = Dict ()
180
+ for f_sub in forward_subs
181
+ ex = substitute (first (f_sub), defs)
182
+ if ! ismissing (t0)
183
+ ex = substitute (ex, t => t0)
184
+ end
185
+ new_defs[last (f_sub)] = ex
186
+ end
187
+ for para in parameters (sys)
188
+ if haskey (defs, para)
189
+ new_defs[para] = defs[para]
190
+ end
191
+ end
192
+
193
+ @named new_sys = System (new_eqs, t;
194
+ defaults= new_defs,
173
195
observed= vcat (observed (sys),first .(backward_subs) .~ last .(backward_subs))
174
196
)
197
+ if simplify
198
+ return mtkcompile (new_sys)
199
+ end
175
200
return new_sys
176
201
end
177
202
0 commit comments