bisect.RdFinding roots of univariate functions in bounded intervals.
bisect(fun, a, b, maxiter = 500, tol = NA, ...)
secant(fun, a, b, maxiter = 500, tol = 1e-08, ...)
regulaFalsi(fun, a, b, maxiter = 500, tol = 1e-08, ...)“Bisection” is a well known root finding algorithms for real, univariate, continuous functions. Bisection works in any case if the function has opposite signs at the endpoints of the interval.
bisect stops when floating point precision is reached, attaching
a tolerance is no longer needed. This version is trimmed for exactness,
not speed. Special care is taken when 0.0 is a root of the function.
Argument 'tol' is deprecated and not used anymore.
The “Secant rule” uses a succession of roots of secant lines to better approximate a root of a function. “Regula falsi” combines bisection and secant methods. The so-called `Illinois' improvement is used here.
Return a list with components root, f.root,
the function value at the found root, iter, the number of iterations
done, and root, and the estimated accuracy estim.prec
Quarteroni, A., R. Sacco, and F. Saleri (2007). Numerical Mathematics. Second Edition, Springer-Verlag, Berlin Heidelberg.
bisect(sin, 3.0, 4.0)
#> $root
#> [1] 3.141593
#>
#> $f.root
#> [1] 1.224647e-16
#>
#> $iter
#> [1] 52
#>
#> $estim.prec
#> [1] 4.440892e-16
#>
# $root $f.root $iter $estim.prec
# 3.1415926536 1.2246467991e-16 52 4.4408920985e-16
bisect(sin, -1.0, 1.0)
#> $root
#> [1] 0
#>
#> $f.root
#> [1] 0
#>
#> $iter
#> [1] 2
#>
#> $estim.prec
#> [1] 0
#>
# $root $f.root $iter $estim.prec
# 0 0 2 0
# Legendre polynomial of degree 5
lp5 <- c(63, 0, -70, 0, 15, 0)/8
f <- function(x) polyval(lp5, x)
bisect(f, 0.6, 1) # 0.9061798453 correct to 15 decimals
#> $root
#> [1] 0.9061798
#>
#> $f.root
#> [1] 4.440892e-16
#>
#> $iter
#> [1] 53
#>
#> $estim.prec
#> [1] 1.110223e-16
#>
secant(f, 0.6, 1) # 0.5384693 different root
#> $root
#> [1] 0.5384693
#>
#> $f.root
#> [1] -1.872937e-10
#>
#> $iter
#> [1] 7
#>
#> $estim.prec
#> [1] 1.016315e-06
#>
regulaFalsi(f, 0.6, 1) # 0.9061798459 correct to 10 decimals
#> $root
#> [1] 0.9061798
#>
#> $f.root
#> [1] -1.998401e-15
#>
#> $niter
#> [1] 11
#>
#> $estim.prec
#> [1] 8.886614e-09
#>