SIR python模型中的可变参数



我正在使用python中SIR模型的改编来模拟流感大流行。我的模型包括疫苗接种计划,因此我有一个代表疫苗接种率的参数(ε(。我需要epsilon在不同的时间间隔之间变化。下面是我当前的代码。

def epsilon(t):
return 0.74 if t < 77 else 0.09
epsilon_result = epsilon(t)

# A grid of time points (in days)
t = np.linspace(0, 182, 182)
# The SIR model differential equations.
def deriv(y, t, N, beta_s, beta_v, kapa, tau, epsilon_result, gamma, alpha, nu, detla_s, delta_v, p, q):
S, E_s, V, E_v, I, A, R_i, R_v = y
dSdt = - beta_s * S * I / N - beta_s * S * delta_s * A / N - epsilon * S
dVdt = epsilon_result * S - beta_v * V * I / N - beta_v * V * delta_v * A / N - gamma * V * R_v / N
dE_sdt = beta_s * V * I / N + beta_s * S * delta_s * A / N - kapa * E_s
dE_vdt = beta_v * V * I / N + beta_v * A / N - kapa * E_s 
dIdt = p * kapa * E_v - alpha * I + q * tau * E_v
dAdt = (1-p) * kapa * E_v - nu * A + (1-q) * tau * E_v
dR_idt = alpha * I + nu * A
dR_vdt = gamma * V * R_v / N
return dSdt, dE_sdt, dVdt, dE_vdt, dIdt, dAdt, dR_idt, dR_vdt
# Initial conditions vector
y0 = S0, E_s0, V0, E_v0, I0, A0, R_i0, R_v0
# Integrate the SIR equations over the time grid, t.
ret = odeint(deriv, y0, t, args=(N, beta_s, beta_v, kapa, tau, epsilon_result, gamma, alpha, nu, delta_s, delta_v, p, q))
S, E_s, V, E_v, I, A, R_i, R_v = ret.T

这就是我犯的错误。

ValueError                                Traceback (most recent call last)
<ipython-input-11-b43444e01f4c> in <module>
32     return 0.74 if t < 77 else 0.09
33 
---> 34 epsilon_result = epsilon(t)
35 
36 # A grid of time points (in days)
<ipython-input-11-b43444e01f4c> in epsilon(t)
30 
31 def epsilon(t):
---> 32     return 0.74 if t < 77 else 0.09
33 
34 epsilon_result = epsilon(t)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

您有一个时间数组t,它挂在上一次失败的脚本运行中。使用干净的工作区,您会得到未定义t的错误。错误正是它所说的,您将数组传递给无法在数组模式下工作的函数。

但你真正想要的是一些不同的东西,可以避免任何立即的解决方案:

# The SIR model differential equations.
def deriv(y, t, N, beta_s, beta_v, kapa, tau, epsilon, gamma, alpha, nu, detla_s, delta_v, p, q):
S, E_s, V, E_v, I, A, R_i, R_v = y
#<<<--- inserted here
epsilon_result = epsilon(t)
#>>>---
dSdt = - beta_s * S * I / N - beta_s * S * delta_s * A / N - epsilon * S
...

通过这种方式,函数epsilon总是只使用标量t来调用,以便其内容按预期工作。

最新更新