Solving ODE usng solvers in FractionalDiffEq.jl

While the fractional differential equations are the generalization of the integer order differential equations, we maybe wonder: Can FractionalDiffEq.jl solve ODEs? The answer would be a big YES!!

Long story short, let's see the comparison with OrdinaryDiffEq.jl:

Single term ODE

For example, we have a second order ODE:

\[y''-y=2x^2-x-3,\ y'(0)=0,\ y(0)=0\]

using OrdinaryDiffEq, FractionalDiffEq, Plots
function fun(du, u, p, x)
    du=u+2*x^2-x-3
end

odeprob = SecondOrderODEProblem(fun, 0, 0, (0, 5))
odesol = OrdinaryDiffEq.solve(odeprob, Tsit5())
# For now, when we are using solve to solve our problem, we need to specify packages explicitly
fodeprob = SingleTermFODEProblem((x, u)->u+2*x^2-x-3, 2, 0, (0, 5))
fodesol = FractionalDiffEq.solve(fodeprob, 0.001, PECE())

plot(sol, vars=(2))
plot!(fodesol, ls=:dash)

ODE

Linear multi-term ODE:

\[y''-9y'+20y=0,\ y'(0)=2, y(0)=1\]

While the analytical solution is given as:

\[y(x)=e^{4x}(3-2e^x)\]

using FractionalDiffEq, Plots
rightfun(t, x) = 0
multiprob = MultiTermsFODEProblem([1, -9, 20], [2, 1, 0], rightfun, [1, 2], (0, 1))
multisol = FractionalDiffEq.solve(multiprob, 0.01, PIPECE())
analytical(x)=exp(4*x)*(3-2*exp(x))
plot(multisol)
plot!(collect(0:0.01:1), analytical.(collect(0:0.01:1)), ls=:dash)

multitermsode