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

如何基于随机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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:15:04