在 R 中使用 deSolve 求解 ODE - 导数误差
Solving ODE with deSolve in R- number of derivatives error
我正在尝试将 deSolve
程序包用于一组以方程作为辅助变量的 ODE。我一直收到错误,其中导数的数量与初始条件向量的长度不同。我应该改变什么?
# 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)
}
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)**
错误来自您定义的函数中的 return
:
你的输入参数 y
长度为 3,但你只返回 return 2 个值,这就是错误。你可以用
解决你的问题
return(list(c(X1, X2, K2)))
还有一种可能就是把K2
作为参数,那么你的老return
就对了。您必须决定 K2
是变量还是参数。
顺便说一句:为什么要用时间进行循环?在我看来,这不是必需的,因为 ODE 是在您提交给 ode
函数的时间间隔内求解的。
out= ode(y=state,times=times,func=exponential,parms=parameters)
我正在尝试将 deSolve
程序包用于一组以方程作为辅助变量的 ODE。我一直收到错误,其中导数的数量与初始条件向量的长度不同。我应该改变什么?
# 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)
}
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)**
错误来自您定义的函数中的 return
:
你的输入参数 y
长度为 3,但你只返回 return 2 个值,这就是错误。你可以用
return(list(c(X1, X2, K2)))
还有一种可能就是把K2
作为参数,那么你的老return
就对了。您必须决定 K2
是变量还是参数。
顺便说一句:为什么要用时间进行循环?在我看来,这不是必需的,因为 ODE 是在您提交给 ode
函数的时间间隔内求解的。
out= ode(y=state,times=times,func=exponential,parms=parameters)