使用R语言deSolve包求解微分方程组时报attempt to apply non-function错误求助
deSolve求解微分方程组
attempt to apply non-function报错解决方案 报错核心原因
该报错是代码中存在多处语法错误导致R误将普通变量识别为函数进行调用触发的,具体错误点如下:
- 状态变量引用不匹配:定义的初始状态向量
state的元素为T0、T1、T2、T3、T4、T5、Im,但代码中错误使用T[0]、T[1]、I[m]这类向量索引写法,既不存在名为T、I的状态向量,R的向量索引也从1而非0开始。 - 错误使用函数调用语法:代码中
T[1](0)、T[2](0)这类写法中,圆括号()在R中为函数调用标识,T[1]本身不是函数,直接触发该报错。此处属于误将公式里的初始值标注括号当成了语法的一部分。 - 部分参数大小写不统一:代码同时出现小写
phi和大写Phi两个参数,你定义的参数列表中两个参数都存在,无需修改,若后续出现参数缺失报错可优先检查拼写。
修正方案
将所有错误的状态变量引用替换为正确的变量名,删除错误的函数调用语法,修正后的完整代码如下:
# 安装加载包 install.packages('deSolve') library(deSolve) # 定义微分方程模型 Tumor.model <- function(t, state, parameters) { with(as.list(c(state, parameters)),{ # 计算各状态变量导数,原公式中Tx(0)统一替换为你定义的对应初始值 dT0 <- (kappa*N) - (phi*T0)*(1-(T0/Tmax)) - ((1-phi)*T0) - (mu*Im*T0) dT1 <- T0*(1-phi) - (Phi*T1)*(1-(T1/Tmax)) - 1*exp((k/lam)*(1-exp(-lam*t))) - (mu*Im*T2) dT2 <- (phi*T0)*(1-(T0/Tmax)) + (Phi*T1)*(1-(T1/Tmax)) - 1*exp((k/lam)*(1-exp(-lam*t))) - (beta*T2)*(1-(T2/Tmax)) - (mu*Im*T2) dT3 <- (beta*T2)*(1-(T2/Tmax)) - 1*exp((k/omega)*(1-exp(-omega*t))) - (gamma*T3)*(1-(T3/Tmax)) - (mu*Im*T3) dT4 <- (gamma*T3)*(1-(T3/Tmax)) - 1*exp((k/theta)*(1-exp(-theta*t))) - (alpha*T4)*(1-(T4/Tmax)) - (mu*Im*T4) dT5 <- (alpha*T4)*(1-(T4/Tmax)) - 1*exp((k/psi)*(1-exp(-psi*t))) - (mu*Im*T5) dIm <- (eta*Im)*(1-(Im/Imax)) + (rho*T*Im)/(epsilon+T) - (Xi*Im) - (tau*T*Im) # 返回导数列表 return(list(c(dT0, dT1, dT2, dT3, dT4, dT5, dIm))) }) } # 定义参数 parameters <- c(N=1.7*10^12,Tmax=1*10^9,Imax=800,T=1*10^6,phi = 0.0052,beta=0.003, gamma=0.045,alpha=0.055,Phi=0.0035,kappa=0.0025,k=0.500, eta=0.0206,epsilon=1000,tau=1*10^-8,Xi=4.12*10^-2,lam=0.02, omega=0.02, theta=0.04,psi=0.04,mu = 1*10^-8, rho=0.835) # 定义时间序列 times <- seq(0, 100, by = 0.4) # 定义初始状态 state <- c(T0=20,T1=1,T2=1,T3=1,T4=1,T5=1,Im=5) # 求解微分方程 out <- ode(y=state,times=times,func=Tumor.model,parms=parameters)
注:如果原微分方程中
Tx(0)对应的数值和你定义的初始值不一致,直接替换为对应数值即可。
内容的提问来源于stack exchange,提问作者Mashashamn
相关产品推荐
相关产品推荐

