Last chance! 50% off unlimited learning
Sale ends in
lsodar
provides an interface to the
Fortran ODE solver of the same name, written by Alan
C. Hindmarsh and Linda R. Petzold.
The system of ODE's is written as an Rfunction or be defined in
compiled code that has been dynamically loaded. - see description of lsoda
for details.
lsodar
differs from lsode
in two respects.
\itemIt switches automatically between stiff and nonstiff methods (similar as lsoda).
\itemIt finds the root of at least one of a set of constraint
functions g(i) of the independent and dependent variables.lsodar(y, times, func, parms, rtol=1e-6, atol=1e-6,
jacfunc=NULL, jactype="fullint", rootfunc=NULL, verbose=FALSE,
nroot=0, tcrit=NULL, hmin=0, hmax=NULL, hini=0, ynames=TRUE,
maxordn=12, maxords = 5, bandup=NULL, banddown=NULL, maxsteps=5000,
dllname=NULL, initfunc=dllname, initpar=parms, rpar=NULL,
ipar=NULL, nout=0, outnames=NULL, ...)
y
has a name attribute, the names will be used to label the output matrix.y
are desired. The first value in times
must be the initial time.func
or jacfunc
.y
. See details.y
. See details.NULL
, an Rfunction, that computes
the jacobian of the system of differential equations
dydot(i)/dy(j), or a string giving the name of a function or
subroutine in NULL
, an Rfunction that computes
the function whose root has to be estimated or a string giving the name of a function or
subroutine in rootfunc
is an R-function, the solver estimates the number of rootsNULL
, then lsodar
cannot integrate past tcrit
. The Fortran routine lsodar
overshoots its targets
(times points in the vector times
), and interpolates values
for the desirehmin
if you don't know why!hmax
is set to the largest difference in times
, to avoid that the simulation possibly ignores short-term events. If 0, no maximal size is specifiedfunc
; this may speed up the simulation especially for multi-D modelsfunc
and jacfunc
. See package vignetteinitfunc
is in the dll: the parameters passed to the initialiser, to initialise the common blocks (fortran) or global variables (C, C++)func
and jacfunc
func
and jacfunc
dllname
is specified and the model is defined in compiled code: the number of output variables calculated in the compiled function func
, present in the shared library. Note:
it is not automatically checked whetnout
> 0: the names of output variables calculated in the compiled function func
, present in the shared libraryfunc
and jacfunc
allowing this to be a generic functiontimes
and as
many columns as elements in y
plus the number of "global"
values returned in the next elements of the return from func
,
plus and additional column for the time value. There will be a row
for each element in times
unless the Fortran routine `lsodar'
returns with an unrecoverable error or has found a root, in which case the last row will contain the function value at the root.
If y
has a names attribute, it will be used to label the columns of the output value.
The output will have the attributes istate
, and rstate
, two vectors with several useful elements.
See details.
The first element of istate returns the conditions under which the last call to lsoda returned. Normal is istate[1] = 2
.
If verbose
= TRUE, the settings of istate and rstate will be written to the screen
if a root has been found, the output will also have the attribute iroot
, an integer indicating which root has been found.lsodar
,
whose documentation should be consulted for details (it is included as
comments in the source file lsodar
switches automatically between stiff and nonstiff methods (similar as lsoda
).
This means that the user does not have to determine whether the
problem is stiff or not, and the solver will automatically choose the
appropriate method. It always starts with the nonstiff method.
It finds the root of at least one of a set of constraint
functions g(i) of the independent and dependent variables.
It then returns the solution at the root if that occurs
sooner than the specified stop condition, and otherwise returns
the solution according the specified stop condition.
The form of the jacobian can be specified by jactype
which can take the following values.
\itemjactype = "fullint" : a full jacobian, calculated internally by lsodar, the default
\itemjactype = "fullusr" : a full jacobian, specified by user function jacfunc
\itemjactype = "bandusr" : a banded jacobian, specified by user function jacfunc
; the size of the bands specified by bandup
and banddown
\itemjactype = "bandint" : a banded jacobian, calculated by lsodar; the size of the bands specified by bandup
and banddown
if jactype
= "fullusr" or "bandusr" then the user must supply a subroutine jacfunc
.
The input parameters rtol
, and atol
determine the error
control performed by the solver. See lsoda
for details.
Models may be defined in compiled C or Fortran code, as well as in an R-function. See package vignette for details.
Examples in Fortran are in the deSolve
package directory.
The output will have the attributes *istate*, *rstate*, and if a root was found iroot, three vectors with several useful elements.
if verbose
= TRUE, the settings of istate and rstate will be written to the screen.
the following elements of istate are meaningful:
\itemel 1 : returns the conditions under which the last call to lsodar returned.
2 if lsodar was successful, 3 if lsodar was succesful and one or more roots were found - see iroot
.
-1 if excess work done, -2 means excess accuracy requested. (Tolerances too small),
-3 means illegal input detected. (See printed message.), -4 means repeated error test failures. (Check all input),
-5 means repeated convergence failures. (Perhaps bad Jacobian supplied or wrong choice of MF or tolerances.),
-6 means error weight became zero during problem. (Solution component i vanished, and atol or atol(i) = 0.)
\itemel 12 : The number of steps taken for the problem so far.
\itemel 13 : The number of function evaluations for the problem so far.,
\itemel 14 : The number of Jacobian evaluations and LU decompositions so far.,
\itemel 15 : The method order last used (successfully).,
\itemel 16 : The order to be attempted on the next step.,
\itemel 17 : if el 1 =-4,-5: the largest component in the error vector,
\itemel 18 : The length of rwork actually required.,
\itemel 19 : The length of IUSER actually required.,
\itemel 20 : The method indicator for the last succesful step, 1=adams (nonstiff), 2= bdf (stiff),
\itemel 21 : The current method indicator to be attempted on th next step, 1=adams (nonstiff), 2= bdf (stiff),
rstate contains the following:
\item1: The step size in t last used (successfully).
\item2: The step size to be attempted on the next step.
\item3: A tolerance scale factor, greater than 1.0, computed when a request for too much accuracy was detected.
\item4: the value of t at the time of the last method switch, if any.
iroot is a vector, its length equal to the number of constraint functions;
it will have a value of 1 for the constraint function whose root that has been found and 0 otherwise.ode
, lsoda
, lsode
, lsodes
,
vode
, daspk
, rk
.#########################################
### example 1: from lsodar source code
#########################################
Fun <- function (t,y,parms)
{
ydot <- vector(len=3)
ydot[1] <- -.04*y[1] + 1.e4*y[2]*y[3]
ydot[3] <- 3.e7*y[2]*y[2]
ydot[2] <- -ydot[1]-ydot[3]
return(list(ydot,ytot = sum(y)))
}
rootFun <- function (t,y,parms)
{
yroot <- vector(len=2)
yroot[1] <- y[1] - 1.e-4
yroot[2] <- y[3] - 1.e-2
return(yroot)
}
y <- c(1,0,0)
times <- c(0,0.4*10^(0:8))
Out <- NULL
ny <- length(y)
out <- lsodar(y=y,times=times,fun=Fun,rootfun=rootFun,
rtol=1e-4,atol=c(1e-6,1e-10,1e-6), parms=NULL)
print(paste("root is found for eqn",which(attributes(out)$iroot==1)))
print(out[nrow(out),])
#########################################
### example 2:
### using lsodar to estimate steady-state conditions
#########################################
# Bacteria (Bac) are growing on a substrate (Sub)
model <- function(t,state,pars)
{
with (as.list(c(state,pars)), {
# substrate uptake death respiration
dBact = gmax*eff*Sub/(Sub+ks)*Bact - dB*Bact - rB*Bact
dSub =-gmax *Sub/(Sub+ks)*Bact + dB*Bact +input
return(list(c(dBact,dSub)))
})
}
# root is the condition where sum of |rates of change|
# is very small
rootfun <- function (t,state,pars)
{
dstate <- unlist(model(t,state,pars)) #rate of change vector
return(sum(abs(dstate))-1e-10)
}
pars <- list(Bini=0.1,Sini=100,gmax =0.5,eff = 0.5,
ks =0.5, rB =0.01, dB =0.01, input=0.1)
tout <- c(0,1e10)
state <- c(Bact=pars$Bini,Sub =pars$Sini)
out <- lsodar(state,tout,model,pars,rootfun=rootfun)
print(out)
Run the code above in your browser using DataLab