@@ -188,18 +188,29 @@ function FDE_to_ODE(eqs, alpha, epsilon, T; initial=0)
188188 @independent_variables t
189189 @variables x (t)
190190 D = Differential (t)
191- δ = (gamma (alpha+ 1 ) * epsilon)^ (1 / alpha)
192191
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
195202
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)
198209 M = floor (Int, log (x_sub / T) / h)
199210 N = ceil (Int, log (x_sup / δ) / h)
200211
201212 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)
203214 end
204215
205216 function γ_i (index)
@@ -210,18 +221,35 @@ function FDE_to_ODE(eqs, alpha, epsilon, T; initial=0)
210221 rhs = initial
211222 def = Pair{Num, Int64}[]
212223
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
220248 end
221249 eq = x ~ rhs
222250 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)
225253end
226254
227255"""
0 commit comments