You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:15:07