numderiv.RdRichardson's method applied to the computation of the numerical derivative.
numderiv(f, x0, maxiter = 16, h = 1/2, ..., tol = .Machine$double.eps)
numdiff(f, x, maxiter = 16, h = 1/2, ..., tol = .Machine$double.eps)numderiv returns the derivative of f at x0, where
x0 must be a single scalar in the domain of the function.
numdiff is a vectorized form of numderiv such that the
derivatives will be returned at all points of the vector x.
Numeric scalar or vector of approximated derivatives.
Mathews, J. H., and K. D. Fink (1999). Numerical Methods Using Matlab. Third Edition, Prentice Hall.
See grad in the `numDeriv' package for another implementation of
Richardson's method in the context of numerical differentiation.
# Differentiate an anti-derivative function
f <- function(x) sin(x)*sqrt(1+sin(x))
F <- function(x)
integrate(f, 0, x, rel.tol = 1e-12)$value
x0 <- 1
dF0 <- numderiv(F, x0, tol = 6.5e-15) #=> 1.141882942715462
f(x0) # 1.141882942715464 true value
#> [1] 1.141883
# fderiv(F, x0) # 1.141882942704476
# numDeriv::grad(F, x0) # 1.141882942705797
# Compare over a whole period
x <- seq(0, 2*pi, length.out = 11)
max(abs(numdiff(sin, x) - cos(x))) #=> 3.44e-15
#> [1] 1.887379e-15
# max(abs(numDeriv::grad(sin, x) - cos(x))) # 7.70e-12
# Example from complex step
f <- function(x) exp(x) / sqrt(sin(x)^3 + cos(x)^3)
x0 <- 1.5
numderiv(f, x0) # 4.05342789389876, error 0.5e-12
#> $df
#> [1] 4.053428
#>
#> $rel.err
#> [1] 2.037796e-14
#>
#> $niter
#> [1] 8
#>
# 4.053427893898621... true value