dae: General Solver for Differential Algebraic Equations

daeR Documentation

General Solver for Differential Algebraic Equations

Description

Solves a system of differential algebraic equations; a wrapper around the implemented DAE solvers

Usage

dae(y, times, parms, dy, res = NULL, func = NULL,
    method = c("mebdfi", "daspk", "radau", "gamd", "bimd"), ...)

Arguments

y

the initial (state) values for the DAE system, a vector. If y has a name attribute, the names will be used to label the output matrix.

times

time sequence for which output is wanted; the first value of times must be the initial time.

parms

vector or list of parameters used in res

dy

the initial derivatives of the state variables of the DAE system.

func

to be used if the model is an ODE, or a DAE written in linearly implicit form (M y' = f(t, y)). func should be an R-function that computes the values of the derivatives in the ODE system (the model definition) at time t.

func must be defined as: func <- function(t, y, parms,...).
t is the current time point in the integration, y is the current estimate of the variables in the ODE system. If the initial values y has a names attribute, the names will be available inside func, unless ynames is FALSE. parms is a vector or list of parameters. ... (optional) are any other arguments passed to the function.

The return value of func should be a list, whose first element is a vector containing the derivatives of y with respect to time, and whose next elements are global values that are required at each point in times. The derivatives should be specified in the same order as the specification of the state variables y.

res

either an R-function that computes the residual function F(t,y,y') of the DAE system (the model defininition) at time t, or a character string giving the name of a compiled function in a dynamically loaded shared library.

If res is a user-supplied R-function, it must be defined as: res <- function(t, y, dy, parms, ...).

Here t is the current time point in the integration, y is the current estimate of the variables in the DAE system, dy are the corresponding derivatives. If the initial y or dy have a names attribute, the names will be available inside res, unless ynames is FALSE. parms is a vector of parameters.

The return value of res should be a list, whose first element is a vector containing the residuals of the DAE system, i.e. delta = F(t,y,y'), and whose next elements contain output variables that are required at each point in times.

If res is a string, then dllname must give the name of the shared library (without extension) which must be loaded before dae() is called (see deSolve package vignette "compiledCode" for more information).

method

the solver to use, either a string ("mebdfi", "daspk"), "radau", "gamd" or a function that performs integration.

...

additional arguments passed to the solvers.

Details

This is simply a wrapper around the various dae solvers.

See package vignette for information about specifying the model in compiled code.

See the selected integrator for the additional options.

Value

A matrix of class deSolve with up to as many rows as elements in times and as many columns as elements in y plus the number of "global" values returned in the second element of the return from res, plus an additional column (the first) for the time value. There will be one row for each element in times unless the integrator returns with an unrecoverable error. If y has a names attribute, it will be used to label the columns of the output value.

Author(s)

Karline Soetaert <karline.soetaert@nioz.nl>

See Also

  • ode for a wrapper around the ode solvers,

  • ode.band for solving models with a banded Jacobian,

  • ode.1D for integrating 1-D models,

  • ode.2D for integrating 2-D models,

  • ode.3D for integrating 3-D models,

  • mebdfi, daspk,radau,gamd,bimd, for the dae solvers

diagnostics to print diagnostic messages.

Examples


## =======================================================================
## Chemical problem
## =======================================================================

daefun <- function(t, y, dy, parms) {
  with (as.list(c(y, dy, parms)), {
    res1 <- dA + dAB + lambda * A
    res2 <- dAB + dB
    alg <- B * A - K * AB
  list(c(res1, res2, alg), sumA = A + AB)
  })
}

parms <- c(lambda = 0.1, K = 1e-4)

yini  <- with(as.list(parms),
     c(A = 1, AB = 1, B = K))
dyini <- c(dA = 0, dAB = 0, dB = 0)

times <- 0:100

print(system.time(
out <-dae (y=yini, dy = dyini, times = times, res = daefun,
           parms = parms, method = "daspk")
))

plot(out, ylab = "conc.", xlab = "time", lwd = 2)
mtext("IVP DAE", side = 3, outer = TRUE, line = -1)


deTestSet documentation built on Dec. 10, 2023, 3:04 a.m.