Skip to content

Commit 6fd7d31

Browse files
author
fchen121
committed
Implement FDE to ODE for single equation with alpha > 1
1 parent 80091f1 commit 6fd7d31

File tree

1 file changed

+43
-15
lines changed

1 file changed

+43
-15
lines changed

src/systems/diffeqs/basic_transformations.jl

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
225253
end
226254

227255
"""

0 commit comments

Comments
 (0)