| uniroot.all {rootSolve} | R Documentation |
The function uniroot.all searches the interval from lower to upper
for several roots (i.e., zero's) of a function f with respect to
its first argument.
uniroot.all(f, interval, lower=min(interval), upper=max(interval), tol=.Machine$double.eps^0.2, maxiter=1000, n=100, ...)
f |
the function for which the root is sought. |
interval |
a vector containing the end-points of the interval to be searched for the root. |
lower |
the lower end point of the interval to be searched. |
upper |
the upper end point of the interval to be searched. |
tol |
the desired accuracy (convergence tolerance). |
maxiter |
the maximum number of iterations. |
n |
number of subintervals in which the root is sought. |
... |
additional named or unnamed arguments to be passed to f
(but beware of partial matching to other arguments).
|
f will be called as f(x, ...) for a numeric value of x.
Run demo(Jacobandroots) for an example of the use of uniroot.all
for steady-state analysis.
See also second example of gradient
This example is discussed in the book by Soetaert and Herman (2009).
a vector with the roots found in the interval
The function calls uniroot, the basic R-function.
It is not guaranteed that all roots will be recovered.
This will depend on n, the number of subintervals in which the
interval is divided.
If the function "touches" the X-axis (i.e. the root is a saddle point), then this root will generally not be retrieved. (but chances of this are pretty small).
Karline Soetaert <k.soetaert@nioo.knaw.nl>
uniroot for more information about input.
##############################
## Mathematical examples ##
##############################
# a well-behaved case...
fun <- function (x) cos(2*x)^3
curve(fun(x),0,10,main="uniroot.all")
All <- uniroot.all(fun,c(0,10))
points(All,y=rep(0,length(All)),pch=16,cex=2)
# a pathetic case...
f <- function (x)1/cos(1+x^2)
AA <- uniroot.all(f,c(-5,5))
curve(f(x),-5,5,n=500,main="uniroot.all")
points(AA,rep(0,length(AA)),col="red",pch=16)
f(AA) # !!!
##################################
## Ecological modelling example ##
##################################
# Example from the book of Soetaert and Herman(2009)
# A practical guide to ecological modelling -
# using R as a simulation platform. Springer
r <- 0.05
K <- 10
bet <- 0.1
alf <- 1
# the model : density-dependent growth and sigmoid-type mortality rate
rate <- function(x,r=0.05) r*x*(1-x/K)-bet*x^2/(x^2+alf^2)
# find all roots within the interval [0,10]
Eq <- uniroot.all(rate,c(0,10))
# jacobian evaluated at all roots:
# This is just one value - and therefore jacobian = eigenvalue
# the sign of eigenvalue: stability of the root: neg=stable, 0=saddle, pos=unstable
eig <- vector()
for (i in 1:length(Eq)) eig[i] <- sign (gradient(rate,Eq[i]))
curve(rate(x),ylab="dx/dt",from=0,to=10,
main="Budworm model, roots",sub= "Example from Soetaert and Herman, 2009")
abline(h=0)
points(x=Eq,y=rep(0,length(Eq)),pch=21,cex=2,bg=c("grey","black","white")[eig+2] )
legend("topleft",pch=22,pt.cex=2,c("stable","saddle","unstable"),
col=c("grey","black","white"),pt.bg=c("grey","black","white"))