[R] Re: using LSODA in R
Stephen Ellner
spe2 at cornell.edu
Thu Nov 6 15:50:55 CET 2003
I think an additional problem is that the derivatives function
must be 'told' where to 'look' in y for the values of R, C, and P
that are used to compute Rprime,Cprime, Pprime - it has no way of
'knowing' that the model's state vector y consists of
the variables (R,C,P). Appended below is an example of code
that works to solve a similar system of equations. Perhaps
it might be useful to add something like that to the
?lsoda page?
> function(times,y,p)
> {
> Rprime <-
> (R*(1-R))-((xc*yc*C*R)/(R+R0))-((w*xp*ypr*P*R)/(R02+((1-w)*C)+(w*R)))
> Cprime <-
> (-1*(xc*C)*(1-(yc*R)/(R+R0)))-(((1-w)*xp*ypc*P*C)/((w*R)+((1-w)*C)+C0))
> Pprime <-
>
>(-1*P)-(((1-w)*xp*ypc*C*P)/((w*R)+((1-w)*C)+C0))+((w*xp*ypr*P*R)/((w*R)+((1-w)*C)+R02))
>list(c(Rprime, Cprime, Pprime))
>}
require(odesolve);
# Set parameter values
bmaxc=3.3; bmaxb=2.25; Kc=4.3; Kb=15; ni=80;
m=0.05; lambda=0.4; epsilon=0.25; delta=0.95;
f2k=function(t,y,parms){
dy=rep(0,4);
n=y[1]; c=y[2]; r=y[3]; b=y[4];
fcn=bmaxc*n/(Kc+n);
fbc=bmaxb*c/(Kb+c);
dy[1]=delta*(ni-n)-fcn*c;
dy[2]=fcn*c-fbc*b/epsilon-delta*c;
dy[3]=fbc*r-(delta+m+lambda)*r;
dy[4]=fbc*r-(delta+m)*b;
list(dy);
}
y0=c(1,70,.01,.01); times=(0:240)/4; parms=0;
out=lsoda(y0, times, f2k, parms, rtol=1e-4, atol=1e-4);
matplot(times,cbind(out[,3]/5,out[,5]),type="l",col=c("green","red"), lty=1,
xlab="Time (d)", ylab="Prey (green) and Predators (red)");
Stephen P. Ellner (spe2 at cornell.edu)
Department of Ecology and Evolutionary Biology
Corson Hall, Cornell University, Ithaca NY 14853-2701
Phone (607) 254-4221 FAX (607) 255-8088
More information about the R-help
mailing list