@@ -184,15 +184,14 @@ function change_of_variables(
184
184
return new_sys
185
185
end
186
186
187
- function FDE_to_ODE (eqs, alphas, epsilon, T; initials= 0 )
187
+ function FDE_to_ODE (eqs, variables, alphas, epsilon, T; initials= 0 )
188
188
@independent_variables t
189
- @variables x (t)
190
189
D = Differential (t)
191
190
i = 0
192
191
all_eqs = Equation[]
193
192
all_def = Pair{Num, Int64}[]
194
193
195
- function FDE_helper (sub_eq, α; initial= 0 )
194
+ function FDE_helper (sub_eq, sub_var, α; initial= 0 )
196
195
alpha_0 = α
197
196
if (α > 1 )
198
197
coeff = 1 / (α - 1 )
@@ -222,10 +221,10 @@ function FDE_to_ODE(eqs, alphas, epsilon, T; initials=0)
222
221
end
223
222
224
223
new_eqs = Equation[]
225
- rhs = initial
226
224
def = Pair{Num, Int64}[]
227
225
228
- if (α < 1 )
226
+ if (α < 1 )
227
+ rhs = initial
229
228
for index in range (M, N- 1 ; step= 1 )
230
229
new_z = Symbol (:z , :_ , i)
231
230
i += 1
@@ -236,27 +235,32 @@ function FDE_to_ODE(eqs, alphas, epsilon, T; initials=0)
236
235
rhs += c_i (index)* new_z
237
236
end
238
237
else
238
+ rhs = 0
239
+ for (index, value) in enumerate (initial)
240
+ rhs += value * t^ (index - 1 ) / gamma (index)
241
+ end
239
242
for index in range (M, N- 1 ; step= 1 )
240
243
new_z = Symbol (:z , :_ , i)
241
244
i += 1
242
245
γ = γ_i (index)
246
+ base = sub_eq
243
247
for k in range (1 , m; step= 1 )
244
248
new_z = Symbol (:z , :_ , index- M, :_ , k)
245
249
new_z = ModelingToolkit. unwrap (only (@variables $ new_z (t)))
246
- new_eq = D (new_z) ~ sub_eq - γ* new_z
247
- sub_eq = k * new_z
250
+ new_eq = D (new_z) ~ base - γ* new_z
251
+ base = k * new_z
248
252
push! (new_eqs, new_eq)
249
253
push! (def, new_z=> 0 )
250
254
end
251
255
rhs += coeff* c_i (index)* new_z
252
256
end
253
257
end
254
- push! (new_eqs, x ~ rhs)
258
+ push! (new_eqs, sub_var ~ rhs)
255
259
return (new_eqs, def)
256
260
end
257
261
258
- for (eq, alpha) in zip (eqs, alphas)
259
- (new_eqs, def) = FDE_helper (eq, alpha)
262
+ for (eq, cur_var, alpha, init ) in zip (eqs, variables, alphas, initials )
263
+ (new_eqs, def) = FDE_helper (eq, cur_var, alpha; initial = init )
260
264
append! (all_eqs, new_eqs)
261
265
append! (all_def, def)
262
266
end
0 commit comments