Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rename PIIMTrap and PIIMRect #75

Merged
merged 2 commits into from
Apr 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/src/algorithms.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ FractionalDiffEq.FODEMatrixDiscrete
FractionalDiffEq.ClosedForm
FractionalDiffEq.ClosedFormHankelM
FractionalDiffEq.PIPECE
FractionalDiffEq.PIIMRect
FractionalDiffEq.PIIMTrap
FractionalDiffEq.PIRect
FractionalDiffEq.PITrap
```

### System of FODE
Expand Down
2 changes: 1 addition & 1 deletion src/FractionalDiffEq.jl
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ export FODESolution, FDifferenceSolution, DODESolution, FFMODESolution
export FODESystemSolution, FDDESystemSolution, FFMODESystem

# FODE solvers
export PIEX, PIPECE, PIIMRect, PIIMTrap
export PIEX, PIPECE, PIRect, PITrap
export PECE, FODEMatrixDiscrete, ClosedForm, ClosedFormHankelM, GL
export AtanganaSeda, AtanganaSedaAB
export Euler
Expand Down
21 changes: 10 additions & 11 deletions src/fodesystem/bdf.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@ Use [Backward Differentiation Formula](https://en.wikipedia.org/wiki/Backward_di
"""
struct FLMMBDF <: FODESystemAlgorithm end

function solve(prob::FODESystem, h, ::FLMMBDF; reltol=1e-6, abstol=1e-6)
function solve(prob::FODESystem, h, ::FLMMBDF; reltol=1e-6, abstol=1e-6, maxiters = 100)
@unpack f, α, u0, tspan, p = prob
t0 = tspan[1]; tfinal = tspan[2]
alpha = α[1]
itmax = 100

# issue [#64](https://github.com/SciFracX/FractionalDiffEq.jl/issues/64)
max_order = findmax(α)[1]
Expand Down Expand Up @@ -61,16 +60,16 @@ function solve(prob::FODESystem, h, ::FLMMBDF; reltol=1e-6, abstol=1e-6)
f(temp, u0[:, 1], p, t0)
#fy[:, 1] = BDFf_vectorfield(t0, y0[:, 1], fdefun)
fy[:, 1] = temp
(y, fy) = BDF_first_approximations(t, y, fy, abstol, itmax, s, halpha, omega, w, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = BDF_triangolo(s+1, r-1, 0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = BDF_first_approximations(t, y, fy, abstol, maxiters, s, halpha, omega, w, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = BDF_triangolo(s+1, r-1, 0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)

# Main process of computation by means of the FFT algorithm
nx0::Int = 0; ny0::Int = 0
ff = zeros(1, 2^(Q+2), 1)
ff[1:2] = [0 2]
for q = 0:Q
L::Int = 2^q
(y, fy) = BDF_disegna_blocchi(L, ff, r, Nr, nx0+L*r, ny0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = BDF_disegna_blocchi(L, ff, r, Nr, nx0+L*r, ny0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
ff[1:4*L] = [ff[1:2*L]; ff[1:2*L-1]; 4*L]
end
# Evaluation solution in TFINAL when TFINAL is not in the mesh
Expand All @@ -84,7 +83,7 @@ function solve(prob::FODESystem, h, ::FLMMBDF; reltol=1e-6, abstol=1e-6)
end


function BDF_disegna_blocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N , abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function BDF_disegna_blocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N , abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
nxi::Int = copy(nx0); nxf::Int = copy(nx0 + L*r - 1)
nyi::Int = copy(ny0); nyf::Int = copy(ny0 + L*r - 1)
is::Int = 1
Expand All @@ -97,7 +96,7 @@ function BDF_disegna_blocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N , abstol, i
while ~stop
stop = (nxi+r-1 == nx0+L*r-1) || (nxi+r-1>=Nr-1)
zn = BDF_quadrato(nxi, nxf, nyi, nyf, fy, zn, omega, problem_size)
(y, fy) = BDF_triangolo(nxi, nxi+r-1, nxi, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = BDF_triangolo(nxi, nxi+r-1, nxi, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
i_triangolo = i_triangolo + 1

if ~stop
Expand Down Expand Up @@ -128,7 +127,7 @@ function BDF_quadrato(nxi, nxf, nyi, nyf, fy, zn, omega, problem_size)
return zn
end

function BDF_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function BDF_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
for n = nxi:min(N, nxf)
n1::Int = n+1
St = ABM_starting_term(t[n1], y0, m_alpha, t0, m_alpha_factorial)
Expand Down Expand Up @@ -158,7 +157,7 @@ function BDF_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega
it = it + 1

stop = (norm(yn1-yn0, Inf) < abstol) || (norm(Gn1, Inf)<abstol)
if it > itmax && ~stop
if it > maxiters && ~stop
@warn "Non Convergence"
stop = true
end
Expand All @@ -175,7 +174,7 @@ function BDF_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega
return y, fy
end

function BDF_first_approximations(t, y, fy, abstol, itmax, s, halpha, omega, w, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function BDF_first_approximations(t, y, fy, abstol, maxiters, s, halpha, omega, w, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
m = problem_size
Im = zeros(m, m)+I; Ims = zeros(m*s, m*s)+I
Y0 = zeros(s*m, 1); F0 = copy(Y0); B0 = copy(Y0)
Expand Down Expand Up @@ -219,7 +218,7 @@ function BDF_first_approximations(t, y, fy, abstol, itmax, s, halpha, omega, w,
it = it + 1

stop = (norm(Y1-Y0, Inf) < abstol) || (norm(G1, Inf) < abstol)
if it > itmax && ~stop
if it > maxiters && ~stop
@warn "Non Convergence"
stop = 1
end
Expand Down
21 changes: 10 additions & 11 deletions src/fodesystem/newton_gregory.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@ Use [Newton Gregory](https://www.geeksforgeeks.org/newton-forward-backward-inter
"""
struct FLMMNewtonGregory <: FODESystemAlgorithm end

function solve(prob::FODESystem, h, ::FLMMNewtonGregory; reltol=1e-6, abstol=1e-6)
function solve(prob::FODESystem, h, ::FLMMNewtonGregory; reltol=1e-6, abstol=1e-6, maxiters = 100)
@unpack f, α, u0, tspan, p = prob
t0 = tspan[1]; tfinal = tspan[2]
alpha = α[1]
itmax = 100

# issue [#64](https://github.com/SciFracX/FractionalDiffEq.jl/issues/64)
max_order = findmax(α)[1]
Expand Down Expand Up @@ -63,16 +62,16 @@ function solve(prob::FODESystem, h, ::FLMMNewtonGregory; reltol=1e-6, abstol=1e-
temp = zeros(length(u0[:, 1]))
f(temp, u0[:, 1], p, t0)
fy[:, 1] = temp#f_vectorfield(t0, y0[:, 1], fdefun)
(y, fy) = NG_first_approximations(t, y, fy, abstol, itmax, s, halpha, omega, w, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = NG_triangolo(s+1, r-1, 0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = NG_first_approximations(t, y, fy, abstol, maxiters, s, halpha, omega, w, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = NG_triangolo(s+1, r-1, 0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)

# Main process of computation by means of the FFT algorithm
nx0 = 0; ny0 = 0
ff = zeros(1, 2^(Q+2), 1)
ff[1:2] = [0 2]
for q = 0:Q
L = Int64(2^q)
(y, fy) = NG_disegna_blocchi(L, ff, r, Nr, nx0+L*r, ny0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = NG_disegna_blocchi(L, ff, r, Nr, nx0+L*r, ny0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
ff[1:4*L] = [ff[1:2*L]; ff[1:2*L-1]; 4*L]
end
# Evaluation solution in TFINAL when TFINAL is not in the mesh
Expand All @@ -86,7 +85,7 @@ function solve(prob::FODESystem, h, ::FLMMNewtonGregory; reltol=1e-6, abstol=1e-
end


function NG_disegna_blocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N , abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function NG_disegna_blocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N , abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
nxi::Int = copy(nx0); nxf::Int = copy(nx0 + L*r - 1)
nyi::Int = copy(ny0); nyf::Int = copy(ny0 + L*r - 1)
is::Int = 1
Expand All @@ -99,7 +98,7 @@ function NG_disegna_blocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N , abstol, it
while ~stop
stop = (nxi+r-1 == nx0+L*r-1) || (nxi+r-1>=Nr-1)
zn = NG_quadrato(nxi, nxf, nyi, nyf, fy, zn, omega, problem_size)
(y, fy) = NG_triangolo(nxi, nxi+r-1, nxi, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = NG_triangolo(nxi, nxi+r-1, nxi, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
i_triangolo = i_triangolo + 1

if ~stop
Expand Down Expand Up @@ -130,7 +129,7 @@ function NG_quadrato(nxi, nxf, nyi, nyf, fy, zn, omega, problem_size)
return zn
end

function NG_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function NG_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
for n = nxi:min(N, nxf)
n1::Int = Int64(n+1)
St = NG_starting_term(t[n1], y0, m_alpha, t0, m_alpha_factorial)
Expand Down Expand Up @@ -160,7 +159,7 @@ function NG_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega,
it = it + 1

stop = (norm(yn1-yn0, Inf) < abstol) || (norm(Gn1, Inf)<abstol)
if it > itmax && ~stop
if it > maxiters && ~stop
@warn "Non Convergence"
stop = true
end
Expand All @@ -177,7 +176,7 @@ function NG_triangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega,
return y, fy
end

function NG_first_approximations(t, y, fy, abstol, itmax, s, halpha, omega, w, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function NG_first_approximations(t, y, fy, abstol, maxiters, s, halpha, omega, w, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
m = problem_size
Im = zeros(m, m)+I ; Ims = zeros(m*s, m*s)+I
Y0 = zeros(s*m, 1); F0 = copy(Y0); B0 = copy(Y0)
Expand Down Expand Up @@ -221,7 +220,7 @@ function NG_first_approximations(t, y, fy, abstol, itmax, s, halpha, omega, w, p
it = it + 1

stop = (norm(Y1-Y0, Inf) < abstol) || (norm(G1, Inf) < abstol)
if it > itmax && ~stop
if it > maxiters && ~stop
@warn "Non Convergence"
stop = 1
end
Expand Down
20 changes: 10 additions & 10 deletions src/fodesystem/trapezoid.jl
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ function solve(prob::FODESystem, h, ::FLMMTrap; reltol=1e-6, abstol=1e-6)
t0 = tspan[1]; tfinal = tspan[2]
u0 = u0
alpha = α[1]
itmax = 100
maxiters = 100

# issue [#64](https://github.com/SciFracX/FractionalDiffEq.jl/issues/64)
max_order = findmax(α)[1]
Expand Down Expand Up @@ -63,16 +63,16 @@ function solve(prob::FODESystem, h, ::FLMMTrap; reltol=1e-6, abstol=1e-6)
temp = zeros(problem_size)
f(temp, u0[:, 1], p, t0)
fy[:, 1] = temp
(y, fy) = TrapFirstApproximations(t, y, fy, abstol, itmax, s, halpha, omega, w, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = TrapTriangolo(s+1, r-1, 0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = TrapFirstApproximations(t, y, fy, abstol, maxiters, s, halpha, omega, w, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = TrapTriangolo(s+1, r-1, 0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)

# Main process of computation by means of the FFT algorithm
nx0 = 0; ny0 = 0
ff = zeros(1, 2^(Q+2), 1)
ff[1:2] = [0 2]
for q = 0:Q
L::Int = 2^q
(y, fy) = TrapDisegnaBlocchi(L, ff, r, Nr, nx0+L*r, ny0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = TrapDisegnaBlocchi(L, ff, r, Nr, nx0+L*r, ny0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, f, Jfdefun, u0, m_alpha, t0, m_alpha_factorial, p)
ff[1:4*L] = [ff[1:2*L]; ff[1:2*L-1]; 4*L]
end
# Evaluation solution in TFINAL when TFINAL is not in the mesh
Expand All @@ -86,7 +86,7 @@ function solve(prob::FODESystem, h, ::FLMMTrap; reltol=1e-6, abstol=1e-6)
end


function TrapDisegnaBlocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N::Int, abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function TrapDisegnaBlocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N::Int, abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
nxi::Int = copy(nx0); nxf::Int = copy(nx0 + L*r - 1)
nyi::Int = copy(ny0); nyf::Int = copy(ny0 + L*r - 1)
is::Int = 1
Expand All @@ -99,7 +99,7 @@ function TrapDisegnaBlocchi(L, ff, r, Nr, nx0, ny0, t, y, fy, zn, N::Int, abstol
while ~stop
stop = (nxi+r-1 == nx0+L*r-1) || (nxi+r-1>=Nr-1)
zn = TrapQuadrato(nxi, nxf, nyi, nyf, fy, zn, omega, problem_size)
(y, fy) = TrapTriangolo(nxi, nxi+r-1, nxi, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
(y, fy) = TrapTriangolo(nxi, nxi+r-1, nxi, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
i_triangolo = i_triangolo + 1

if ~stop
Expand Down Expand Up @@ -130,7 +130,7 @@ function TrapQuadrato(nxi, nxf, nyi, nyf, fy, zn, omega, problem_size)
return zn
end

function TrapTriangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function TrapTriangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, maxiters, s, w, omega, halpha, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
for n = nxi:min(N, nxf)
n1::Int = n+1
St = TrapStartingTerm(t[n1], y0, m_alpha, t0, m_alpha_factorial)
Expand Down Expand Up @@ -160,7 +160,7 @@ function TrapTriangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega
it = it + 1

stop = (norm(yn1-yn0, Inf) < abstol) || (norm(Gn1, Inf)<abstol)
if it > itmax && ~stop
if it > maxiters && ~stop
@warn "Non Convergence"
stop = true
end
Expand All @@ -177,7 +177,7 @@ function TrapTriangolo(nxi, nxf, j0, t, y, fy, zn, N, abstol, itmax, s, w, omega
return y, fy
end

function TrapFirstApproximations(t, y, fy, abstol, itmax, s, halpha, omega, w, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
function TrapFirstApproximations(t, y, fy, abstol, maxiters, s, halpha, omega, w, problem_size, fdefun, Jfdefun, y0, m_alpha, t0, m_alpha_factorial, p)
m = problem_size
Im = zeros(m, m)+I ; Ims = zeros(m*s, m*s)+I
Y0 = zeros(s*m, 1); F0 = copy(Y0); B0 = copy(Y0)
Expand Down Expand Up @@ -221,7 +221,7 @@ function TrapFirstApproximations(t, y, fy, abstol, itmax, s, halpha, omega, w, p
it = it + 1

stop = (norm(Y1-Y0, Inf) < abstol) || (norm(G1, Inf) < abstol)
if it > itmax && ~stop
if it > maxiters && ~stop
@warn "Non Convergence"
stop = 1
end
Expand Down
Loading