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

如何用Matplotlib绘制起始时间不同的两条曲线

问题解决:调整干预曲线的起始时间至500处

要实现红色干预曲线从时间500开始,需基于无干预模型在t=500时的状态作为干预模型的初始条件,而非使用初始的U0、I0等值,同时调整红色曲线的时间轴范围。以下是具体修改步骤和代码:

修改思路

  • 将时间轴拆分为两段:t1(0到500)用于计算无干预模型的演化,t2(500到1000)用于计算干预模型的演化
  • 提取无干预模型在t=500时的状态,作为干预模型的初始输入
  • 分别计算两段模型的积分结果,再对应绘制曲线

修改后的完整代码

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# Total population, N.
N = 1
# Initial number of infected and recovered individuals, I0 and R0.
I0, R0 = 0.001, 0
# Everyone else, S0, is susceptible to infection initially.
U0 = N - I0 - R0
J0 = I0
Lf0, Ls0 = 0, 0
# Contact rate, beta, and mean recovery rate, gamma, (in 1/days).
beta, gamma = 8, 0.4
int_gamma = 0.8
mu, muTB, sigma, rho = 1/80, 1/6, 1/6, 0.03
u, v, w = 0.88, 0.083, 0.0006

# 拆分时间轴:第一段0-500,第二段500-1000
t1 = np.linspace(0, 500, 500 + 1)
t2 = np.linspace(500, 1000, 500 + 1)

# 无干预模型微分方程
def deriv(y, t, N, beta, gamma, mu, muTB, sigma, rho, u, v, w):
    U, Lf, Ls, I, R, cInc = y
    b = (mu * (U + Lf + Ls + R)) + (muTB * I)
    lamda = beta * I
    clamda = 0.2 * lamda
    dU = b - ((lamda + mu) * U)
    dLf = (lamda*U) + ((clamda)*(Ls + R)) - ((u + v + mu) * Lf)
    dLs = (u * Lf) - ((w + clamda + mu) * Ls)
    dI = w*Ls + v*Lf - ((gamma + muTB + sigma) * I) + (rho * R)
    dR = ((gamma + sigma) * I) - ((rho + clamda + mu) * R)
    cI = w*Ls + v*Lf + (rho * R)
    return dU, dLf, dLs, dI, dR, cI

# 计算无干预模型到t=500的结果
solve = odeint(deriv, (U0, Lf0, Ls0, I0, R0, J0), t1, args=(N, beta, gamma, mu, muTB, sigma, rho, u, v, w))
U, Lf, Ls, I, R, cInc = solve.T

# 获取t=500时的状态,作为干预模型的初始条件
initial_int_state = solve[-1]

# 干预模型微分方程
def derivint(y, t, N, beta, int_gamma, mu, muTB, sigma, rho, u, v, w):
    U, Lf, Ls, I, R, cInc = y
    b = (mu * (U + Lf + Ls + R)) + (muTB * I)
    lamda = beta * I
    clamda = 0.2 * lamda
    dU = b - ((lamda + mu) * U)
    dLf = (lamda*U) + ((clamda)*(Ls + R)) - ((u + v + mu) * Lf)
    dLs = (u * Lf) - ((w + clamda + mu) * Ls)
    dI = w*Ls + v*Lf - ((int_gamma + muTB + sigma) * I) + (rho * R)
    dR = ((int_gamma + sigma) * I) - ((rho + clamda + mu) * R)
    cI = w*Ls + v*Lf + (rho * R)
    return dU, dLf, dLs, dI, dR, cI

# 基于t=500的状态计算干预模型在500-1000的结果
solveint = odeint(derivint, initial_int_state, t2, args=(N, beta, int_gamma, mu, muTB, sigma, rho, u, v, w))
Uint, Lfint, Lsint, Iint, Rint, cIncint = solveint.T

# 计算差分
J_diff = cInc[1:] - cInc[:-1]
J_diffint = cIncint[1:] - cIncint[:-1]

# 绘图
fig = plt.figure(facecolor='w')
ax = fig.add_subplot(111, facecolor='#dddddd', axisbelow=True)
# 绘制无干预曲线(0-500)
ax.plot(t1[1:], J_diff*100000, 'blue', alpha=1, lw=2, label='incidence')
# 绘制干预曲线(500-1000)
ax.plot(t2[1:], J_diffint*100000, 'red', alpha=1, lw=2, label='intervention incidence')

ax.set_xlabel('Time in years')
ax.set_ylabel('Number')
ax.grid(b=True, which='major', c='w', lw=2, ls='-')
legend = ax.legend()
legend.get_frame().set_alpha(0.5)
plt.show()

说明

  • 红色曲线现在从时间500开始,并且继承了无干预模型在该时间点的所有状态,符合“平稳状态后开始干预”的需求
  • 两段时间轴的长度均为500个时间单位,和需求一致

内容的提问来源于stack exchange,提问作者Landon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:55:35