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

Python绘制双微分方程系统遇ValueError,求报错排查与绘图实现

解决癌症多倍体细胞发育模型微分方程绘图的ValueError问题

你的代码存在多处结构、语法和逻辑错误,导致了ValueError: diff requires input that is at least one dimensional错误,以下是问题分析和修正后的完整代码:

核心问题梳理

  • 耦合方程拆分错误:C和P是相互依赖的耦合变量,不能拆成两个独立函数分别求解,必须放在同一个模型函数中统一处理。
  • 语法与缩进错误:modelC、modelP函数无返回值,后续微分方程计算代码缩进错误,导致变量未定义。
  • 数学表达式错误:乘法运算符缺失(如P(1-...)被解析为函数调用,实际应为P*(1-...)),引发维度不匹配。
  • 积分调用错误:odeint的参数顺序错误(正确顺序为odeint(模型函数, 初始值数组, 时间序列)),且分开求解耦合变量不符合逻辑。
  • 绘图逻辑错误:绘制的是初始值的对数,而非随时间变化的计算结果,且P0=0时log10(0)会触发报错。

修正后的完整代码

# 癌症多倍体细胞发育模型
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# 定义耦合微分方程组
def model(y, t):
    C, P = y  # 解包当前时刻的C和P数值
    λc = 0.0601 
    K = 2000 
    α = 1e-4 
    ν = 1e-6 
    λp = 0.1 
    γ = 2
    
    # 修正乘法运算符,正确书写微分方程
    dCdt = λc * C * (1 - (C + γ*P)/K) - α*C + ν*P
    dPdt = λp * P * (1 - (C + γ*P)/K) + α*C
    return [dCdt, dPdt]

# 初始条件:[C初始值, P初始值]
y0 = [256, 0]

# 生成时间点(增加点数让曲线更平滑)
t = np.linspace(0, 30, 100)

# 求解微分方程组
solution = odeint(model, y0, t)
C = solution[:, 0]  # 提取C的时间序列
P = solution[:, 1]  # 提取P的时间序列

# 绘图:给P添加极小值避免log10(0)报错
plt.plot(t, np.log10(C), label='C(t)(log10尺度)')
plt.plot(t, np.log10(P + 1e-10), label='P(t)(log10尺度)')

plt.xlabel('时间(天)')
plt.ylabel('细胞数量(log10)')
plt.legend()
plt.show()

关键修改说明

  1. 合并模型函数:将两个耦合方程放入同一个model函数,接收包含C和P的数组,返回对应的导数数组,符合odeint的要求。
  2. 修正语法错误:补全乘法运算符,调整代码缩进,确保所有计算逻辑在函数作用域内。
  3. 正确调用积分工具:传入合并的初始条件数组,一次性求解所有变量,再从结果中提取C和P的时间序列。
  4. 修复绘图逻辑:使用计算得到的随时间变化的C(t)和P(t)绘图,给P添加极小值避免对数运算报错,添加图例提升可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:36:20