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()
关键修改说明
- 合并模型函数:将两个耦合方程放入同一个
model函数,接收包含C和P的数组,返回对应的导数数组,符合odeint的要求。 - 修正语法错误:补全乘法运算符,调整代码缩进,确保所有计算逻辑在函数作用域内。
- 正确调用积分工具:传入合并的初始条件数组,一次性求解所有变量,再从结果中提取C和P的时间序列。
- 修复绘图逻辑:使用计算得到的随时间变化的C(t)和P(t)绘图,给P添加极小值避免对数运算报错,添加图例提升可读性。
内容的提问来源于stack exchange,提问作者Caitlin Garrett
相关产品推荐
相关产品推荐

