如何基于随机beta参数列表求解ODE并批量绘制曲线到同一画布
问题诊断与修复方案
你代码的问题集中在三处:
- 未导入
random模块,生成随机beta值的代码会直接触发模块不存在报错 - 调用
odeint时args参数传参错误,你传入了整个beta列表empty,而非当前遍历到的单个beta值,导致参数维度不匹配无法正确求解 - 缺少批量求解后逐组绘制曲线的逻辑
完整可运行代码
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt import random # 固定公共参数 N = 1000 I0, R0 = 1, 0 S0 = N - I0 - R0 J0 = I0 gamma = 1/7 t = np.linspace(0, 160, 160+1) # ODE求解函数 def deriv(y, t, N, beta, gamma): S, I, R, J = y dS = ((-beta * S * I) / N) dI = ((beta * S * I) / N) - (gamma * I) dR = (gamma * I) dJ = ((beta * S * I) / N) return dS, dI, dR, dJ # 生成100个1.5~2.5倍gamma的随机beta值 beta_list = [random.uniform(1.5, 2.5)*gamma for _ in range(100)] # 初始化画布 fig = plt.figure(facecolor='w') ax = fig.add_subplot(111, facecolor='#dddddd', axisbelow=True) # 遍历每个beta求解+绘图 for beta_val in beta_list: solve = odeint(deriv, (S0, I0, R0, J0), t, args=(N, beta_val, gamma)) J = solve.T[3] J_diff = np.diff(J) # 调低透明度避免曲线堆叠看不清,线宽适当调细 ax.plot(t[1:], J_diff, 'blue', alpha=0.3, lw=1.5) # 画布样式设置 ax.set_xlabel('Time in days') ax.set_ylabel('Number (1000s)') ax.grid(visible=True, which='major', c='w', lw=2, ls='-') # 单条示例线用于图例展示 ax.plot([], [], 'blue', alpha=1, lw=2, label='Daily incidence (random beta)') legend = ax.legend() legend.get_frame().set_alpha(0.5) plt.show()
运行代码后即可得到100组随机beta参数对应的日发病率曲线,半透明叠加的效果可以直观看到参数波动带来的结果分布区间。
内容的提问来源于stack exchange,提问作者Landon
相关产品推荐
相关产品推荐

