Skip to content

Commit 8d21234

Browse files
author
fchen121
committed
Fix bug in FDE to ODE for alpha > 1
1 parent 8a1101d commit 8d21234

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

src/systems/diffeqs/basic_transformations.jl

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -184,15 +184,14 @@ function change_of_variables(
184184
return new_sys
185185
end
186186

187-
function FDE_to_ODE(eqs, alphas, epsilon, T; initials=0)
187+
function FDE_to_ODE(eqs, variables, alphas, epsilon, T; initials=0)
188188
@independent_variables t
189-
@variables x(t)
190189
D = Differential(t)
191190
i = 0
192191
all_eqs = Equation[]
193192
all_def = Pair{Num, Int64}[]
194193

195-
function FDE_helper(sub_eq, α; initial=0)
194+
function FDE_helper(sub_eq, sub_var, α; initial=0)
196195
alpha_0 = α
197196
if> 1)
198197
coeff = 1/- 1)
@@ -222,10 +221,10 @@ function FDE_to_ODE(eqs, alphas, epsilon, T; initials=0)
222221
end
223222

224223
new_eqs = Equation[]
225-
rhs = initial
226224
def = Pair{Num, Int64}[]
227225

228-
if< 1)
226+
if< 1)
227+
rhs = initial
229228
for index in range(M, N-1; step=1)
230229
new_z = Symbol(:z, :_, i)
231230
i += 1
@@ -236,27 +235,32 @@ function FDE_to_ODE(eqs, alphas, epsilon, T; initials=0)
236235
rhs += c_i(index)*new_z
237236
end
238237
else
238+
rhs = 0
239+
for (index, value) in enumerate(initial)
240+
rhs += value * t^(index - 1) / gamma(index)
241+
end
239242
for index in range(M, N-1; step=1)
240243
new_z = Symbol(:z, :_, i)
241244
i += 1
242245
γ = γ_i(index)
246+
base = sub_eq
243247
for k in range(1, m; step=1)
244248
new_z = Symbol(:z, :_, index-M, :_, k)
245249
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
248252
push!(new_eqs, new_eq)
249253
push!(def, new_z=>0)
250254
end
251255
rhs += coeff*c_i(index)*new_z
252256
end
253257
end
254-
push!(new_eqs, x ~ rhs)
258+
push!(new_eqs, sub_var ~ rhs)
255259
return (new_eqs, def)
256260
end
257261

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)
260264
append!(all_eqs, new_eqs)
261265
append!(all_def, def)
262266
end

0 commit comments

Comments
 (0)