@@ -141,8 +141,10 @@ function changeofvariables(sys::System, iv, forward_subs, backward_subs; simplif
141141 return new_sys
142142end
143143
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)
145146 t = iv
147+ @brownian B
146148
147149 old_vars = first .(backward_subs)
148150 new_vars = last .(forward_subs)
@@ -151,13 +153,17 @@ function change_of_variable_SDE(sys::System, iv, nvs, forward_subs, backward_sub
151153 # use: dY = (∂f/∂t + μ∂f/∂x + (1/2)*σ^2*∂2f/∂x2)dt + σ∂f/∂xdW
152154 old_eqs = equations (sys)
153155 old_noise = ModelingToolkit. get_noise_eqs (sys)
156+
157+ # Is there a function to find partial derivative?
154158 ∂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 )
157163 new_eqs = Equation[]
158164
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
161167 for eqs in old_eqs
162168 ex = substitute (ex, eqs. lhs => eqs. rhs)
163169 end
@@ -169,9 +175,28 @@ function change_of_variable_SDE(sys::System, iv, nvs, forward_subs, backward_sub
169175 push! (new_eqs, Differential (t)(new_var) ~ ex)
170176 end
171177
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,
173195 observed= vcat (observed (sys),first .(backward_subs) .~ last .(backward_subs))
174196 )
197+ if simplify
198+ return mtkcompile (new_sys)
199+ end
175200 return new_sys
176201end
177202
0 commit comments