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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:39:15