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

使用deSolve报错:func返回导数数量与初始条件向量长度不匹配

解决deSolve中导数数量与初始条件长度不匹配的错误

错误原因分析

  • 你定义的ODE函数返回了5个导数(dCc、dCp、dy、dw、dg),但调用ode()时只传入了3个初始条件(y、w、g),两者数量不匹配,触发报错。
  • 额外问题:c_central和c_peripheral是有对应微分方程的状态变量,却被错误地放到了参数列表params中,导致计算时无法正确更新它们的数值。

修正步骤

  1. 补充初始条件,覆盖所有状态变量
    将c_central0和c_peripheral0加入初始条件向量,让状态变量总数与导数数量保持一致(共5个)。

  2. 清理参数列表
    从params中移除c_central和c_peripheral,因为它们是随时间变化的状态变量,而非固定参数。

  3. 对齐导数返回顺序与初始条件顺序
    确保返回的导数列表顺序和初始条件的变量顺序一一对应,避免变量映射混乱。

修正后的代码

library(deSolve)

# 定义ODE系统
diffeq <- function(t, y, params) {
  # 解构状态变量,避免命名冲突
  c_central <- y[1]
  c_peripheral <- y[2]
  y_val <- y[3]
  w <- y[4]
  g <- y[5]
  
  with(as.list(params), {
    dCc <- -k12 * c_central + k21 * c_peripheral - k10 * c_central
    dCp <- k12 * c_central - k21 * c_peripheral
    dy <- -alpha * exp(-beta * y_val) * y_val + (c_central - gamma)^2
    dw <- g * (t - delay) - kw * w
    dg <- ks * kw * w0 * (w/W0)^(-param) * exp(-u * y_val) - (ks + v * y_val) * g
    
    # 返回导数的顺序必须和初始条件的变量顺序一致
    return(list(c(dCc, dCp, dy, dw, dg)))
  })
}

# 设置初始条件和参数值
y0 <- 0
g0 <- 0
w0 <- 100
c_central0 <- 500/5
c_peripheral0 <- 0

# 参数列表移除状态变量c_central和c_peripheral
params <- c(alpha = 1, beta = 2, gamma = 3, kw = 0.1, k12 = 1.2, 
            k21 = 1.5, k10 = 0.04, ks = 0.01, delay = 0.5, 
            W0 = 100, param = 2, u = 1, v = 2)

# 初始条件包含所有5个状态变量,顺序与ODE中解构的顺序对应
y_init <- c(c_central = c_central0, c_peripheral = c_peripheral0, y = y0, w = w0, g = g0)

# 求解ODE
result <- ode(y = y_init, times = seq(0, 40, by = 0.1), func = diffeq, parms = params)

# 绘图(可按需添加c_central和c_peripheral的曲线)
plot(result[, "time"], result[, "y"], type = "l", xlab = "时间 (t)", ylab = "变量值")
lines(result[, "time"], result[, "w"], col = "red")
lines(result[, "time"], result[, "g"], col = "blue")
lines(result[, "time"], result[, "c_central"], col = "green")
lines(result[, "time"], result[, "c_peripheral"], col = "purple")
legend("topright", legend = c("y", "w", "g", "c_central", "c_peripheral"), 
       col = c("black", "red", "blue", "green", "purple"), lty = 1)

额外说明

  • 代码中单独解构状态变量,避免了原代码中y既是状态变量名又是局部变量名的冲突问题。
  • 将(c_central - gamma) * (c_central - gamma)简化为(c_central - gamma)^2,功能一致且代码更简洁。

内容的提问来源于stack exchange,提问作者Ravua1992

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:00:38