Python求解绘制微分方程搭建病毒模型的语法错误求助
病毒传播微分方程Python代码报错修复
问题定位
你遇到的倒数第四行语法错误,以及代码逻辑层面的问题共5处:
- 直接触发语法报错的原因:
odeint调用语句末尾缺失闭合右括号 odeint参数顺序错误:该函数固定传参顺序为odeint(微分方程函数, 初始状态向量, 时间点数组, 其他参数),你代码里把时间数组t和初始值的位置写反了- 微分方程模型的参数顺序不符合接口要求:
odeint要求传入的模型函数,第一个参数为状态变量向量,第二个参数为时间t,后续才是通过args传入的自定义参数;你写的模型参数顺序完全不符合接口规范 - 初始值缺失:你的模型是包含T(未感染细胞)、I(感染细胞)、V(病毒载量)三个变量的三维方程组,不能只传入V0一个初始值,需要把三个变量的初始值组成数组传入
- 微分方程公式笔误:未感染细胞的变化率
dTdt你写的是-β*t*V,正确应为-β*T*V,乘以的是当前未感染细胞浓度T而非时间t
修正后可运行代码
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # 定义微分方程模型,参数顺序严格符合odeint要求:状态向量y, 时间t, 其他固定参数 def model(y, t, β, δ, p, c): T, I, V = y # 从状态向量中拆分三个变量 dTdt = -β * T * V dIdt = β * T * V - δ * I dVdt = p * I - c * V return [dTdt, dIdt, dVdt] # 模型固定参数 β = 10**-5 δ = 4 p = 2*(10**6) c = 4 # 初始条件:[T0, I0, V0] y0 = [1, 0, 10**-3] # 时间点 t = np.linspace(0, 25, 100) # 求解ODE,参数顺序正确,补全闭合括号 y = odeint(model, y0, t, args=(β, δ, p, c)) V = y[:, 2] # 从求解结果中提取病毒载量V的序列 # 绘图 plt.plot(t, V) plt.xlabel('time') plt.ylabel('V(t)') plt.show()
补充说明
运行修正后的代码即可得到25个时间单位内的病毒载量变化曲线,如果需要同时绘制T、I、V三个变量的变化,直接从解出的y数组中按列提取对应变量即可。
内容的提问来源于stack exchange,提问作者Caitlin Garrett
相关产品推荐
相关产品推荐

