henry R - 1 month ago 13
R Question

# Solving ODE with deSolve in R- number of derivatives error

Hey I am trying to use the deSolve package for a set of ODE's with equations as auxillary variables. I keep getting the error where the number of derivatives isn't the same length as the initial conditions vector. What should I change?

``````rm(list=ls())
library(deSolve)

exponential=function(t,state,parameters){ with(as.list( c(state,parameters)), {

#Aux. Var.

fX2 = pmax(0,1-(1-(d2/r12)*(X2/K2)))
fX1 = X1/(X1+k1);

# equations (ODE)

dX1 = C-((d1)*(X1))-(r12)*(X2)*fX2*fX1 # differential equaion
dX2 = r12*(X2)*fX2*fX1-((d2)*(X2))

return(list(c(dX1, dX2)))
})

}

# -- RUN INFORMATION

# Set Initial Values and Simulation Time
state = c(X1=2,X2=0.01,K2= 10)
times=0:100

# Assign Parameter Values
parameters = c(d1=0.001, d2=0.008, r12=0.3,C=0.5,k1= 0.001)

for (i in 1:length(times)){
out= ode(y=state,times=times,func=exponential,parms=parameters)
}

**>   for (i in 1:length(times)){
+     out= ode(y=state,times=times,func=exponential,parms=parameters)
+   }
Error in checkFunc(Func2, times, y, rho) :
The number of derivatives returned by func() (2) must equal the length of      the initial conditions vector (3)**
``````

The error comes from the `return` in your defined function: Your input parameter `y` has length 3, but you only return 2 values back, that's the error. You can solve your problem with
``````return(list(c(X1, X2, K2)))
Another possibility is to take `K2` to the parameters, then your old `return` was right. You have to decide if `K2` is a variable or a parameter.
And BTW: Why a for loop with the time? In my opinion that is not necessary, because the ODEs are solved in the timeinterval you submitted to the `ode`function.
``````out= ode(y=state,times=times,func=exponential,parms=parameters)