@@ -188,18 +188,29 @@ function FDE_to_ODE(eqs, alpha, epsilon, T; initial=0)
188
188
@independent_variables t
189
189
@variables x (t)
190
190
D = Differential (t)
191
- δ = (gamma (alpha+ 1 ) * epsilon)^ (1 / alpha)
192
191
193
- a = pi / 2 * (1 - (1 - alpha)/ ((2 - alpha) * log (epsilon^- 1 )))
194
- h = 2 * pi * a / log (1 + (2 / epsilon * (cos (a))^ (alpha - 1 )))
192
+ alpha_0 = alpha
193
+ if (alpha > 1 )
194
+ coeff = 1 / (alpha - 1 )
195
+ m = 2
196
+ while (alpha - m > 0 )
197
+ coeff /= alpha - m
198
+ m += 1
199
+ end
200
+ alpha_0 = alpha - m + 1
201
+ end
195
202
196
- x_sub = (gamma (2 - alpha) * epsilon)^ (1 / (1 - alpha))
197
- x_sup = - log (gamma (1 - alpha) * epsilon)
203
+ δ = (gamma (alpha_0+ 1 ) * epsilon)^ (1 / alpha_0)
204
+ a = pi / 2 * (1 - (1 - alpha_0)/ ((2 - alpha_0) * log (epsilon^- 1 )))
205
+ h = 2 * pi * a / log (1 + (2 / epsilon * (cos (a))^ (alpha_0 - 1 )))
206
+
207
+ x_sub = (gamma (2 - alpha_0) * epsilon)^ (1 / (1 - alpha_0))
208
+ x_sup = - log (gamma (1 - alpha_0) * epsilon)
198
209
M = floor (Int, log (x_sub / T) / h)
199
210
N = ceil (Int, log (x_sup / δ) / h)
200
211
201
212
function c_i (index)
202
- h * sin (pi * alpha ) / pi * exp ((1 - alpha )* h* index)
213
+ h * sin (pi * alpha_0 ) / pi * exp ((1 - alpha_0 )* h* index)
203
214
end
204
215
205
216
function γ_i (index)
@@ -210,18 +221,35 @@ function FDE_to_ODE(eqs, alpha, epsilon, T; initial=0)
210
221
rhs = initial
211
222
def = Pair{Num, Int64}[]
212
223
213
- for index in range (M, N- 1 ; step= 1 )
214
- new_z = Symbol (:z , :_ , index- M)
215
- new_z = ModelingToolkit. unwrap (only (@variables $ new_z (t)))
216
- new_eq = D (new_z) ~ eqs - γ_i (index)* new_z
217
- push! (new_eqs, new_eq)
218
- push! (def, new_z=> 0 )
219
- rhs += c_i (index)* new_z
224
+ if (alpha < 1 )
225
+ for index in range (M, N- 1 ; step= 1 )
226
+ new_z = Symbol (:z , :_ , index- M)
227
+ new_z = ModelingToolkit. unwrap (only (@variables $ new_z (t)))
228
+ new_eq = D (new_z) ~ eqs - γ_i (index)* new_z
229
+ push! (new_eqs, new_eq)
230
+ push! (def, new_z=> 0 )
231
+ rhs += c_i (index)* new_z
232
+ end
233
+ else
234
+ for index in range (M, N- 1 ; step= 1 )
235
+ new_z = Symbol (:z , :_ , index- M)
236
+ start = eqs
237
+ γ = γ_i (index)
238
+ for k in range (1 , m; step= 1 )
239
+ new_z = Symbol (:z , :_ , index- M, :_ , k)
240
+ new_z = ModelingToolkit. unwrap (only (@variables $ new_z (t)))
241
+ new_eq = D (new_z) ~ start - γ* new_z
242
+ start = k * new_z
243
+ push! (new_eqs, new_eq)
244
+ push! (def, new_z=> 0 )
245
+ end
246
+ rhs += coeff* c_i (index)* new_z
247
+ end
220
248
end
221
249
eq = x ~ rhs
222
250
push! (new_eqs, eq)
223
- @mtkcompile sys = System (new_eqs, t; defaults= def)
224
- return sys
251
+ @named sys = System (new_eqs, t; defaults= def)
252
+ return mtkcompile ( sys)
225
253
end
226
254
227
255
"""
0 commit comments