[R-sig-dyn-mod] a question on ODE.1D, nspec
Daniel Reed
reeddc at umich.edu
Wed Jun 26 22:17:11 CEST 2013
Hi Dabing:
When you set nspec to 2, ode.1D expects an array of length 2*N (i.e., 1:N for the first species, (N+1):(2*N) for the second species). However, your vector is only of length N+1. In other words, ode.1D expects both species to be spatially resolved. I wonder if you just used ode() instead, if that would resolve your issue? Or alternatively would it make sense to spatially resolve your plasma variable?
Cheers,
Daniel
_______________________________
Daniel C. Reed, PhD.
Postdoctoral Fellow,
Dept. of Earth & Environmental Sciences,
University of Michigan,
Ann Arbor, MI, USA.
email: reeddc at umich.edu
web: www.danielreed.org
On Jun 26, 2013, at 3:53 PM, Dabing Chen <dabing.c at gmail.com> wrote:
> Hi all:
>
> I am kind of confused by the ODE.1D function in deSolve.
>
> I used deSolve to simulate the oral absorption of drug with
> gastric emptying.
>
> I divided the human digestive tract into 100 sections, and
> simulate the drug travel through and get absorbed in the same time.
> in the state function, the first 100 elements are the drug amount
> in each section, the 101th section is the drug absorbed into blood (with
> elemination).
> My question is on "nspec". It was fine when I set "nspec" as 1
> and names as mass. But I think there are multiple species in the
> simulation. When I set "nspec" as 2 and names as "mass" and "plasma", the
> system won't work.
> I am just wondering how "nspec" works inside deSolve. Is it an
> important parameter to set?
>
> Regards!
> Dabing
>
>
>
>
> rm(list=ls())
> library (deSolve)
>
>
> # simulate the plug flow of solution dosing with gastric emptying
> N <- 100 # divide the GIT into 100 segments
> dx <- 600/N # grid size of 6 cm, d, total length of GIT 600 cm
> v <- 600/(4*60) # velocity of mass movement, cm/min
> x <- seq(dx/2, 600, by = dx) # m, distance from river
>
> ke <- 0.693/60 # /min, first-order in vivo elemination rate from
> plasma
> mass.0 <- 100 # initial dose in mg into GIT
>
>
> state <- c(100,rep(0, N-1),0)
>
> plug <- function(t, state, paras) {
>
> mass <- state[1:N]
> plasma <- state[N+1]
> ka <- c(0,rep(0.02,N-1))
>
> conc <- mass / dx # conc of drug in mg/cm
> ## BOD dynamics
> Flux <- v * c(0, conc) # fluxes due to water transport
> Flux[2] <- 0.01*mass[1] +0.2*mass[1]*(tanh(t%%240-150)-tanh(t%%240-180))
>
> absorption <- ka*mass # oral absorption
>
> ## rate of change = plug flow movement - absorption
> dmass <- -diff(Flux) - absorption
> dplasma <- sum(absorption) -ke*plasma
>
>
> return(list(c(dmass,dplasma)))
> }
>
>
> times <- seq(0, 1000, by = 1)
>
>
> systime <- system.time(out <- ode.1D(y = state, times, plug, parms = NULL,
> nspec = 2, names = c("mass","plasma")))
>
>
> #matplot.1D(out, type = "l", grid = x)
> #image(out, grid = x, xlab = "time, min", ylab = "GIT")
> color = topo.colors
> drug <- out[,2:(N+1)]
> filled.contour(x = times, y = x, drug, color = color, nlevels = 10,
> xlab = "time, min", ylab = "GIT distance, cm",main =
> "drug",ylim=c(0,20), xlim=c(0,200))
>
> #matplot.1D(out, type = "l", grid = x,subset = time == 500)
> #matplot(out[,1],out[,102],type="l",log="y")
> matplot(out[,1],out[,N+2],type="l")
> systime
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-sig-dynamic-models mailing list
> R-sig-dynamic-models at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-dynamic-models
More information about the R-sig-dynamic-models
mailing list