Skip to content

Commit

Permalink
newton(): defer to Roots.jl implementation
Browse files Browse the repository at this point in the history
Note that we really do need `Roots.jl` 2.2.0-or-newer,
because of JuliaMath/Roots.jl#445
  • Loading branch information
LebedevRI committed Sep 13, 2024
1 parent 96786f0 commit 9411bf6
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 13 deletions.
2 changes: 2 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
Roots = "f2b01f46-fcfa-551c-844a-d8ac1e96c665"
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
StatsAPI = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
Expand Down Expand Up @@ -48,6 +49,7 @@ PDMats = "0.10, 0.11"
Printf = "<0.0.1, 1"
QuadGK = "2"
Random = "<0.0.1, 1"
Roots = "2.2"
SparseArrays = "<0.0.1, 1"
SpecialFunctions = "1.2, 2"
StableRNGs = "1"
Expand Down
16 changes: 3 additions & 13 deletions src/quantilealgs.jl
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Roots

# Various algorithms for computing quantile

function quantile_bisect(d::ContinuousUnivariateDistribution, p::Real, lx::T, rx::T) where {T<:Real}
Expand Down Expand Up @@ -47,20 +49,8 @@ quantile_bisect(d::ContinuousUnivariateDistribution, p::Real) =
# Distribution, with Application to the Inverse Gaussian Distribution
# http://www.statsci.org/smyth/pubs/qinvgaussPreprint.pdf

function newton_impl(Δ, xs::T=mode(d), xrtol::Real=1e-12) where {T}
x = xs - Δ(xs)
@assert typeof(x) === T
x0 = T(xs)
while !isapprox(x, x0, atol=0, rtol=xrtol)
x0 = x
x = x0 - Δ(x0)
end
return x
end

function newton((f,df), xs::T=mode(d), xrtol::Real=1e-12) where {T}
Δ(x) = f(x)/df(x)
return newton_impl(Δ, xs, xrtol)
return find_zero((f,df), xs, Roots.Newton(), xatol=0, xrtol=xrtol, atol=0, rtol=eps(float(T)), maxiters=typemax(Int))
end

function quantile_newton(d::ContinuousUnivariateDistribution, p::Real, xs::Real=mode(d), xrtol::Real=1e-12)
Expand Down

0 comments on commit 9411bf6

Please sign in to comment.