Skip to content

Commit 4263c76

Browse files
authored
add AllZeros type (#427)
* add AllZeros type * fix 1.6 syntax error * avoid error
1 parent f42fc01 commit 4263c76

File tree

4 files changed

+39
-1
lines changed

4 files changed

+39
-1
lines changed

docs/src/reference.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ A useful strategy is to begin with a non-bracketing method and switch to a
184184
Roots.Order0
185185
```
186186

187+
## All zeros
188+
189+
The `find_zeros` function heuristically scans an interval for all zeros using a combination of bracketing and non-bracketing methods. The `AllZeros` method may be passed to `solve` to call this.
190+
191+
```@docs
192+
Roots.AllZeros
193+
```
187194

188195
## Rates of convergence
189196

src/Roots.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ export find_zero,
4040
Order2,
4141
Order5,
4242
Order8,
43-
Order16
43+
Order16,
44+
AllZeros
4445

4546
export Bisection, A42, AlefeldPotraShi, FalsePosition
4647

src/find_zeros.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,3 +392,29 @@ function find_zeros(f, a, b=nothing; no_pts=12, k=8, naive=false, kwargs...)
392392

393393
return zs[inds]
394394
end
395+
396+
397+
# solve interface
398+
"""
399+
AllZeros
400+
401+
Type to indicate to `solve` that `find_zeros` should be used to solve the given `ZeroProblem`.
402+
403+
## Example
404+
405+
```
406+
julia> Z = ZeroProblem(cos, (0, 2pi));
407+
408+
julia> solve(Z, AllZeros())
409+
2-element Vector{Float64}:
410+
1.5707963267948966
411+
4.71238898038469
412+
```
413+
414+
"""
415+
struct AllZeros <: AbstractUnivariateZeroMethod
416+
end
417+
function solve(𝑭𝑿::ZeroProblem, ::AllZeros; kwargs...)
418+
F,x₀ = 𝑭𝑿.F, 𝑭𝑿.x₀
419+
find_zeros(F, x₀; kwargs...)
420+
end

test/test_find_zeros.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ end
124124
# issue #369
125125
g4(x) = sqrt(abs(x^2 - 1)) / (x * sign(x^2 - 1))
126126
@test isempty(find_zeros(g4, 1.1, 2))
127+
128+
# solve interface
129+
Z = ZeroProblem(x -> prod(x - i for i in 1:5), (0,6))
130+
@test solve(Z, AllZeros()) 1:5
127131
end
128132

129133
@testset "find_zeros: not Float64 types" begin

0 commit comments

Comments
 (0)