Python odeint求解微分方程:多k2值单函数实现及报错修复
报错根因
原代码抛出类型错误的核心问题有两点:
- 微分方程函数内部将
k2硬编码为列表[3,6,9],计算微分项时直接用numpy浮点数乘以列表,Python不支持该类运算 - 函数内的for循环在第一次迭代就触发return,完全无法遍历三个参数完成多组模拟,逻辑不符合预期
修正方案
无需重复编写3次相同的微分方程函数,只需将k2设为微分方程函数的额外入参,调用odeint求解时通过args参数传入当前k2取值,循环遍历3个参数值分别求解即可,修正后可直接运行的代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint # 微分方程仅定义1次,k2作为动态传入参数 def F(Y, t, k2): T1 = 15 p1 = 15 p2 = 4 dS = -p1*Y[1]*Y[0] - p2*Y[2]*Y[0] dI1 = p1*Y[1]*Y[0] - Y[1]*(1/T1) dI2 = p2*Y[2]*Y[0] - Y[2]*(1/T1) + p2*k2*Y[2]*Y[1]*(1/T1) return np.array([dS, dI1, dI2]) T = np.linspace(0, 140, 100) init_cond = [0.8, 0.01, 10**-7] k2_values = [3, 6, 9] sim_results = [] # 遍历3个k2取值分别求解 for k2 in k2_values: Y = odeint(F, np.array(init_cond), T, args=(k2,)) sim_results.append(Y[:, 2]) # 绘制3条对应曲线 for idx, y2_curve in enumerate(sim_results): plt.plot(T, y2_curve, label=f'k2={k2_values[idx]}') plt.legend() plt.grid() plt.xlabel('Temps en jours ') plt.ylabel('占比(变体2)') plt.title("双变体传播过程模拟") plt.show()
关键改动说明
- 移除F函数内部硬编码的k2列表,将k2设为函数入参,计算时使用传入的单个数值,从根源解决浮点数乘列表的类型错误
- 利用
odeint的args参数动态传入不同k2值,全程只需要定义1次微分方程逻辑,无冗余代码 - 修正原代码图例和实际绘图不匹配的问题,每条曲线标注对应k2取值,结果可读性更强
内容的提问来源于stack exchange,提问作者lilou
相关产品推荐
相关产品推荐

