From a51e8e7a41180ebd9cfc8a0fe95fd165956a93c2 Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 20 Oct 2023 07:28:10 +0100 Subject: [PATCH] Dualbesselix (#11) * bugfix Dual of besselix --- src/Maths.jl | 5 +++-- test/maths/Maths.jl | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Maths.jl b/src/Maths.jl index 618bac5..1ef35bf 100644 --- a/src/Maths.jl +++ b/src/Maths.jl @@ -20,11 +20,12 @@ end import SpecialFunctions.besselix -function besselix(n::Integer, x::DualNumbers.Dual) +function besselix(n::Integer, x::DualNumbers.Dual{T}) where T r, d = realpart(x), dualpart(x) bix = besselix(n, r) + didr = (besseli(n - 1, r) + besseli(n + 1, r)) / 2 return Dual(bix, - d * ((besselix(n - 1, r) + besselix(n + 1, r)) / 2 - abs(real(r)) * bix)) + d * (didr * exp(-abs(real(r))) - sign(real(r)) * bix)) end diff --git a/test/maths/Maths.jl b/test/maths/Maths.jl index 31b68a7..326142e 100644 --- a/test/maths/Maths.jl +++ b/test/maths/Maths.jl @@ -3,7 +3,7 @@ println("$(now()) $(@__FILE__)") using LinearMaxwellVlasov using Test, SpecialFunctions, QuadGK, HCubature, StaticArrays, Random -using DualNumbers +using DualNumbers, ForwardDiff const LMV = LinearMaxwellVlasov @@ -128,4 +128,19 @@ const LMV = LinearMaxwellVlasov (besselj(0+im, 1.0) - besselj(2.0+im, 1.0)) / 2 end + @testset "Duals vs ForwardDiff" begin + for n in (3, 4, -3, -4), x in (-5.0, 5.0) + @test DualNumbers.dualpart(besselix(n, Dual(x, 1))) ≈ + ForwardDiff.derivative(z->besselix(n, z), x) + @test DualNumbers.dualpart(besselj(n, Dual(x, 1))) ≈ + ForwardDiff.derivative(z->besselj(n, z), x) + end + for n in (3, 4), x in (-5.0, 5.0) + @assert ForwardDiff.derivative(z->besseli(n, z), x) ≈ + (besseli(n-1, x) + besseli(n+1, x)) / 2 + @test DualNumbers.dualpart(n^Dual(x, 1)) ≈ + ForwardDiff.derivative(z->n^z, x) + end + end + end