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.
The number of roots found will depend on the number of subintervals in which the interval is subdivided
The function calls uniroot
, the basic R-function.
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 (2008).
a vector with the roots found in the interval
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(2008) # 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 book of Soetaert and Herman") 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"))